2011-07-29 6 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++ 문자열로 읽을 수 있습니다.

답변

-1

에는 OpenSSL X509 명령의 소스에서 모양과 그것이 DER 인코딩 된 파일을 읽는 작업을 수행하고 PEM 하나의 기록 방법을 볼 - 예 :

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

는 CLI 유틸의 코드는 매우 간단을 따라야 만합니다.

+0

내가 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 

입니다

: 당신이 제안하고 그들이 쓰는 PEM_write_bio_X509 기능을 사용하는 것이 발견

$ ./x509.exe 
-----BEGIN CERTIFICATE----- 
MCYwHAIBADADBgEAMAAwBB8AHwAwADAIMAMGAQADAQAwAwYBAAMBAA== 
-----END CERTIFICATE-----