S/MIME の機能を提供するために、Mew は GnuPG version 2 に含まれる "gpgsm" を利用します。
以降の説明では、 証明書(署名された公開鍵)と秘密鍵は、会社から支給されていると仮定します。 それらは PKCS 12 と呼ばれる書式でファイルに格納されています。
gpgsm --> gpg-agent --> mew-pinentry --> ユーザ | +-----> dirmngr --> CRLサーバ
詳細は、Project Agypten を参照して下さい。
"dirmngr" は、現時点で私(山本)の環境では上手く動きません。
GnuPG 2 のパッケージを入手し、インストールして下さい。 "gpgsm" と "gpg-agent" がインストールされるはずです。 CRL を検査したいなら、"dirmngr" もインストールしましょう。
Mew の "bin" ディテクトリにある "mew-pinentry" もインストールして下さい。
"mew-pinentry" が "gpg-agent" から呼ばれるように、 "~/.gnupg/gpg-agent.conf" に以下の行を追加して下さい。
pinentry-program /usr/local/bin/mew-pinentry
まず最初に、PKCS 12 のファイルを会社に入手して下さい。 それには、証明書と秘密鍵が入っています。 これを "keycert.p12" と呼ぶことにしましょう。
次に、"keycert.p12" を PEM 形式に直す必要があります。 そのファイルを "keycert.pem" と呼びましょう。
% openssl pkcs12 -in keycert.p12 -out keycert.pem -nodes
そして、"keycert.p12" を暗号化しているパスフレーズを入力します。
次に、秘密鍵を取り出します。"key.p12" ファイルに取り出すことにしましょう。
% openssl pkcs12 -in keycert.pem -export -out key.p12 -nocerts -nodes
ここで、"key.p12" を暗号化するための一時的なパスフレーズを入力します。
そして、確認のためにもう一度、一時的なパスフレーズを入力します。
秘密鍵を秘密鍵リングに格納します。
% gpg-agent --daemon gpgsm --call-protect-tool --p12-import --store key.p12
復号化のために、一時的なパスワードを入力します。
そして、秘密鍵リングの中で、秘密鍵を暗号化するために、新しいパスフレーズを入力します。
確認のために、もう一度、新しいパスフレーズを入力します。
証明書を "keycert.p12" から取り出します。 "certs.pem" ファイルに取り出すことにしましょう。
% openssl pkcs12 -in keycert.p12 -out certs.pem -nokeys
ここで、"keycert.p12" を暗号化しているパスフレーズを入力します。
そして、この証明書を公開鍵リングに格納します。
% gpgsm --import certs.pem
必要なルート CA の拇印(fingerprint)を "~/.gnupg/trustlist.txt" に格納します。
話は前後しますが、Mew で S/MIME の署名を検証すると、 "~/.gnupg/pubring.kbx" に利用した証明書が自動的に登録されます。 よって拇印の値は、以下のようにして調べることができます。
% gpgsm -kv
Serial number: 7DD9FE07CFA81EB7107967FBA78934C6
Issuer: /OU=VeriSign Trust Network/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=Class 3 Public Primary Certification Authority - G2/O=VeriSign
, Inc./C=US
Subject: /OU=VeriSign Trust Network/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=Class 3 Public Primary Certification Authority - G2/O=VeriSign
, Inc./C=US
validity: 1998-05-18 00:00:00 through 2028-08-01 23:59:59
key type: 1024 bit RSA
chain length: none
fingerprint: 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F
上記のように、Issuer と Subject が完全に同じであれば、 それがルート CA の証明書です。 ルート CA の証明書の属性に "key usage" があれば証明書のバージョンは 3、 なければ証明書のバージョンは 1 です。
ルート CA の証明書のバージョンが 3 の場合、 捺印の値を単に "trustlist.txt" の一行に格納します。 ルート CA の証明書のバージョンが 1 の場合、 拇印の最後に " S relax" と書く必要があります。
たとえば、上記のルート CA の証明書のバージョンは 1 なので、 これを信用するには、 以下のような行を "trustlist.txt" に書くことになります。
85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F S relax
"gpgsm" と "gpg-agent" がうまく動いているか確かめるために、 以下のようにして分離署名を作ってみて下さい。
% gpgsm --detach-sign file > sig
ここで、秘密鍵を暗号化しているパフレーズを入力します。
以下のような警告が表示されるかもしれません。
dirmngr[nnnn]: no CRL available for issuer id NNNNN....
これは、CRL サーバが動いていないか、 CRL サーバから CRL ファイルが入手できないためです。
このように "dirmngr" とうまく連動できないなら、 とりあえず CRL の検査を無効にしましょう。 以下の行を "~/.gnupg/gpgsm.conf" に入れて下さい。
disable-crl-checks
そして、もう一度、以下のコマンドを実行します。
% gpgsm --detach-sign file > sig
ここで、秘密鍵を暗号化しているパフレーズを入力します。
分離署名ができたら、成功です。
分離署名を検証するには、以下のようにします。
% gpgsm --verify sig file
添付領域のパートに "SS" マーク (S/MIME 署名) を付けるには、 'M-s' とタイプします。
添付領域のパートに "SE" マーク (S/MIME 暗号) を付けるには、 'M-e' とタイプします。
'C-cC-s'、'C-cC-e'、'C-cC-b' および 'C-cC-r' を (PGP 用ではなく) S/MIME 用に使いたいなら、 以下のように設定します。
(setq mew-draft-privacy-method 'smime)
以下の値を 'mew-protect-privacy-always-type' に設定することも可能です。
たとえば、'C-cC-c' か 'C-cC-m' を押してメッセージを作成する際に、 常に S/MIME の署名を付けたいなら、以下のように設定します。
(setq mew-protect-privacy-always t) (setq mew-protect-privacy-always-type 'smime-signature)
Mew には、パスフレーズをキャッシュする機能があるので、 "gpg-agent" をデーモンとして起動しておく必要はないでしょう。 ただ、"gpgsm" をコマンドラインから実行し、 パスフレーズの入力を省略したいと思うなら、 以下のようにして "gpg-agent" を起動して下さい。
% gpg-agent --use-standard-socket --daemon
こうすれば、"gpgsm" をどこで実行しても構いません。 ("gpgsm" を "gpg-agent" の子プロセスとして起動する必要はありません。)