我想以编程方式生成包含只有公钥
要设置公钥的证书,把你的公钥EVP_PKEY
格式,并呼吁X509_set_pubkey
。建立在你的示例代码:
X509* x509 = X509_new();
EVP_PKEY* pkey = /***/;
int rc = X509_set_pubkey(x509, pkey);
ASSERT(rc == 1);
BIO* bio = BIO_new_file("filename.txt", "w");
ASSERT(bio != NULL);
rc = PEM_write_bio_X509(bio, x509, NULL, NULL);
ASSERT(rc == 1);
...
BIO_free(bio);
EVP_PKEY_free(pkey);
X509_free(x509);
为了完整起见,OpenSSL的将保存的证书,没有属性,没有版本,不公钥,也没有签名。
所以我基本上需要做以下,但使用的代码。
OpenSSL的X509 -in certificate.crt -pubkey
OK,这是一个不同的问题。上述命令将打印公钥。
使用x509_get_pubkey
:
EVP_PKEY* pkey = X509_get_pubkey(X509* x509);
一旦你的EVP_PKEY
,你可以得到的类型。您需要提供此功能,因为OpenSSL的不提供它:
int EVP_PKEY_get_type(EVP_PKEY *pkey)
{
AC_ASSERT(pkey);
if (!pkey)
return NID_undef;
return EVP_PKEY_type(pkey->type);
}
然后,根据不同的类型,你可以打印键:
if(type == EVP_PKEY_RSA || type == EVP_PKEY_RSA2)
{
RSA* rsa = EVP_PKEY_get1_RSA(pkey);
RSA_print_fp(stdout, rsa, 0);
RSA_free(rsa);
}
...
你必须打破按类型键和然后分别拨打XXX_print_fp
,因为OpenSSL不提供EVP_PKEY_print_fp
。
get1
in EVP_PKEY_get1_RSA
表示该键上的引用计数被碰撞。所以你必须打电话给*_free
。 A get0
确实不是碰到引用计数,并且不需要调用*_free
。
来源
2014-03-25 11:31:26
jww
“从证书中提取公共证书” - 您的意思是写公钥吗?或者是其他东西? – jww