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



有人能帮我回答以下问题吗

我想检查CSR上的签名(X509证书签名请求)是有效的我相信我知道如何做到这一点(如下),但不确定我的理解是否正确,如果有人能检查/纠正/确认我的方法,我将不胜感激。

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

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

$CSR=获取内容c:\temp\CSR.txt–原始$RequestComObj=新对象-ComObject X509注册.CX509CertificateRequest Pkcs10$RequestComObj.InitializeDecode($CSR,6)

现在我有了CSR,上面有一个CheckSignature方法,它需要构造函数中的Pkcs10AllowedSignatureTypes,当我研究它时,我发现有两个十六进制值表示可能的选项

AllowedKeySignature=0x1AllowedNullSignature=0x2

根据我目前所读/尝试的内容,我可以将这两个值中的一个传递给构造函数,其中0x1表示SHA1,0x2表示SHA2(例如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,它只检查摘要(例如Hash)是否为SHA1和OK,而不检查签名是否是该摘要的正确签名?换句话说,可能有一个有效的签名,但对于不同的摘要,如果使用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

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

这并不完全正确。CheckSignature采用一个参数,该参数指示允许什么类型的签名,如果需要,可以按位组合。

如果使用NullSignature,则根本不验证签名,验证的只是CSR的摘要。如果使用KeySignature,则CSR的签名将根据用于验证CSR的公钥进行验证。

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

最新更新