【发布时间】:2018-10-07 09:14:33
【问题描述】:
我想将公钥及其算法保存在 SSL 证书消息中。
在 OpenSSL 库中,我找到了一个名为 public_key_type 的函数,它返回公钥算法。但是为了提取公钥,我发现了一个名为 evp_PKEY_print_public 的函数,它打印公钥。但我不想打印它。我的目标是将它保存在一个结构中。 谁能帮帮我?
【问题讨论】:
标签: openssl ssl-certificate public-key
我想将公钥及其算法保存在 SSL 证书消息中。
在 OpenSSL 库中,我找到了一个名为 public_key_type 的函数,它返回公钥算法。但是为了提取公钥,我发现了一个名为 evp_PKEY_print_public 的函数,它打印公钥。但我不想打印它。我的目标是将它保存在一个结构中。 谁能帮帮我?
【问题讨论】:
标签: openssl ssl-certificate public-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);
更多信息请参见the documentation of X509_get_pubkey()。
现在您有了这个通用公钥,您可以使用its lower-level key accessors 来访问其特定格式的基础公钥。例如:
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()它。
同样,如果您需要 EC 密钥,您可以使用 EVP_PKEY_get1_EC_KEY()。
【讨论】: