首页 > 解决方案 > 如何使用 OpenSsl 在 SSL 证书消息中保存公钥?

问题描述

我想将公钥及其算法保存在 SSL 证书消息中。

在 OpenSSL 库中,我找到了一个名为 public_key_type 的函数,它返回公钥算法。但是为了提取公钥,我发现了一个名为 evp_PKEY_print_public 的函数,它打印公钥。但我不想打印它。我的目标是将它保存在一个结构中。任何人都可以帮助我吗?

标签: opensslssl-certificatepublic-key

解决方案


从您的问题来看,我并不完全清楚您所说的“将其保存在结构中”是什么意思。但我可以解释如何访问存储在证书中的实际公钥,这样你就可以用它做你想做的事。

首先,您可以使用以下内容以通用格式获取证书的公钥:

EVP_PKEY *pubkey = X509_get_pubkey(cert);
/* If it is not NULL, do what needs to be done with pubkey */
EVP_PKEY_free(pubkey);

有关更多信息,请参阅文档。X509_get_pubkey()

现在您有了这个通用公钥,您可以使用其较低级别的密钥访问器来访问其特定格式的基础公钥。例如:

RSA *rsapubkey = EVP_PKEY_get1_RSA(pubkey);
if (NULL != rsapubkey) {
    printf("This cert has an RSA public key\n");
    /* Do your stuff with the RSA key, for example using RSA_get0_key()
       for current versions of OpenSSL, or directly access the fields
       rsapubkey->n and rsapubkey->e for older versions */
    RSA_free(rsapubkey);
}

如果基础密钥不是 RSA 密钥,则该函数EVP_PKEY_get1_RSA()返回。NULL否则,您可以使用它来访问模数 ( n) 和指数 ( e),这基本上是您“保存”它所需的全部内容。或者您可以保留rsapubkey,因为它包含所有公钥信息。当你RSA_free()完成时,你必须这样做。

同样,EVP_PKEY_get1_EC_KEY()如果您期望 EC 密钥,您可以使用。


推荐阅读