簡體   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