从证书中提取公共证书

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)

有人有更好的方法吗?

jww*_*jww 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);
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.

get1EVP_PKEY_get1_RSA指钥匙上的引用计数碰撞.所以你必须打电话给*_free它.一个get0没有碰的引用计数,并不需要一个电话*_free.