Openssl

如何使用 openssl smime -sign 在 -out xml 中獲取摘要值?

  • July 21, 2018

想知道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-signaturev2 (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 涵蓋的等價物;然後用shell test "$x" == "$y"or [ "$x" == "$y" ], or bash,ksh,zsh [[, or awkor perl, 或者其他方法比較這兩個hash值。

OTOH,如果您的問題實際上是創建那個 XML 主體,OpenSSL 只能做雜湊值;其餘的將不得不使用標准文本工具,或者可能是 XML 工具。

引用自:https://unix.stackexchange.com/questions/452218