2011-07-29 8 views
2

私は自己署名入りの証明書を持つopenssl X509構造を持っています。この構造体からPEM形式のC++文字列を取得する必要があります。これを達成するために必要なopenssl APIとは何ですか?opensslを使用してPEMエンコードされたX509証明書をC++文字列として取得する方法は?

https://www.codeblog.org/gonzui/markup/openssl-0.9.8a/demos/x509/mkcert.cのサンプルプログラムを試してみました。このプログラムは、証明書をPEM形式でファイルに書き込む方法を示しています。私はこのファイルの内容を他の方法がない場合はC++文字列に読み込むことができます。 opensslのx509コマンドのソースの

答えて

-1

外観と、それはDERエンコードされたファイルを読み取るための操作を行い、PEM 1を書き込む方法を参照して - すなわち:

openssl x509 -in mycert.der -inform DER -out mycert.pem 

CLI utilsののコードは非常に簡単です追従する

+0

あなたが提案し、彼らが書くことPEM_write_bio_X509機能を使用することがわかったとして、私はx509.cコードを見てPEM形式のデータ。私はこのデータをBIO_readを使ってchar配列に読み込んでいます。ありがとう。 – jobless

6

私は自己署名入り証明書を持つ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----- 
関連する問題