[英]How to get PEM encoded X509 certificate as C++ string using openssl?
我有一個帶有自簽名證書的 openssl X509 結構。 我需要從這個結構中獲取 PEM 格式的 C++ 字符串。 我需要使用哪些 openssl API 來實現這一目標?
我嘗試遵循https://www.codeblog.org/gonzui/markup/openssl-0.9.8a/demos/x509/mkcert.c 上的示例程序。 該程序展示了一種將 PEM 格式的證書寫入文件的方法。 如果沒有其他方法,我可以將此文件的內容讀入 C++ 字符串。
我有一個帶有自簽名證書的 openssl X509 結構。 我需要從這個結構中獲取 PEM 格式的 C++ 字符串。
以下內容應該適合您。 它顯示了您需要執行此操作的 API(沒有填充證書字段的代碼)。
#include <iostream>
#include <memory>
#include <string>
using std::cout;
using std::cerr;
using std::endl;
using std::string;
using std::unique_ptr;
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/x509.h>
using X509_ptr = std::unique_ptr<X509, decltype(&::X509_free)>;
using BIO_MEM_ptr = std::unique_ptr<BIO, decltype(&::BIO_free)>;
int main(int argc, char* argv[])
{
int rc = 0;
unsigned long err = 0;
X509_ptr x509(X509_new(), ::X509_free);
/* ... */
BIO_MEM_ptr bio(BIO_new(BIO_s_mem()), ::BIO_free);
rc = PEM_write_bio_X509(bio.get(), x509.get());
err = ERR_get_error();
if (rc != 1)
{
cerr << "PEM_write_bio_X509 failed, error " << err << ", ";
cerr << std::hex << "0x" << err;
exit(1);
}
BUF_MEM *mem = NULL;
BIO_get_mem_ptr(bio.get(), &mem);
err = ERR_get_error();
if (!mem || !mem->data || !mem->length)
{
cerr << "BIO_get_mem_ptr failed, error " << err << ", ";
cerr << std::hex << "0x" << err;
exit(2);
}
string pem(mem->data, mem->length);
cout << pem << endl;
return 0;
}
編譯如下:
g++ -g -O -std=c++11 x509.cpp -o x509.exe \
-I/usr/local/ssl/include \
/usr/local/ssl/lib/libcrypto.a -ldl
典型的輸出是:
$ ./x509.exe
-----BEGIN CERTIFICATE-----
MCYwHAIBADADBgEAMAAwBB8AHwAwADAIMAMGAQADAQAwAwYBAAMBAA==
-----END CERTIFICATE-----
查看 openssl x509 命令的源代碼,看看它如何執行讀取 DER 編碼文件並寫入 PEM 的操作 - 即:
openssl x509 -in mycert.der -inform DER -out mycert.pem
cli utils 的代碼很容易理解
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.