【问题标题】:How to save public key in SSL certificate messages using OpenSsl?如何使用 OpenSsl 在 SSL 证书消息中保存公钥?
【发布时间】:2018-10-07 09:14:33
【问题描述】:

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

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

【问题讨论】:

    标签: openssl ssl-certificate public-key


    【解决方案1】:

    根据您的问题,我并不完全清楚您所说的“将其保存在结构中”是什么意思。但是我可以解释如何访问存储在证书中的实际公钥,以便您可以使用它做任何您想做的事情。

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

    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()

    【讨论】:

    • 感谢您的回答。你能写一个使用 EVP_PKEY_get1_RSA() 函数后如何访问模块和指数的例子吗?似乎 RSA_get0_key() 在 openssl/rsa.h 库中不存在。
    • @Saeed:你使用的是什么版本的 OpenSSL?
    • 我使用的是 OpenSSL 1.0.1。
    • @Saeed 我在旧 OpenSSL 版本的答案中添加了一些说明。如果这不足以解决您的问题,您将不得不提供更多关于您要达到的目标的信息,可能是在不同的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多