从证书中提取公共证书

时间:2014-03-25 09:10:51

标签: c openssl certificate

我想以编程方式生成一个仅使用openssl包含公钥的证书。

所以我基本上需要做以下但是使用代码。

openssl x509 -in certificate.crt -pubkey

有点似乎我需要创建一个新证书并复制除私钥之外的所有信息。

X509 * pNewKey = X509_new();
... Copy all the needed information ...

PEM_write_bio_X509(bioKey, &pNewKey, NULL, NULL);

有人有更好的方法吗?

1 个答案:

答案 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表示密钥上的引用计数已被提升。所以你必须打电话给*_freeget0 不会提高引用次数,也不需要调用*_free