12638
S/MIMEで受信したデータを平文化した後、OpenSSLを使って自分で  
メッセージダイジェストを求めて、改ざんがないかチェックをしたいと思います。

ただ、smime.p7sからメッセージダイジェストを求める手順がわかりませんでした。  
OpenSSLでなくても構わないのですが、求め方を教えて頂けますか。

今のところ、以下の手順でメッセージダイジェストの取得を進めていました。  
平文部分をdata.txt、署名部をsmime.p7sとしています。

  1. 平文のメッセージダイジェスト 

> % openssl sha1 data.txt

  2. 署名部のメッセージダイジェスト  
64bitデコード

> % openssl enc -d -base64 -in smime.p7s -out smime64.p7s

ここから、smime64.p7sに含まれる署名の取得、電子証明書の取得、署名の復号（メッセージダイジェストの取得）と進める必要があるかと思いますが、進め方がわかりません。

以下を元に、含まれる証明書の表示までは手順がわかっています。似たような方法で署名も表示できるのではないかと思ったのですが、OpenSSLのコマンド一覧などを読んでもどれが該当するのかよくわかりませんでした。  
<https://stackoverflow.com/questions/5678124/extract-public-certificate-from-
smime-message-pkcs7-signature-with-openssl>

smime.p7sをASN.1形式のファイルをGUIで参照できるaatool2などを元に確認しましたが、  
どの箇所が署名にあたるのかわかりませんでした。ASN.1に関する知識もあまりないため、  
以下などを確認していますが、署名データの箇所となる部分を見つけられませんでした。  
<http://www.geocities.co.jp/SiliconValley-SanJose/3377/>
CC BY-SA 3.0
2015-07-23T10:48:13.443
12616
2015-07-24T12:32:16.060
2017-05-23T12:38:55.250
-1
10100
question
openssl sendmail mime
smime.p7sからメッセージダイジェストを求めたい
`openssl`(1) には `smime`(1) サブコマンドがあります。そのオプションの `-sign` で署名、`-verify`
で署名の確認を行なえます。

昔、OpenSSL `smime`(1) をラップする Perl モジュールを作成しました。  
POD に記載したように、`smime`(1) に渡す/返されるデータは RFC 2822 の  
e-mail 形式のテキストです。ご参考まで。

<https://github.com/fumiyas/openssl-hack/blob/master/lib/perl5/smime.pm>
CC BY-SA 3.0
2015-07-24T05:37:17.207
12638
2015-07-24T05:37:17.207
3061
12616
answer
PKCS7 のデータ構造は、

<http://www.itu.int/ITU-T/formal-language/itu-t/x/x420/1999/PKCS7.html>

に定義があります。ASN.1 になじみがないとデコードした結果とつきあわせるのは難しいかもしれません。
CC BY-SA 3.0
2015-07-24T12:32:16.060
12656
2015-07-24T12:32:16.060
10630
12616
answer