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

时间:2017-01-20 13:41:36

标签: c# powershell certificate x509 pki

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

我想检查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

1 个答案:

答案 0 :(得分:1)

  

根据我迄今为止所阅读和尝试的内容,我可以传递构造函数中的一个值:SHA1为0x1,SHA2为0x2(例如SHA256)。

这不完全正确。 CheckSignature采用一个参数来指示允许哪种签名,并且必要时可以按位进行组合。

如果使用NullSignature,那么您根本不验证签名,所有正在验证的是CSR的摘要。如果使用KeySignature,则根据用于验证CSR的公钥验证CSR的签名。

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