有人可以帮助我解决以下问题
我想检查CSR上的签名(X509证书签名请求)是 有效 我相信我知道怎么做(如下),但不确定我的理解是否正确,如果有人能检查/纠正/确认我的方法,我将非常感激。
我正在使用PowerShell(但也了解C'的基本概念#) 我的硬盘上有一个文本文件,它基本上是一个名为csr.txt
的base64编码的CSR所以在PowerShell中我做了以下
$ CSR = get-content c:\ temp \ csr.txt -raw $ RequestComObj = New-Object -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
我正在编辑我的问题以回复以下答案(太大而无法发表评论)
Hello 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
答案 0 :(得分:1)
根据我迄今为止所阅读和尝试的内容,我可以传递构造函数中的一个值:SHA1为0x1,SHA2为0x2(例如SHA256)。
这不完全正确。 CheckSignature
采用一个参数来指示允许哪种签名,并且必要时可以按位进行组合。
如果使用NullSignature
,那么您根本不验证签名,所有正在验证的是CSR的摘要。如果使用KeySignature
,则根据用于验证CSR的公钥验证CSR的签名。
除非您明确需要不验证非对称签名,否则您应始终将0x01
传递给CheckSignature
。