使用 OpenSSL 命令行工具,创建有效证书的标准模式是使用
openssl req
生成证书签名请求,然后与颁发者签署以创建带有 openssl x509
的证书。像这样:
openssl req -new -key privatekey.pem -subj '/CN=examplehost.exampledomain.com' -out examplehost.csr
openssl x509 -req -in examplehost.csr -days 365 -sha256 -CA issuer.pem -CAkey issuer_priv.key -CAserial serial.file -out examplehost.pem
在我为 C API 找到的示例中,模式似乎是使用
X509_new()
来实例化一个空白的 X509 对象,然后使用各种方法在 X509 对象中手动填写元数据和密钥。之后,X509_sign()
用于使用发行者私钥对其进行签名。
我还没有找到任何使用
X509_REQ
作为创建证书的输入的示例,即使使用 C API 也是可能的。这是正确的阅读吗?或者在这个 API 中是否有一些调用将证书链接到 CSR,而不仅仅是手动复制字段?
如果你查看 OpenSSL C 客户端的源代码,它会使用以下逻辑手动复制字段(当前 OpeNSSL 源代码中的相应位置已链接):
X509_REQ_get0_pubkey
提取公钥。官方没有直接在API中做这种操作的单一例程。但是,如果您这样做是为了实现类似 CA 的功能, 被认为是实际手动复制值的最佳实践,以便您可以完全控制生成的证书包含的内容。例如,您可能希望限制本身是 CA 的证书的生成,并且仅在您明确需要子 CA 的情况下才这样做。 (X509v3 扩展可以用来表示这一点。)
也就是说,我希望命令行实用程序源代码的链接有助于告诉您需要执行哪些操作才能使用 OpenSSL 的 C API 签署 CSR。
最后:有一个名为
X509_REQ_to_X509()
的未记录的函数可以自动签署 CSR。 不要使用它,因为它不支持大多数现代证书功能(它只会复制一些东西)并且它仍然使用损坏的 MD5(!)算法进行签名。 (还记得 SHA-1 不再被普遍接受吗?)另外,由于该函数没有记录,因此无法保证该例程将来会在 OpenSSL 中保留多长时间。我只是为了完整性而提到它并警告不要使用它。