使用 OpenSSL,是否可以生成、序列化并将证书保存到文件中而不对其进行签名(我的意思是证书,而不是 CSR),然后加载保存的 DER 或 PEM,对其进行反序列化和签名(也许是在另一台机器上)?
我无法找到通过命令行使用 openssl 创建未签名证书的方法,但我已经编写了一个程序来执行此操作(X509_new() 并填写适当的数据)。但问题是,如果我在序列化证书之前没有对其进行签名(使用 X509_sign()),反序列化就会失败并出现编码错误。
答案1
通过 OpenSSL 版本 1.0.2,证书的 TBS 部分是x509->cert_info
类型为 的字段X509_CINF
,它是 的 typedef struct x509_cinf_st
。按照通常的模式,您可以使用 对其进行 ser/deser{i2d,d2i}_X509_CINF_*
操作。请记住,X.509 在 TBS 内部和外部都有一个用于签名(OpenSSL 类型 )的 AlgorithmIdentifier X509_ALGOR
,因此您需要将内部字段设置为某个有效值,即使它不是签名时实际使用的值。
在 1.1.0 中,X509 结构(以及许多其他结构)是不透明的,并且没有 API 可以访问此部分。但是,如果您稍微作弊并使用crypto/include/internal/x509_int.h
它获取它,i2d/d2i 例程的 typedef 和声明仍然被正式外部化。这是不一致的,如果它将来发生变化,我不会感到惊讶。
答案2
... 序列化并将证书保存到文件中而不对其进行签名(我的意思是证书,而不是 CSR)... 创建未签名的证书
不存在未签名的证书。如果证书未签名,则不是证书。
然而问题是,如果我在序列化证书之前没有对其进行签名(使用 X509_sign()),反序列化就会失败并出现编码错误。
我不知道您尝试过哪种序列化和反序列化(没有给出代码)。
但你本质上要求的是在实际签名之前冻结与签名过程的当前状态相关的所有数据结构,然后在另一台机器上再次解冻这些数据结构以继续签名。理论上这应该是可能的,因为人们可以在系统之间迁移整个流程或虚拟机,所以问题主要是如何使冻结最小化。
OpenSSL 没有明确的 API,因为到目前为止还没有用例需要它有这样的 API。而且我也没有从你的问题中看到真正的用例,因为你可以简单地使用 CSR 和你需要签名的所有信息并在另一台机器上完成整个过程。这看起来更像是XY问题为我。
答案3
我觉得你对这些术语有点困惑。证书是经过证书颁发机构 (CA) 签名的文档——如果没有签名,它就不是证书。证书签名请求 (CSR) 是要签名的文档,以及签名所需的元数据。一般来说,特别是在处理 OpenSSL 时,要签名的“文档”是公钥。
使用 OpenSSL 通常采取以下步骤:
- 用于
openssl genpkey
生成公钥/私钥对。 - 收集有关密钥使用情况、可分辨名称等的元数据。
- 用于
openssl req
根据证书签名请求的结构格式化元数据和公钥;PKCS#10 格式是用于生成 X.509 证书请求的 ASN.1 编码文档。如果您要通过电子邮件或文本文件传输此 CSR 数据,则它通常是 Base64 编码的。 - 将 CSR 发送给 CA 进行签名。
- 接收来自 CA 的签名证书。
还请注意,您通常不会使用 OpenSSL 自行签署 CSR。只有当您有充分理由使用自签名证书时(例如设置您自己的私人 VPN),您才会这样做。自签名证书除了您之外无法向任何人证明任何信息,因为它们不是由受信任的根 CA 签名的;因此它们不受浏览器或其他计算机的信任。
您所描述的情况可以通过存储 CSR 来实现。同样,如果未签名,则不能作为证书。