我尝试使用OpenSSL API以CSR格式签署PEM文件。
我无法使用X509_sign()
方法,因为我需要使用第三方API对请求进行签名。此API要求我的应用程序发送需要签名的数据,它将返回一个签名。
我需要将char*
发送给第三方API,但我不了解签名过程的运作方式:
我是否需要仅使用CSR中的数据构建此char*
,例如主题,公钥的指数和模数:
Char* = "DN=test,O=something...123456(this is the exponent)a2:43:65(this is the modulus)...
或者我是否需要使用OpenSSL中使用-text
命令时出现的所有元素构建缓冲区:
Certificate:
Data:
Subject: dn=test, O=something
Public key info:
Exponent: 123456
Modulus:
A2:43:65
....
总结:CA在执行X509证书签名时实际使用了哪些请求元素,以及应以何种格式显示此数据?
答案 0 :(得分:2)
你的头衔和身体不同意; openssl X509_sign()
签署证书,而不是 CSR 。 CSR不是证书,证书不是CSR,颁发证书不是签署CSR'许多不知情或懒惰的人说。 (正常)CSR实际上是由请求者签署的,而不是CA. openssl使用类型X509_REQ
表示CSR,X509_REQ_sign
表示CSR。
但答案基本相同。 X.509证书或PKCS#10 CSR是三件事的序列:包含要签名的数据的正文,AlgorithmIdentifier
和签名(作为BITSTRING)。这些是使用http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One定义的,并使用Distinguished Encoding Rules或DER进行编码。您输入或查看由openssl req -text
或openssl x509 -text
或其他程序显示的文本表单代表相同的数据,但通常不足以重现确切的位,并且您必须具有数字签名的确切位工作。 (这就是“DER”中的“区分”;它通过指定用于某些其他模糊情况的确切八位字节和位来修改基本编码规则或BER。)对于CSR,请参阅{{{ 3}};对于证书的包装'是相同的,但身体是显着不同的,并包含比DN和公钥更多的。
TL; DR 对于X509* cert
,您签署cert->cert_info
的DER编码,其类型为X509_CINF
,可以使用i2d_X509_CINF()
进行编码。对于X509_REQ* csr
,您使用csr->req_info
对X509_REQ_INFO
的DER编码进行了i2d_X509_REQ_INFO()
类型的签名。
替代方案:openssl具有引擎的概念,它是一个处理某些加密操作的外部库和/或硬件单元。如果您的第三方API已经或可以被包装,那么作为openssl引擎,您可以通过配置和指定该引擎来使用(几乎所有)正常的openssl例程。 如果该引擎尚未存在,那么仅为您的项目执行该工具可能需要做太多工作,但如果您预见到其他(未来)用途,则可能是值得的。