有没有办法在 OpenSSL C API 中签署完整的 CSR 以获得证书?

问题描述 投票:0回答:1

使用 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,而不仅仅是手动复制字段?

c openssl x509 csr
1个回答
0
投票

如果你查看 OpenSSL C 客户端的源代码,它会使用以下逻辑手动复制字段(当前 OpeNSSL 源代码中的相应位置已链接):

  1. 加载CSR与格式无关的加载程序的实现)并通过
    X509_REQ_get0_pubkey
    提取公钥。
  2. 然后 将 CSR 的扩展复制到新证书中扩展复制例程的实现)。 (请注意,扩展名包括主题替代名称等)
  3. 它将 CSR 的主题名称公钥复制到证书中。
  4. 如果使用 CA,它会加载一个新的证书序列号文件加载程序例程的实现),然后应用该序列号到证书。
  5. 它将发行者名称设置为CA的名称(如果是自签名的则设置为自身)。
  6. 它设置不早于/不晚于证书的dates。 (子程序实现
  7. 它初始化证书的X509v3上下文
  8. 签署证书子例程的实现)。
  9. 最后写出证书+向用户显示一些信息。

官方没有直接在API中做这种操作的单一例程。但是,如果您这样做是为了实现类似 CA 的功能, 被认为是实际手动复制值的最佳实践,以便您可以完全控制生成的证书包含的内容。例如,您可能希望限制本身是 CA 的证书的生成,并且仅在您明确需要子 CA 的情况下才这样做。 (X509v3 扩展可以用来表示这一点。)

也就是说,我希望命令行实用程序源代码的链接有助于告诉您需要执行哪些操作才能使用 OpenSSL 的 C API 签署 CSR。

最后:有一个名为

X509_REQ_to_X509()
的未记录的函数可以自动签署 CSR。 不要使用它,因为它不支持大多数现代证书功能(它只会复制一些东西)并且它仍然使用损坏的 MD5(!)算法进行签名。 (还记得 SHA-1 不再被普遍接受吗?)另外,由于该函数没有记录,因此无法保证该例程将来会在 OpenSSL 中保留多长时间。我只是为了完整性而提到它并警告不要使用它。

© www.soinside.com 2019 - 2024. All rights reserved.