【问题标题】:Create x509 chain with c++ openssl lib使用 c++ openssl lib 创建 x509 链
【发布时间】:2020-08-12 06:44:12
【问题描述】:

我有 clientCA.key 和 clientCA.crt - 中间私钥和证书。 现在,我在命令行生成端点私钥和证书请求:

openssl req -new -nodes -newkey rsa:2048 -keyout clientEP.key -out clientEP.csr \ -subj "/C=CA/ST=AAA/L=BBB/O=CCC/OU=DDD/CN=EEE/emailAddress=m@m"

然后通过中间CA证书和密钥签名制作端点证书:

openssl x509 -req -CAkey clientCA.key -CA clientCA.crt -days 365 -in clientEP.csr -out clientEP.crt -set_serial 25 -extfile clientEP.cnf

生成 RSA 密钥和请求很容易: RSA_generate_key_ex(keys, 2048,e, NULL); X509_REQ_new();

但是如何获取由 clientCA.key 和 clientCA.crt 签名的请求并将 clientEP.crt 与 C++ Openssl 库一起使用?也许可以在没有请求的情况下从此文件生成端点证书?

【问题讨论】:

    标签: c++ openssl x509


    【解决方案1】:

    Openssl 提供了各种功能,您可以使用它们。 最好搜索更多或访问 openssl org。 并仔细阅读每个功能的说明。

    你可以像在 linux 上那样做(也许),

    1. 为最终实体证书创建 PrivateKey。
         EVP_PKEY *pkey = EVP_PKEY_new(void);
    

    见:https://www.openssl.org/docs/man1.1.0/man3/EVP_PKEY_new.html

    1. 创建 RSA 并将其设置为 PrivateKey
        RSA *rsa = RSA_generate_key(1024, 3, 0, 0);
        EVP_PKEY_set1_RSA(pkey, RSA *key);
    

    另见https://www.openssl.org/docs/manmaster/man3/EVP_PKEY_set1_RSA.html

    1. 创建 X509
        X509 *cert = X509_new(void);
    
    1. 设置 pubkey(对应的 key 为较早的私钥)
        X509_set_pubkey(cert, pkey);
    
    1. 使用 cliendCA 的私钥对 clientEP 进行签名。
        X509_sign(cert, pkey, 0); // third param is a hashing option.
    
    1. 设置证书的具体配置文件。(我可能会错过一些具体步骤,但你可以做到)

    当你更多地搜索它时,你可能会得到这些信息。 另外openssl提供了BIO_write或PEM_write_X509等写api。

    希望对你有所帮助。

    【讨论】:

    • 谢谢!我做到了。没有证书请求。我还设置了 EndPoint 证书颁发者、主题和 x509v3 扩展所需的值(来自 CA 证书),所以我的 EP 证书看起来像命令行生成的证书。但它不起作用。我认为是因为我没有使用这个:-CAkey clientCA.key
    • 我用 privCA=PEM_read_bio_PrivateKey(in, NULL, NULL, NULL) 读取了 clientCA 密钥,但是如果它被 DES(或其他)加密,我可以将它用于 X509_sign(x509, privCA, EVP_sha256()); 吗?
    • @lap108 ,最好分开。 PEM_read_bio_PrivateKey 正在将 Base64 编码的字符串转换为 EVP_PKEY *。因此,您不能使用X509_sign() api,因为PEM_read_bio_PrivateKey 不适用于des 编码格式。您需要使用一个处理des格式的api(实际上是先解密它)。看看DES_ncbc_encrypt() link。请注意,您需要根据其格式调用不同的api。有时需要解密或解析。
    • 对不起,我有“节点”clientCA.key,它以-----BEGIN PRIVATE KEY----- 开头,PEM_read_bio_PrivateKey() 有正确的结果。我使用:1)生成密钥RSA_generate_key_ex(k,2048,e,NULL),EVP_PKEY_assign_RSA(pkey,k); 2) 用X509_NAME_add_entry_by_txt() 填写主题和发行人。还有时间、序列号、版本、扩展(-CA clientCA.crt 的实现是否足够?); 3) 设置公钥并签名X509_set_pubkey(x, pkey), X509_sign(x, clientCA,EVP_sha256())。但它不适用于服务器(
    • 如果证书链创建正确,它应该可以在本地和服务器上工作。请检查您是否创建了正确的证书链,包括根证书。然后在服务器上执行此操作(tls 握手)之前,请在您的本地没有服务器的情况下执行此操作。在 linux 上使用命令openssl verify 或参考它x509 verify cert
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多