2012.05.18
Mew を使ってて気がついたのが、三井住友銀行からの S/MIME で署名されたメールが、
X-Mew: <body> Good S/MIME sign <SMBC_service@dn.smbc.co.jp> UNDEFINED
というように "UNDEFINED" って表示されてることだった。

どういう意味なのか mew-smime.el を読むと、
(defun mew-smime-verify-check ()
(let (addr warning result trust ret)
[...]
;; xxx error code check for TRUST_UNDEFINED/NEVER?
(if (re-search-forward "TRUST_\\([A-Z]*\\)" nil t)
(setq trust (mew-match-string 1)))
(setq ret result)
(if addr (setq ret (concat ret " <" addr ">")))
(if trust (setq ret (concat ret " " trust)))
(if warning (setq ret (concat ret " -" warning)))
ret))
どうやら、gpgsm の出力の TRUST_xxx という部分を切り取って表示しているようだ。試しに Mew が生成する中間ファイルをコピーして、実際に gpgsm を使って試してみると、
$ gpgsm --verify --include-certs 3 --status-fd 1 ./mew36121HRL.sig ./mew36121HRL
[GNUPG:] NEWSIG
gpgsm: Signature made 2012-05-16 23:40:53 using certificate ID 0xFFFFFFFFCA8FEB6C
gpgsm: note: non-critical certificate policy not allowed
dirmngr[55990.0]: permanently loaded certificates: 0
dirmngr[55990.0]: runtime cached certificates: 0
gpgsm: note: non-critical certificate policy not allowed
[GNUPG:] PROGRESS starting_agent ? 0 0
[GNUPG:] GOODSIG 3C7271D19643E865FB58B036A1F20578CA8FEB6C /CN=SUMITOMO MITSUI BANKING CORPORATION/OU=Class 3
Organizational E-Mail Certificate/OU=Terms of use at https:\x2f\x2fwww.verisign.com\x2frpa (c)11/OU=Mass Retail Dept.,Consumer Banking Unit/O=SUMITOMO MITSUI BANKING CORPORATION/L=Chiyoda-ku/ST=Tokyo/C=JP/EMail=SMBC_service@dn.smbc.co.jp
[GNUPG:] VALIDSIG 3C7271D19643E865FB58B036A1F20578CA8FEB6C 2012-05-16 20120516T234053 20120922T235959 0 0 1 2 00
gpgsm: invalid certification chain: No value
[GNUPG:] TRUST_UNDEFINED 26
確かに最後のところで TRUST_UNDEFINED と表示されている。("invalid certification chain" とも表示されていることに注意)

gnupg-2.0.19/sm/verify.c を読むと、
      audit_log_ok (ctrl->audit, AUDIT_CHAIN_STATUS, rc);
