
我有來自 OpenSSL 簽章過程的 .tsr 回應。openssl ts -reply
作品。
openssl ts -reply -in b1.tsr -text
Using configuration from g:/progs/openssl/ssl/openssl.cnf
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified
TST info:
Version: 1
Policy OID: 1.3.6.1.4.1.6449.2.1.1
Hash Algorithm: sha256
Message data:
0000 - 10 20 96 d8 03 ec ed 6e-03 56 3d d6 d6 a7 14 50 . .....n.V=....P
0010 - b0 a7 53 a9 34 4e b9 57-f7 e2 83 13 5e 0d df e0 ..S.4N.W....^...
Serial number: 0xA7ADC6135D0A39500F7C3B0C41578D8C2CB62B87
Time stamp: Jun 22 10:59:44 2019 GMT
Accuracy: unspecified
Ordering: no
Nonce: 0xD4154ECA4E9A0D06
TSA: DirName:/C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Time Stamping Signer #1
Extensions:
openssl ts -verify
失敗。
openssl ts -verify -sha256 -digest "102096d803eced6e03563dd6d6a71450b0a753a9344eb957f7e283135e0ddfe0" -in b1.tsr -CAfile comodo.pem
Verification: FAILED
11928:error:2F06D064:time stamp routines:TS_VERIFY_CERT:certificate verify error:.\crypto\ts\ts_rsp_verify.c:264:Verify error:unable to get local issuer certificate
本地頒發者證書到底是怎麼回事?我無法在“ts”命令中使用 -noverify。
答案1
為了建立供 openssl 驗證的完整憑證鏈,您不僅需要根憑證(您使用開關指定的-CAfile
),還需要用於簽署 TSResponse 的憑證。
從手冊頁ts
:
-untrusted cert_file.pem
Set of additional untrusted certificates in PEM format which may be needed when building the certificate chain for the TSA's signing certificate. This
file must contain the TSA signing certificate and all intermediate CA certificates unless the response includes them. (Optional)
答案2
驗證錯誤「無法取得本機頒發者憑證」表示 OpenSSL 無法在本機信任庫中找到完整鏈的根(或錨點),或不完整鏈的下一個連結(可能是也可能不是根/錨點) 。
作為背景,由於您沒有表明您對基於證書的驗證的理解程度,因此ts -verify
基本上由四個部分組成:
檢查令牌主體上的簽章 使用(聲稱的)簽署者憑證中的公鑰進行驗證,並且符合 RFC3161 施加的一些其他約束(必須只有一個 SignerInfo 並且必須使用包含 ESSCertId 的signedAttrs)。簽署者的憑證是否包含在時間戳回應中由 RFC3161 請求中的標誌控制;如果不包含,則驗證者/信賴者必須已經擁有它或透過其他方式獲得它。
建立一條鏈(也稱為路徑),將所聲明的簽署者的憑證連結到至少一個受信任的CA,由稱為根或錨定憑證的CA 憑證表示,該憑證在本機定義為受信任的,通常存在於信任庫中。 RFC3161 回應可能包含鏈證書,但不是必需的;如果沒有,驗證者/信賴者必須已經擁有它/它們或透過其他方式獲得它/它們。
透過檢查每個憑證的簽章是否在下一個較高憑證(即父級憑證)的公鑰下驗證、每個憑證在簽章時是否有效(有效且未過期)以及每個憑證中的許多其他欄位來驗證鏈適合其在鏈中的使用;詳情請參閱RFC5280 第 6 秒。驗證應該包含檢查鏈中的每個憑證是否未被撤銷(截至簽章時間),但 OpenSSL 預設不執行此部分;有多個選項可以執行多種撤銷檢查變體,但您沒有使用其中任何一個。
最後,檢查證書(鏈)是否適合此處的目的,即時間戳記。對於SSL/TLS 和S/MIME 等憑證所使用的其他情況,我們通常不僅需要檢查憑證是否是在受信任的CA 授權下合法頒發的,而且還需要檢查憑證是否是在受信任的CA 的授權下合法頒發的到特定實體(已可靠識別的網站、郵件伺服器或個人)。然而對於時間戳我們通常不關心哪個TSA 發行了令牌,僅此而已一些有效的 TSA 確實如此,因此最後一次檢查僅驗證證書/鏈的 ExtendedKeyUsage 是否包含時間戳記(標準化 OID,因此允許)。
綜合起來(並且僅綜合起來),我們可以確定我們擁有的數據實際上是由有效 TSA 頒發的時間戳令牌,並且沒有被有意或無意地偽造或更改,因此可以信任。
對於 OpenSSL 命令列,根/錨點必須位於所使用的信任庫中,該信任庫由指定的-CAfile
和/-CApath
或預設的 CAfile 和/或 CApath(如果存在)組成,無論哪種情況都是 PEM 格式;並且(儘管手冊頁不是很清楚)任何不在回應訊息中的其他鏈證書都必須任何一個位於信任庫或提供的文件中-untrusted
(必須是單一文件,但可以包含 PEM 格式的多個憑證)。預設情況下,只有根憑證(歷史上只有根憑證)被接受為鏈/路徑錨點,但從-partial_chain
1.0.2 開始,可以選擇接受信任庫中的非根錨點。
顯示器ts -reply -text
不顯示 CMS 級別,特別是其中提供的憑證。您可以看到所有內容,asn1parse -inform der [-i]
但必須手動解碼。更方便的是,您可以提取 CMS SignedData 部分,也稱為簽名令牌,如下所示我的回答在這裡然後如下檢查證書:
openssl ts -reply -in respfile -token_out -out tokenfile
openssl pkcs7 -inform der -in tokenfile -print_certs
# if desired/necessary, feed any or each of the PEM cert block(s)
# to openssl x509 -text -noout to get full details
我沒有使用此 TSA 的經驗,但原則上應該公開記錄知名公共 TSA 的證書和鏈,這是 crt.sh 已知的主題唯一記錄的證書(現在也由 Comodo 運行) -Sectigo)是https://crt.sh/?id=1437463789有一個已知的父母Sectigo RSA Time Stamping CA
https://crt.sh/?id=1437089092發行人是USERTrust RSA Certification Authority
; CA 有四個憑證(潛在父母)列於https://crt.sh/?caid=1167-- 其中之一是Microsoft cosigning,通常僅在時間戳用於Microsoft Authenticode 代碼簽名時才使用,其他三個對於一般用途來說都是合理的,儘管唯一一個名為Comodo 是最近的(僅3 個月前發布) 。 FWIW id=1437089092 中的 AIA 指向http://crt.usertrust.com/USERTrustRSAAddTrustCA.crt它從 AddTrust 根提供證書https://crt.sh/?id=4860286這是最舊的(2000 年發行,一年內到期)。
使用訊息中的證書來確定您希望使用的根或錨點需要哪些附加鍊和錨點證書,並與-CAfile
您或您可能使用的其他文件中提供的內容進行比較-untrusted
。