我正在尝试签署一份CSR http://en.wikipedia.org/wiki/Certificate_signing_request文件输入PEM http://en.wikipedia.org/wiki/X.509#Certificate_filename_extensions使用 OpenSSL API 进行格式化。
我不能使用X509_sign()
方法,因为我需要使用第三方 API 对请求进行签名。该 API 要求我的应用程序发送需要签名的数据,它将返回给我一个签名。
我需要将其发送给char*
签署第 3 方 API,但我不明白签名过程如何工作:
-
我需要构建这个吗char*
仅包含来自 CSR 的数据,例如公钥的主题、指数和模数:
Char* = "DN=test,O=something...123456(this is the exponent)a2:43:65(this is the modulus)...
-
或者我是否需要使用使用时出现的所有元素来构建缓冲区-text
OpenSSL 中的命令:
Certificate:
Data:
Subject: dn=test, O=something
Public key info:
Exponent: 123456
Modulus:
A2:43:65
....
总结一下:CA 在执行 X509 证书签名时实际使用请求的哪些元素,以及该数据应以什么格式呈现?
你的标题和正文不一致;开放式SSLX509_sign()
签署一个证书, not a CSR。 CSR 不是证书,证书不是 CSR,发布证书也不是像许多无知或懒惰的人所说的那样“签署 CSR”。 (正常)CSR 实际上是由请求者而不是 CA 签署的。 openssl 使用类型X509_REQ
对于企业社会责任和X509_REQ_sign
签署企业社会责任。
但答案基本是一样的。 X.509 证书或 PKCS#10 CSR 都是由三部分组成的序列:包含要签名的数据的正文、AlgorithmIdentifier
,以及签名(作为位串)。这些是使用定义的http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One并使用杰出编码规则或 DER 进行编码。您输入或看到显示的文本形式openssl req -text
or openssl x509 -text
或其他程序代表相同的数据,但通常不足以重现精确的位,并且您必须具有精确的位才能使数字签名发挥作用。 (这就是 DER 中“杰出”的含义;它通过指定用于某些其他不明确情况的确切八位组和位来修改基本编码规则或 BER。)对于 CSR,请参阅我的答案https://security.stackexchange.com/questions/58717/what-part-of-the-csr-is-hashed-in-order-to-create-its-signature/58735 https://security.stackexchange.com/questions/58717/what-part-of-the-csr-is-hashed-in-order-to-create-its-signature/58735;对于 cert,“包装器”是相同的,但主体明显不同,并且包含的内容比 DN 和公钥多得多。
TL;DR For X509* cert
您签署 DER 编码cert->cert_info
,其类型为X509_CINF
并且可以使用编码i2d_X509_CINF()
. For X509_REQ* csr
您签署 DER 编码csr->req_info
与类型X509_REQ_INFO
using i2d_X509_REQ_INFO()
.
选择:openssl 的概念是engine,它是处理某些加密操作的外部库和/或硬件单元。如果您的第三方 API 是或可以“包装”为 openssl 引擎,则可以通过配置和指定该引擎来使用(几乎所有)正常的 openssl 例程。
如果该引擎尚不存在,那么单独为您的项目执行此操作可能会需要太多工作,但如果您预见到其他(未来)用途,那么可能是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)