我想以编程方式生成一个仅使用openssl包含公钥的证书。
所以我基本上需要做以下但是使用代码。
openssl x509 -in certificate.crt -pubkey
有点似乎我需要创建一个新证书并复制除私钥之外的所有信息。
X509 * pNewKey = X509_new();
... Copy all the needed information ...
PEM_write_bio_X509(bioKey, &pNewKey, NULL, NULL);
有人有更好的方法吗?
答案 0 :(得分:5)
我想以编程方式生成仅包含公钥的证书
要设置公钥,请使用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
好的,这是一个不同的问题。上面的命令将打印公钥。
使用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
中的EVP_PKEY_get1_RSA
表示密钥上的引用计数已被提升。所以你必须打电话给*_free
。 get0
不会提高引用次数,也不需要调用*_free
。