【问题标题】:OpenSSL X509 certificate to stringOpenSSL X509 证书到字符串
【发布时间】:2018-07-24 14:16:47
【问题描述】:

我正在使用以下代码(简化一点)从 X509 结构中获取证书字符串。基本上是 PEM_write_bio_X509 函数。

X509 *certificate...
....
BIO *bio = BIO_new(BIO_s_mem()), BIO_vfree);
if (!bio || !PEM_write_bio_X509(bio, certificate)) {
    // error handling
}
size_t keylen = BIO_pending(bio);
unique_ptr<char[]> key(new char[keylen]);
int len = BIO_read(bio, key.get(), (int)keylen);
if (len <= 0) {
    // error handling
}
string result = string(key.get(), len);

结果是正确的

-----BEGIN CERTIFICATE-----
MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJB
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
-----END CERTIFICATE-----

有没有什么办法(以后不用自己手动转换)直接从 OpenSSL 获取它作为一个没有标题行的行字符串?比如:

MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0

【问题讨论】:

    标签: header openssl certificate newline x509


    【解决方案1】:

    有两个 OpenSSL 函数可以帮助您实现这一目标

    PEM_read_bio() 可以读取您的 PEM 格式的证书文件(或任何 PEM 格式的文件)并将其拆分为标题和数据。

    您随后对data 指针中获得的内容感兴趣,该指针编码为长字符串中的base64。 EVP_EncodeBlock() 可以通过将这些内容作为其第二个参数来为您提供。

    您的代码的粗略轮廓:

    ret = PEM_read_bio(bio, &name, &header, &data, &len);
    if (!ret) {
        // error
    }
    
    // Make sure b64block is allocated to contain at least
    //     4*ceil(len/3) + 1 bytes
    blockLen = EVP_EncodeBlock(b64block, data, len);
    // b64block now contains the desired base64 in blockLen relevant bytes,
    //     plus a null-character
    
    // Don't forget to OPENSSL_free the name, header and data pointers
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多