OpenSSL X509 证书到字符串
OpenSSL X509 certificate to string
我正在使用以下代码(稍微简化)从 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 获取它作为一个没有 header 行的字符串?类似于:
MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
有两个 OpenSSL 函数可以帮助您实现这一点
PEM_read_bio() 可以读取您的 PEM-formatted 证书文件(或任何 PEM-formatted 文件)并将其拆分为 header 和数据。
你随后感兴趣的是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
我正在使用以下代码(稍微简化)从 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 获取它作为一个没有 header 行的字符串?类似于:
MIIFLTCCAxUCCQDrAnFYOmsVkzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
有两个 OpenSSL 函数可以帮助您实现这一点
PEM_read_bio() 可以读取您的 PEM-formatted 证书文件(或任何 PEM-formatted 文件)并将其拆分为 header 和数据。
你随后感兴趣的是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