使用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?
1条答案
按热度按时间hc2pp10m1#
如果查看OpenSSL C客户端的源代码,它将使用以下逻辑手动复制字段(链接当前OpeNSSL源代码中的相应位置):
1.它加载CSR(格式无关加载程序的实现)并通过
X509_REQ_get0_pubkey
提取公钥。1.然后,它将CSR的扩展复制到一个新证书中(扩展复制例程的实现)。(注意,扩展包括主题替代名称等)
1.它将使用者名称和CSR的公钥复制到证书中。
1.如果正在使用CA,则它加载新的证书序列号(文件加载器例程的实现),然后将该序列号应用于证书。
1.它将颁发者名称设置为CA的名称(如果是自签名的,则设置为CA本身)。
1.设置证书的不早于/不晚于日期。(子例程实现)
1.它初始化证书的X509 v3上下文。
1.它签署证书(子例程的实现)。
1.最后,它写出证书+向用户显示一些信息。
API中没有直接执行此类操作的官方例程。但是,如果您这样做是为了实现类似CA的功能,则***最佳做法是实际手动复制值,以便您可以完全控制生成的证书所包含的内容。例如,您可能希望限制生成本身就是CA的证书,并且仅在明确需要子CA的情况下才这样做。(X509 v3扩展名可用于指示这一点。
也就是说,我希望指向命令行实用程序源代码的链接有助于告诉您使用OpenSSL的C API签署CSR需要自己执行哪些类型的操作。
最后:有一个名为
X509_REQ_to_X509()
的未公开函数,它可以自动签署CSR。请勿使用它,因为它不支持大多数现代证书功能(它只复制了一些东西),它仍然使用损坏的MD5(!)算法进行签名。(还记得SHA-1不再被普遍接受吗?)另外,由于该函数没有文档化,因此不能保证该例程在将来仍将是OpenSSL一部分多长时间,我只是出于完整性考虑才提到它,并警告不要使用它。