openssl smime -signを使用して-out xmlからダイジェスト値を取得する方法は?

openssl smime -signを使用して-out xmlからダイジェスト値を取得する方法は?

順序を知りたいです。openssl smime 署名消化値を得るために。

以下のようなもの -


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

その後、消化値を比較しますか?

答え1

あなたのEメールは、S / MIMEプレーンテキストで署名された(分離署名とも呼ばれる)Eメールを送信しようとします。rfc5751秒 3.4.3et predは実際には正確ではありませんが、最初の部分はデータエンティティであり、MIMEヘッダーはありません。

OpenSSLを含む一部のソフトウェアはこれらのバイアスを処理できますが、OpenSSL(まだ!)はメッセージのように最新バージョンのサブタイプを使用するのではなく、x-pkcs7-signaturev2サブタイプ(rfc2311)を使用して独立した署名を生成します。pkcs7-signature

これらのS / MIMEメッセージに使用されるPKCS7 / CMS分離署名には、使用または使用されない可能性があるいくつかのオプションのコンポーネントがあります。表示された切り捨てられたデータでは、メッセージがどのオプションを使用しているかはわかりません。

生成するコマンドは何ですか?

OpenSSLを使用して、openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile] いいえ -nodetach前のサブタイプとを使用して、上記のものを除き、この形式でメッセージを生成しますx--inkey秘密鍵が証明書と同じファイルに含まれている場合は、このオプションを省略できます。あなたは選ぶことができます:

  • 署名者の証明書を含めるか除外します。

  • 追加(チェーン)証明書を明示的に含める

  • システムのマニュアルページに記載されているように、signedAttributesを有効または無効にするまたはオンライン。名前付きファイルで入力と出力を実行したり、stdinとstdoutを使用したり、順番にシェル(またはオペレーティングシステム)によってリダイレクトまたはパイプ処理することができます。

    非常に古いOpenSSLバージョン(0.9.8以下)に加えて、実際に次のopenssl cms親セットであるOpenSSLバージョンを使用することもできます。openssl smimeデフォルトS/MIME 実行 - インポート誰でも openssl smime または openssl cms-outformCMSを実行するには、署名、暗号化、-inform確認、または復号化を指定する必要があります。

Qのコマンドはsmime verifyS / MIME署名を確認してから(デフォルトで適用可能な証明書チェーンもありますが、スタンドアロン証明書を使用しているようで、実際のチェーンはありません)、それを破棄して署名付きデータのみを出力します。この例ではXMLです。

外部ラベル<cms> できるこれは、このデータが後続のPKCS7(rfc5652 et pred)の暗号化メッセージ構文を表すためのものですが、このデータの組み合わせはどのCMSメッセージにも対応しないことを意味します。名前は、特定のファイルのハッシュが含まれていることを示します。ファイルの(意図された)コピーがあり、ファイルのハッシュを確認したい場合、OpenSSLはそれを自動的に実行することはできません({md5,sha1,etc}sum -c単純な一時テキストでも可能です)。通常のUnixコマンドを使用して確認されます)。 2番目のコマンドが正しく開始されたことを手動で確認してXMLからハッシュを抽出するには、次のようにします。

 $ grep -Po '<digest>\K[^<]*' 

あるいは、PCREのgrepがない場合、ここのsed awk perl他のQはほぼ確実に同等の項目を扱い、両方のハッシュをshell test "$x" == "$y"[ "$x" == "$y" ]bash、ksh、zsh [[、またはawk他と比較します。perl

OTOH、あなたの質問は実際に作るXML本文の場合、OpenSSLは残りの部分に対してハッシュ値のみを実行できるため、標準のテキストツールまたはXMLツールを使用する必要があります。

関連情報