如何使用 openssl smime -sign 在 -out xml 中獲取摘要值?
想知道openssl smime -sign獲取摘要值的命令。
像下面的東西 -
MIME-Version: 1.0 Content-Type: multipart/signed;protocol="application/pkcs7- signature";micalg="sha-256";boundary="707e08bf1d5b44f6b18bc0999df569c8" This is an S/MIME signed message --707e08bf1d5b44f6b18bc0999df569c8 <cms> <file> <name>index.xml</name> <digest>4pDBO3/ZNCpaAvxOWbQ0AUnDbT1oAaWMrPIDZz/a1i0=</digest> <digesttype>sha256</digesttype> <path>.</path> </file> </cms> --707e08bf1d5b44f6b18bc0999df569c8 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B
……
生成它的命令是什麼?
驗證使用 -
openssl smime -verify -in sign -CAfile Sign_Key.crt -out xmlwithdigest openssl dgst -binary -sha256 infile | openssl base64
然後比較摘要值?
您的消息顯然是對 S/MIME 明確簽名(又名分離簽名)消息的嘗試,請參閱rfc5751 sec 3.4.3 et pred,儘管它實際上並不正確;第一部分,即數據實體,沒有 MIME 標頭。
包括 OpenSSL 在內的一些軟體可以處理這種偏差,但是 OpenSSL(仍然!)使用
x-pkcs7-signature
v2 (rfc2311)的子類型創建分離的簽名,而不是pkcs7-signature
像您的消息那樣來自較新版本的簽名。在這種類型的 S/MIME 消息中使用的 PKCS7/CMS 分離簽名具有幾個可以使用或不使用的可選組件。從您顯示的截斷數據中,無法確定該消息使用哪些選項,並且無論如何您都沒有表明您是否以一種方式或另一種方式關心這些選項。
生成它的命令是什麼?
使用 OpenSSL,
openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile]
without-nodetach
會以這種格式創建消息,除了我上面提到的使用帶有x-
.-inkey
如果私鑰包含在與證書相同的文件中,則可以省略該選項。您可以選擇:
- 包括或不包括簽名者的證書
- 明確包括附加(鏈)證書
- 按照系統或線上手冊頁中的說明使用或不使用signedAttributes 。您可以輸入和輸出到命名文件或使用標準輸入和標準輸出,它們又可以由外殼(或作業系統)重定向或管道傳輸。
除了非常舊的 OpenSSL 版本(0.9.8 或更低版本)之外,您還可以使用
openssl cms
它實際上是一個超集,openssl smime
儘管它的名稱預設為執行 S/MIME - 要獲取或 執行 CMS,您必須指定簽名openssl smime
或 加密或用於驗證或解密!openssl cms``-outform``-inform
Q 中的
smime verify
命令驗證 S/MIME 簽名(預設情況下也驗證適用的證書鏈,但您似乎使用的是獨立證書,因此沒有真正的鏈),然後丟棄它,僅輸出簽名數據,在您的情況下是 XML。外部標籤
<cms>
可能意味著該數據旨在表示加密消息語法,是 PKCS7 (rfc5652 et pred) 的繼承者,但這種數據組合不對應於任何 CMS 消息。這些名稱確實表明它包含特定文件的雜湊值。如果您有該文件的(聲稱的)副本並且想要驗證該文件的雜湊值,OpenSSL 無法自動執行此操作(甚至{md5,sha1,etc}sum -c
使用更簡單的臨時文本格式的常見 Unix 命令也無法完成檢查)。要手動檢查,您的第二個命令是正確的開始;要從 XML 中提取雜湊,您可以執行類似的操作$ grep -Po '<digest>\K[^<]*'
或者,如果您沒有 PCRE 的 grep,則
sed awk perl
幾乎可以肯定這裡有其他 Q 涵蓋的等價物;然後用shelltest "$x" == "$y"
or[ "$x" == "$y" ]
, or bash,ksh,zsh[[
, orawk
orperl
, 或者其他方法比較這兩個hash值。OTOH,如果您的問題實際上是創建那個 XML 主體,OpenSSL 只能做雜湊值;其餘的將不得不使用標准文本工具,或者可能是 XML 工具。