if (rc) /* of validate_chain */
{
log_error ("invalid certification chain: %s\n", gpg_strerror (rc));
if (gpg_err_code (rc) == GPG_ERR_BAD_CERT_CHAIN
|| gpg_err_code (rc) == GPG_ERR_BAD_CERT
|| gpg_err_code (rc) == GPG_ERR_BAD_CA_CERT
|| gpg_err_code (rc) == GPG_ERR_CERT_REVOKED)
gpgsm_status_with_err_code (ctrl, STATUS_TRUST_NEVER, NULL,
gpg_err_code (rc));
else
gpgsm_status_with_err_code (ctrl, STATUS_TRUST_UNDEFINED, NULL,
gpg_err_code (rc));
audit_log_s (ctrl->audit, AUDIT_SIG_STATUS, "bad");
goto next_signer;
}
どうやら証明書の連鎖が検証できなかった際のエラーのようだ。そもそも S/MIME なので root の証明書(とその信頼)はどうやって設定してるんだっけなぁ、と古い記憶(とメール)を掘り起こしてみると、trustlist.txt に信頼する root の証明書の fingerprint を列挙すればよかったようだ。( http://www.mew.org/ja/feature/smime.html )

とりあえず、gpgsm(1) を見ると -k で現在持ってる証明書の鍵を表示できるようなので実行してみたところ、自動的にデフォルトの鍵(gnupg の配布パッケージに含まれるもの)が読み込まれたようだ。
$ grep com-cert /usr/ports/security/gnupg/pkg-plist 
%%PORTDOCS%%%%DATADIR%%/com-certs.pem
$ gpgsm -k | & head -4
gpgsm: keybox `/home/user/.gnupg/pubring.kbx' created
gpgsm: importing common certificates `/usr/local/share/gnupg/com-certs.pem'
gpgsm: total number processed: 15
gpgsm: imported: 15
そこで、この gpgsm が持ってる証明書の捺印を trustlist.txt へ書きだせばよい。
$ gpgsm -k --status-fd 1 | grep fingerprint: | awk '{print $2 " S"}' > ~/.gnupg/trustlist.txt

なお、上記 Mew のページに、
ルート CA の証明書のバージョンが 1 の場合、拇印の最後に " S relax" と書く必要があります。
とある(次の cert.pem は "Root certificates from certificate authorities included in the Mozilla NSS library")が、
$ egrep "(^Certificate:|Version:|Subject:)" /etc/ssl/cert.pem | grep -A1 -B1 "Version: 1"
の結果を見るに、VeriSign の証明書などがバージョン1なので、適宜 "relax" をつける必要がある。たとえば、"Class 3 Public Primary Certification Authority - G2" に relax をつけるためにはこんな感じ。
$ diff -u .gnupg/trustlist.txt{.orig,}
--- .gnupg/trustlist.txt.orig 2012-05-16 21:49:56.000000000 -0400
+++ .gnupg/trustlist.txt 2012-05-16 21:48:21.000000000 -0400
@@ -14,7 +14,7 @@
C9:2F:E6:50:DB:32:59:E0:CE:65:55:F3:8C:76:E0:B8:A8:FE:A3:CA S
D5:C7:50:F2:FE:4E:EE:D7:C7:B1:E4:13:7B:FB:54:84:3A:7D:97:9B S
D7:92:BC:E6:B6:8A:5C:C0:7F:17:08:A0:94:CB:46:8D:29:6B:75:55 S
-85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F S
+85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F S relax
3C:72:71:D1:96:43:E8:65:FB:58:B0:36:A1:F2:05:78:CA:8F:EB:6C S
08:A8:3F:43:90:9E:9C:98:18:FC:78:D3:78:B3:B2:DE:B9:79:EB:C0 S
84:98:C8:6C:88:19:CD:3C:1C:58:D7:BF:8F:DA:FA:1B:6C:4F:0D:5E S
(ちなみに、ここら辺の経緯は http://lists.gnupg.org/pipermail/gnupg-devel/2006-September/thread.html の "Subject: x509 v1 certificate" で見られる。)

これをした後、再度 gpgsm で検証をしてみると、
$ gpgsm --verify --include-certs 3 --status-fd 1 mew36121HRL.sig mew36121HRL
[GNUPG:] NEWSIG
gpgsm: Signature made 2012-05-16 23:40:53 using certificate ID 0xFFFFFFFFCA8FEB6C
gpgsm: note: non-critical certificate policy not allowed
dirmngr[55999.0]: permanently loaded certificates: 0
dirmngr[55999.0]: runtime cached certificates: 0
gpgsm: note: non-critical certificate policy not allowed
[GNUPG:] PROGRESS starting_agent ? 0 0
[GNUPG:] GOODSIG 3C7271D19643E865FB58B036A1F20578CA8FEB6C /CN=SUMITOMO MITSUI BANKING CORPORATION/OU=Class 3 Organizational E-Mail Certificate/OU=Terms of use at https:\x2f\x2fwww.verisign.com\x2frpa (c)11/OU=Mass Retail Dept.,Consumer Banking Unit/O=SUMITOMO MITSUI BANKING CORPORATION/L=Chiyoda-ku/ST=Tokyo/C=JP/EMail=SMBC_service@dn.smbc.co.jp
[GNUPG:] VALIDSIG 3C7271D19643E865FB58B036A1F20578CA8FEB6C 2012-05-16 20120516T234053 20120922T235959 0 0 1 2 00
gpgsm: Good signature from "/CN=SUMITOMO MITSUI BANKING CORPORATION/OU=Class 3 Organizational E-Mail Certificate/OU=Terms of use at https:\x2f\x2fwww.verisign.com\x2frpa (c)11/OU=Mass Retail Dept.,Consumer Banking Unit/O=SUMITOMO MITSUI BANKING CORPORATION/L=Chiyoda-ku/ST=Tokyo/C=JP/EMail=SMBC_service@dn.smbc.co.jp"
gpgsm: aka "SMBC_service@dn.smbc.co.jp"
[GNUPG:] TRUST_FULLY 0 shell
無事 TRUST_UNDEFINED が TRUST_FULLY に変わり、Mew 上でも当然、
X-Mew: <body> Good S/MIME sign <SMBC_service@dn.smbc.co.jp> FULLY
に変わった。

分かってみると簡単な話だけど、以外とややこしかった。
この記事へのコメント

この記事へのトラックバック
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力] (画像の中の文字を半角で入力してください。)



※ブログオーナーが承認したコメントのみ表示されます。
Rebuild at 2018/09/22 01:06
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。