S/MIME入門

CACAnetフリースクール 久留米
2001年7月18日
発表者:山村友洋


● はじめに 電子メールで使用されてる署名・暗号の技術の一つS/MIMEについてopensslの smimeコマンドを用いた具体的な作成手順を主に解説していきます。 ● S/MIMEとは S/MIMEはMIMEの規格に基づき、認証、メッセージ本文と発信者の明確化、プラ イバシーとデータの保護といった暗号セキュリティ サービスを電子メールア プリケーションに提供するものです。 ● openssl smime コマンド where options are -encrypt encrypt message -decrypt decrypt encrypted message -sign sign message -verify verify signed message -pk7out output PKCS#7 structure -des3 encrypt with triple DES -des encrypt with DES -rc2-40 encrypt with RC2-40 (default) -rc2-64 encrypt with RC2-64 -rc2-128 encrypt with RC2-128 -nointern don't search certificates in message for signer -nosigs don't verify message signature -noverify don't verify signers certificate -nocerts don't include signers certificate when signing -nodetach use opaque signing -noattr don't include any signed attributes -binary don't translate message to text -certfile file other certificates file -signer file signer certificate file -recip file recipient certificate file for decryption -in file input file -inkey file input private key (if not signer or recipient) -out file output file -to addr to address -from ad from address -subject s subject -text include or delete text MIME headers -CApath dir trusted certificates directory -CAfile file trusted certificates file -rand file:file:... load the file (or the files in the directory) into the random number generator cert.pem recipient certificate(s) for encryption ● メッセージへ署名 ・準備 署名者(自分)の証明書 署名者(自分)の秘密鍵 署名するメッセージ ・メッセージへ署名 openssl smime -sign -signer 署名者証明書 -inkey 署名者秘密鍵 -in 署名する文章 -subject 件名 -to 先アドレス -from 自アドレス ・作成された署名のサンプル (---Begin of Sample---) To: yamamie@syslabo.co.jp From: yamamie@syslabo.co.jp Subject: Signsample MIME-Version: 1.0 Content-Type: multipart/signed ; protocol="application/x-pkcs7-signature" ; micalg=sha1 ; boundary="----55A998854B587950B7D19599C9726494" This is an S/MIME signed message ------55A998854B587950B7D19599C9726494 日本語で本文を書いてみています 内容はちゃんと表示されていますか? やまむら より ------55A998854B587950B7D19599C9726494 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIIFfQIBATELMAkGBSsOAwIaBQAwgAYJKoZIhvcNAQcB AACgggN9MIIDeTCCAuKgAwIBAgIBATANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQG EwJKUDEQMA4GA1UECBMHRnVrdW9rYTEPMA0GA1UEBxMGS3VydW1lMRAwDgYDVQQK <--- 中略 ---> STAnOoUmiH5T4pQ8bLKirXS+jW2qItrKpd/Gnys9VtpdxcCvx10OHQJA6pDBrSLD gdztZYiecqGLvW38y+C6nYZlkQQCseyHE7iR+UxYhyrwjK3ggD3eNZsnAdtdK3x6 EA84lQ9fcKYVMcq99e9nHPYrtnDbGOjO/nQ+hpupWVUAAAAA ------55A998854B587950B7D19599C9726494-- (---End of Sample---) ・解説 この署名メールで使用されている multipart/signed MIMEタイプは 2つの 部分からなり、 第1部分は署名をすべき MIME エンティティ 第2部分は PKCS #7 の分離署名 を含んでいます。 それらの区切りとなるものが boundary= 以下の文字列になりこれはMIMEの形 式にそったものとなっています。 また micalg=sha1 で示されているパラメータはメッセージ完全性チェック (Message Integrity Check)の計算で使われるメッセージ ダイジェスト ア ルゴリズムを指し示しているものであり、MD5とSHA-1が使用可能でそれらの値 はmd5とsha1になります。 ● 署名の検証 ・準備 CAの証明書 検証するメッセージ ・メッセージへ署名 openssl smime -verify -CAfile CA証明書 -in 検証ファイル ・検証サンプル (---Begin of Sample---) 日本語で本文を書いてみています 内容はちゃんと表示されていますか? やまむら より Verification Successful (---End of Sample---) ・解説 署名の検証ではマルチパートの第1部分のMIMEエンティティを元にmicalgで指 定されているメッセージダイジェストを取り署名されたメッセージの完全性の 確認をとり、第2部分のPKCS #7の分離署名より送信してきたユーザの証明書 を元にCAの鍵と照らし合わせ鍵の確認を行い署名されたメッセージの検証を行 います。 これらの検証により上記のように成功すれば Verification Successful と 表示され、検証が出来なかった場合は Verification Failure と表示されま す。 ● メッセージの暗号 ・準備 送信者の証明書 暗号するメッセージ ・メッセージを暗号 openssl smime -encrypt -rc2-40 -subject 件名 -to 先アドレス -from 自アドレス -in 暗号化する文章 送信相手証明書 ・作成された暗号サンプル (---Begin of Sample---) To: yamamie@syslabo.co.jp From: yamamie@syslabo.co.jp Subject: Encsample MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; name="smime.p7m" Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHA6CAMIIBrQIBADGCARowggEWAgEAMH8wejELMAkGA1UEBhMC SlAxEDAOBgNVBAgTB0Z1a3Vva2ExDzANBgNVBAcTBkt1cnVtZTEQMA4GA1UEChMH c3lzbGFibzEQMA4GA1UEAxMHWUFNQSBDQTEkMCIGCSqGSIb3DQEJARYVeWFtYS1j YUBzeXNsYWJvLmNvLmpwAgEBMA0GCSqGSIb3DQEBAQUABIGArcHOHFKEiB+3lfuv 28QvTEssAgKC/XNhYa13J8xDEn4NfaRzAyD5OTma2NNDebSl9dj/9AOLa90XTVUm BYTYj9QfvcjQxujZPJQYAUKtt+ujS9boW87nI/0tW1frpV4mMDa4YPaGItMr9Duf YeI3xGqUZEMdrBYApAqe76Zzn/AwgYkGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAO AgIAoAQIxkufhoSrJGiAYCnlg/dBOiX1i7iCy/NTNQIBByrYZmKuQj5/GEirNm12 PB3M8TnGqnGwMNwaEl2Du1/qw5C76o2yGF7hVxeC4UTqJNCEXN1Mj7UtFqZAq46c lxg3Mp8+HErZdIVuaZyZCAAAAAA= (---End of Sample---) ● 暗号メッセージの復号 ・準備 自分の証明書 自分の秘密鍵 暗号メッセージ ・復号 openssl smime -decrypt -recip 自分の証明書 -inkey 自分秘密鍵 -in 暗号メッセージ ・復号サンプル (---Begin of Sample---) 日本語で本文を書いてみています 内容はちゃんと表示されていますか? やまむら より (---End of Sample---) ・解説 自分の秘密鍵のパスフレーズを入力して復号