mat*_*thk 4 c openssl certificate
我想以编程方式生成一个使用openssl只包含公钥的证书.
所以我基本上需要做以下但使用代码.
openssl x509 -in certificate.crt -pubkey
Run Code Online (Sandbox Code Playgroud)
挖掘一下似乎我需要创建一个新证书并复制除私钥之外的所有信息.
X509 * pNewKey = X509_new();
... Copy all the needed information ...
PEM_write_bio_X509(bioKey, &pNewKey, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
有人有更好的方法吗?
我想以编程方式生成仅包含公钥的证书
要设置公钥,请采用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);
Run Code Online (Sandbox Code Playgroud)
为了完整起见,OpenSSL将保存没有属性,没有版本,没有公钥和没有签名的证书.
所以我基本上需要做以下但使用代码.
openssl x509 -in certificate.crt -pubkey
好的,这是一个不同的问题.上面的命令将打印公钥.
用途x509_get_pubkey:
EVP_PKEY* pkey = X509_get_pubkey(X509* x509);
Run Code Online (Sandbox Code Playgroud)
一旦你拥有了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);
}
Run Code Online (Sandbox Code Playgroud)
然后,根据类型,您可以打印密钥:
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);
}
...
Run Code Online (Sandbox Code Playgroud)
您必须按类型分解键,然后调用相应的键,XXX_print_fp因为OpenSSL不提供EVP_PKEY_print_fp.
将get1在EVP_PKEY_get1_RSA指钥匙上的引用计数碰撞.所以你必须打电话给*_free它.一个get0没有不碰的引用计数,并不需要一个电话*_free.