繁体   English   中英

检查CSR的签名(X.509证书签名请求)

[英]Checking the signature of a CSR (X.509 certificate signing request)

有人可以帮我解决以下问题吗

我想检查CSR(X509证书签名请求)上的签名是否有效,我相信我知道该怎么做(如下所示),但不确定我的理解是否正确,如果有人可以检查/纠正/确认我将不胜感激我的方法。

我正在使用PowerShell(但也了解C'#的基本概念),我的硬盘驱动器上有一个文本文件,该文件基本上是base64编码的CSR,称为csr.txt。

因此,在PowerShell中,我执行以下操作

$ CSR =获取内容c:\\ temp \\ csr.txt –原始$ RequestComObj =新对象-ComObject X509enrollment.CX509CertificateRequestPkcs10 $ RequestComObj.InitializeDecode($ CSR,6)

现在我有了CSR,上面有一个CheckSignature方法,该方法在构造函数中需要一个Pkcs10AllowedSignatureTypes,当我查看此方法时,我看到有两个十六进制值代表可能的选项

AllowedKeySignature = 0x1 AllowedNullSignature = 0x2

从到目前为止的阅读/尝试中,我可以传递构造函数这两个值之一,即SHA1为0x1或SHA2为0x2(例如SHA256)。因此,我的问题是我是否使用SHA1签名了CSR,我想检查一下SHA1签名(如果有效)脚本的最后一部分应如下所示?

$ RequestComObj.CheckSignature(0x1)

或者只是

$ RequestComObj.CheckSignature(1)

如果CSR已签名SHA2,我将使用

$ RequestComObj.CheckSignature(0x2)

或者只是

$ RequestComObj.CheckSignature(2)

当我尝试上述操作时,PowerShell不会向控制台返回任何内容(假设已对CSR进行了相应签名),这对于PowerShell是正常的,即,如果没有错误,则不返回任何内容。

以上正确吗? 例如,对于我认为是有效的检查签名

谢谢大家

__AUser


我正在编辑我的问题以回答以下答案(太大而无法发表评论)

你好vcsjones和Crypt32

非常感谢你们俩花时间回答我的问题(COM> CRL包装器和错误屏蔽对我的更广泛的了解非常有帮助)。

因此,如果我正确理解您(原谅我不是程序员/开发人员),如果我如上所述使用0x1,则它仅检查Digest(例如Hash)是否为SHA1并确定,并且不检查签名是否为正确的签名消化? 换句话说,可能有一个有效的签名,但对于其他摘要,如果使用0x1,它仍然会通过

请问以上我的理解正确吗?

如果是的话,这是否还意味着使用上面的0x2会旧检查摘要是否为SHA2,而不是签名实际上属于该摘要?

您也在上面提到过,而不是使用CheckSignature()我应该使用KeySignature

当我查看上面的$ RequestComObj PowerShell对象的成员时,我没有看到名为KeySignature的成员(除非它被埋得更深),而是看到以下收集的COM成员

Type                        : 1
EnrollmentContext           : 1
Silent                      : False
ParentWindow                :
UIContextMessage            :
SuppressDefaults            : False
ClientId                    : 9
CspInformations             :
HashAlgorithm               : System.__ComObject
AlternateSignatureAlgorithm : False
TemplateObjectId            :
PublicKey                   : System.__ComObject
PrivateKey                  :
NullSigned                  : False
ReuseKey                    : False
Subject                     : System.__ComObject
CspStatuses                 :
SmimeCapabilities           : False
SignatureInformation        : System.__ComObject
KeyContainerNamePrefix      :
CryptAttributes             : System.__ComObject
X509Extensions              : System.__ComObject
CriticalExtensions          : System.__ComObject
SuppressOids                : System.__ComObject
PolicyServer                :
Template                    :
AttestPrivateKey            : False
EncryptionAlgorithm         :
EncryptionStrength          :
ChallengePassword           :
NameValuePairs              : System.__ComObject
ClaimType                   :
AttestPrivateKeyPreferred   : False

通过上面的工作,我可以使用以下方法获得签名公钥的Base64编码版本

$RequestComObj.Signature()

ysZ//Y3EvJnCy3UoBwhZlIoIh7w733+kocDJ9i3+jMdpFu/2YEF6jQQ3UZ8vbrdC
eq6ORbL9yZX2LlBM/H5w30in/ipM9KR3Ynv1ssc0eLyCNL5HILxdgREAFqpTDM6F
3XFpRtzffHs0C5czrIgDmncncKLsUeRVtd4Z9QfP7NnFoiUaquKLFou0ANn7X5cK
LLe9nzYsi9/fuAj6gQAgBTKWWY17ke8nFlPtQsQlxP3nIPLEpDVDZCcvTRcgaamA
xwKsf4isW1zjHkv6pvMEtjuxkrX0/Y91VuPx2WnbciFmpYIH9cE1oKG3L3J34w6d
mcHwPy0EmPZ8bJjL9hiBMA==


$RequestComObj.PublicKey.EncodedKey()

MIIBCgKCAQEAlQdqVHQgzd1uJ9MFb935Vfyg1Y1mZXn4OMwJudOhEzx7m1+4C8lD
OXn5hglHG0FFad+KkLok/GcAzdc2iwBOholJ2MYPXCnfkJLYXHLRj+CKRvhCHWJO
XkQQQ0apdXh1MhiDBD/BIKqmMm54XLFhZqjQiNeIVHFb9GS06Ps/xuOWzqY54xSM
/047nzYNU50FrTHuBCiqtJtHpKtdrCWyhWi7was0noCx/XGm6g8nVnzPTQCSeAPp
6mSt4kSMtdoVZYg1n5pmMW+QYAero/UWrbNp1WlkpUH4s96H6pUrbF7RIkXpCwWo
cxBHAXVcMst2HYvwstAETxvqeKTOvVEEAQIDAQAB

因此,现在我想我拥有CSR,我具有签名以及我从这三部分信息中获得的公钥,我必须能够检查CSR上的签名是否有效?

如果您愿意的话,我只需要代码方面的帮助,可以找到C#,因为我可以在PowerShell等中使用它。

再次非常感谢

__AUser

从到目前为止的阅读和尝试中,我可以向构造函数传递以下两个值之一:SHA1为0x1,SHA2为0x2(例如SHA256)。

这并不完全正确。 CheckSignature采用指示允许的签名类型的参数,并且可以在必要时进行按位组合。

如果使用了NullSignature ,那么您根本就不需要验证签名,验证的只是CSR的摘要。 如果使用KeySignature ,则将根据用于验证CSR的公钥来验证CSR的签名。

除非明确需要不验证非对称签名,否则应始终将0x01传递给CheckSignature

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM