STARTTLSはRFC2487 - SMTP Service Extension for
Secure SMTP over TLSで規定されています。
STARTTLSを使用することで、
リスト1: sendmail作成時の指定 PREPENDDEF(`confENVDEF', `-DSTARTTLS -D_FFR_TLS_O_T -D_FFR_TLS_1 -D_FFR_TLS_TOREK') APPENDDEF(`confINCDIRS', `-I/usr/local/include') ^^^^^^^^^^^^^^^^^^ APPENDDEF(`confLIBS', `-L/usr/local/lib -lssl -lcrypto') ^^^^^^^^^^^^^^ ↑opensslのライブラリがインストールされているディレクトリ
おそらく、暗号路を確保するのがSTARTTLS導入の大き な目的で、認証はSMTP AUTHで行うケースが多いでしょ うから、2)は必要ないかもしれません。2)を積極的に使 いたいとすれば、SMTP AUTHなどのように別途鍵を用意 するのではなく、証明書を用いて認証できるといったと ころでしょうか。これにより、他のPKI*5)アプリケー ションと証明書を共有できる可能性があります。
1) クライアントの認証を行わず、取り敢えず暗 号路を確保する。 2) 加えて、クライアントの認証を行い、リレー を許可したりする。
では、証明書を生成しましょう。証明書を生成するには /etc/mail/certsで以下のコマンドを実行します。
図1: 証明書用ディレクトリの作成 # cd /etc/mail # mkdir certs # chmod og-rwx certs
openssl req -new -x509 -nodes -out cert.pemいくつか質問してきますので適宜答えると、cert.pem とprivkey.pemが生成されます。(図2) cert.pemが証明書、 privkey.pemがプライベートキーです。
sendmailが文句を言わないように、証明書およびプライ ベートキーをrootのみがアクセスできるようにしておき ます。
図2: 証明書の生成 ume@piano:127# cd /etc/mail/certs ume@piano:128# openssl req -new -x509 -nodes -out cert.pem Using configuration from /etc/ssl/openssl.cnf Generating a 1024 bit RSA private key ..++++++ ...............................++++++ writing new private key to 'privkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mahoroba.Org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:piano.mahoroba.org Email Address []:postmaster@mahoroba.org
chmod og-rwx *では、sendmailに証明書の在処を教えてあげましょう。 リスト2を見て下さい。設定項目は以下の4項目です。
ここでは、CAを使用しませんので、confCACERTには自 分自身の証明書を指定しておきます。
- confCACERT_PATH
- CAの証明書が格納されているディレクトリのパスを指 定します。
- confCACERT
- CAの証明書のファイルを指定します。
- confSERVER_CERT
- 自サーバの証明書のファイルを指定します。 sendmailがサーバとして動作する際、ここで指定された 証明書が使用されます。
- confSERVER_KEY
- サーバの証明書のプライベートキーのファイルを指定 します。
リスト2: 認証なし時の.mcファイルの例 define(`confCACERT_PATH', `MAIL_SETTINGS_DIR`'certs/') define(`confCACERT', `confCACERT_PATH`'cert.pem') define(`confSERVER_CERT', `confCACERT_PATH`'cert.pem') define(`confSERVER_KEY', `confCACERT_PATH`'privkey.pem')
では、今設定を行ったsendmailに対して、STARTTLS付 で作られたsendmailからメールを送信してみましょう。 STARTTLSを使用した場合、メールのReceived:ヘッダに その旨が記録されます。(図4)
図3: STARTTLS動作確認 ume@piano:111> telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 piano.mahoroba.org ESMTP Sendmail 8.11.4/8.11.4/mille; Sat, 7 Jul 2001 20:54:45 +0900 (JST) EHLO localhost 250-piano.mahoroba.org Hello IDENT:nmJWAV9lLZG72sI253BxjMpoGrds2NrfSepB0uuLvu2l2DPTAWxL+Das3hXs4bPa@localhost [::1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-SIZE 250-DSN 250-ONEX 250-ETRN 250-XUSR 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5 250-STARTTLS <------------------ STARTTLSを返している 250 HELP
図4: STARTTLS使用時のReceived:ヘッダの例 Received: from peace.mahoroba.org (IDENT:Zph8oc9Mu6WRxMrGFR9Z5eK1baEXjQAzKbuhSyXE9NqGrkpajZw9Gi3Cf5RlpMog@peace.mahoroba.org [2001:200:301:0:200:f8ff:fe05:3eae]) by piano.mahoroba.org (8.11.4/8.11.4/piano) with ESMTP/inet6 id f67Bc1307862 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified NO) for <ume@mahoroba.org>; Sat, 7 Jul 2001 20:38:04 +0900 (JST) (envelope-from ume@mahoroba.org)
図5: 認証関係 ![]()
ここで、各ファイルの役割は図7の通りです。
図6: CA作成手順例 # cd /etc/ssl # mkdir CA # cd CA # mkdir certs crl newcerts private # chmod og-rwx private # echo "01" > serial # cp /dev/null index.txt
次に、/etc/ssl/openssl.cnfを編集します。最低限いじ る必要のある箇所は、
図7: CAのファイル構成 /etc/ssl/ ├ CA/ │ ├ cacert.pem CAの証明書 │ ├ certs/ 発行した証明書の置き場 │ ├ crl/ 発行したCRL*8)の置き場 │ ├ index.txt データベースの索引 │ ├ index.txt.old │ ├ newcerts/ 新規証明書の置き場 │ │ └ 01.pem 「シリアル番号.pem」というファイル名で │ │ 自動的に格納されます。 │ ├ private/ │ │ └ cakey.pem CAのプライベートキー │ ├ serial シリアル番号を保持 │ └ serial.old └ openssl.cnf openssl設定ファイル
dir = ./demoCA # Where everything is keptとなっている行です。CA用のディレクトリを /etc/ssl/CAとしますので、
dir = /etc/ssl/CA # Where everything is keptと書き変えます。
openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -days 365を実行し、いくつか質問に答えるとcacert.pemが生成さ れます。このとき、プライベートキーが /etc/private/cakey.pemに生成されます。(図8)
図8: CAの証明書の生成 ume@piano:151# cd /etc/ssl/CA ume@piano:152# openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -days 365 Using configuration from /etc/ssl/openssl.cnf Generating a 1024 bit RSA private key ............................++++++ .....++++++ writing new private key to 'private/cakey.pem' Enter PEM pass phrase:******** Verifying password - Enter PEM pass phrase:******** ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mahoroba.Org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:piano.mahoroba.org Email Address []:ca@mahoroba.org
openssl req -new -nodes -out newreq.pemを実行すると、newreq.pemとprivkey.pemが生成されま す。(図9) newreq.pemがCSR、privkey.pemがプライベー トキーです。
ここで生成されたnewreq.pemをすり替えられないよう安全な手段 でCAホストに持って行き、/etc/ssl/CAに置きます。そして、CAホ ストの/etc/ssl/CAで
図9: クライアント用CSRの生成 ume@piano:154# cd /etc/mail/certs ume@piano:155# openssl req -new -nodes -out newreq.pem Using configuration from /etc/ssl/openssl.cnf Generating a 1024 bit RSA private key ..........................++++++ .....................................++++++ writing new private key to 'privkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mahoroba.Org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:piano.mahoroba.org Email Address []:postmaster@mahoroba.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
openssl ca -policy policy_anything -out cert.pem -infiles newreq.pemを実行します。このとき、CAのプライベートキーを使用 しますので、パスフレーズを入力します。そして、署名 するかどうか、コミットするかどうか確認されますので、 CSRの内容を確認し、良ければどちらもyと答えます。(図10)
図10: 署名 ume@piano:164# openssl ca -policy policy_anything -out cert.pem -infiles newreq.pem Using configuration from /etc/ssl/openssl.cnf Enter PEM pass phrase:******** Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Kanagawa' localityName :PRINTABLE:'Yokohama' organizationName :PRINTABLE:'Mahoroba.Org' commonName :PRINTABLE:'piano.mahoroba.org' emailAddress :IA5STRING:'postmaster@mahoroba.org' Certificate is to be certified until Jul 7 10:46:50 2002 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
ここで、認証なしの場合に比べてクライアントの設定 項目が2つ増えています。
リスト3: 認証あり時の.mcファイルの例 define(`confCACERT_PATH', `MAIL_SETTINGS_DIR`'certs/') define(`confCACERT', `confCACERT_PATH`'cacert.pem') define(`confSERVER_CERT', `confCACERT_PATH`'cert.pem') define(`confSERVER_KEY', `confCACERT_PATH`'privkey.pem') define(`confCLIENT_CERT', `confCACERT_PATH`'cert.pem') define(`confCLIENT_KEY', `confCACERT_PATH`'privkey.pem')
また、confCACERTには、CAからcacert.pemをコピーし、 指定します。
- confCLIENT_CERT
- 自クライアントの証明書のファイルを指定します。 sendmailがクライアントとして動作する際、ここで 指定された証明書が使用されます。
- confCLIENT_KEY
- クライアントの証明書のプライベートキーのファイ ルを指定します。
ここで、クライアントの証明書がサーバの持っているCA の証明書で署名されていなかった場合、verified FAILと なります。一見失敗したように見えますが、この場合で もクライアントを識別できなかっただけで暗号路自体は 確保されています。信頼関係にないサーバの場合はご安 心下さい。
図11: クライアント認証時のReceived:ヘッダの例 Received: from peace.mahoroba.org (IDENT:lf6Tohk1y2yBEYwc5/4mzz/6ZH1/M8QRYvclvLndSngE4x5sqOemFxsxMpOWYrlC@peace.mahoroba.org [3ffe:505:2:0:200:f8ff:fe05:3eae]) by piano.mahoroba.org (8.11.4/8.11.4/piano) with ESMTP/inet6 id f67BnVL07964 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified OK) for <ume@mahoroba.org>; Sat, 7 Jul 2001 20:49:33 +0900 (JST) (envelope-from ume@mahoroba.org)
アクセス制御の設定はaccess map (/etc/mail/access) に記述します。認証手段として、 以下の2通りが使えます。
図12を見て下さい。これは、CAによって署名された 証明書の例です。ここで、Subject:行の「, 」を「/」に 置き換えたものが証明書所有者の識別名になります。ま た、DirName:行で識別名を保持しています。Issuer:行の 「, 」を「/」に置き換えたものが証明書発行者の識別名にな ります。
CERTISSUER - 証明書発行者つまりCAの識別名*11)による制御 CERTSUBJECT - 証明書所有者の識別名による制御
リスト4に証明書に基づいてリレーを許可する例を示し ます。この例では、証明書を発行したCAの識別名が
図12: CAによって署名された証明書の例 Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=JP, ST=Kanagawa, L=Yokohama, O=Mahoroba.Org, CN=piano.mahoroba.org/Email=ca@mahoroba.org Validity Not Before: Jul 7 10:46:50 2001 GMT Not After : Jul 7 10:46:50 2002 GMT Subject: C=JP, ST=Kanagawa, L=Yokohama, O=Mahoroba.Org, CN=piano.mahoroba.org/Email=postmaster@mahoroba.org Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:c5:6d:30:cd:41:10:38:07:ee:43:4e:09:84:d5: 6f:0f:a7:9d:29:87:18:bb:ba:9e:e4:c2:7e:81:40: 1f:35:bb:71:d9:88:3c:ec:cb:5e:6b:0a:23:e9:3d: 7d:f6:1f:d1:b6:6b:b8:f0:ff:d2:e6:9b:33:ff:24: 84:d1:ba:0e:fe:4c:96:40:32:b7:15:68:0a:d3:b4: 3f:e5:86:37:e9:aa:cb:08:c9:f8:b9:f5:5b:dc:a4: 1b:6a:5d:6d:e5:94:f4:f4:2d:af:c9:b1:b1:e7:1a: e9:7c:6d:40:f8:61:5e:90:31:c6:45:64:09:83:de: 81:4d:be:a9:46:b0:7b:ee:45 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 3F:DE:4F:33:55:03:21:16:A3:D0:3B:15:0B:6B:CC:E5:50:14:77:99 X509v3 Authority Key Identifier: keyid:8A:89:34:3B:38:53:6B:7A:36:CF:13:9E:65:7E:14:B0:89:4B:0A:7E DirName:/C=JP/ST=Kanagawa/L=Yokohama/O=Mahoroba.Org/CN=piano.mahoroba.org/Email=ca@mahoroba.org serial:00 Signature Algorithm: md5WithRSAEncryption 12:e8:a1:4c:45:84:f8:c5:09:76:0f:0e:a0:b5:15:26:42:fe: 86:f9:ba:8d:b4:59:9d:1f:19:62:44:f4:62:6c:ae:30:04:4c: 90:c6:15:66:31:58:6e:b8:a6:11:2d:9c:3b:b8:e5:10:61:c2: 9d:f4:8c:dd:43:66:9a:9b:71:5f:84:db:08:fb:aa:4b:9f:b4: a2:58:a4:e0:1c:74:ce:36:60:e7:cf:6b:2a:63:e3:ac:c3:ea: 66:60:b6:bd:db:01:e6:0c:ab:41:05:df:9c:f9:81:5b:a1:81: 6c:23:63:90:01:72:15:95:2c:f2:66:5a:5d:65:65:75:51:b2: ee:59 -----BEGIN CERTIFICATE----- MIIDozCCAwygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBhzELMAkGA1UEBhMCSlAx ETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhZb2tvaGFtYTEVMBMGA1UEChMM TWFob3JvYmEuT3JnMRswGQYDVQQDExJwaWFuby5tYWhvcm9iYS5vcmcxHjAcBgkq hkiG9w0BCQEWD2NhQG1haG9yb2JhLm9yZzAeFw0wMTA3MDcxMDQ2NTBaFw0wMjA3 MDcxMDQ2NTBaMIGPMQswCQYDVQQGEwJKUDERMA8GA1UECBMIS2FuYWdhd2ExETAP BgNVBAcTCFlva29oYW1hMRUwEwYDVQQKEwxNYWhvcm9iYS5PcmcxGzAZBgNVBAMT EnBpYW5vLm1haG9yb2JhLm9yZzEmMCQGCSqGSIb3DQEJARYXcG9zdG1hc3RlckBt YWhvcm9iYS5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMVtMM1BEDgH 7kNOCYTVbw+nnSmHGLu6nuTCfoFAHzW7cdmIPOzLXmsKI+k9ffYf0bZruPD/0uab M/8khNG6Dv5MlkAytxVoCtO0P+WGN+mqywjJ+Ln1W9ykG2pdbeWU9PQtr8mxseca 6XxtQPhhXpAxxkVkCYPegU2+qUawe+5FAgMBAAGjggETMIIBDzAJBgNVHRMEAjAA MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd BgNVHQ4EFgQUP95PM1UDIRaj0DsVC2vM5VAUd5kwgbQGA1UdIwSBrDCBqYAUiok0 OzhTa3o2zxOeZX4UsIlLCn6hgY2kgYowgYcxCzAJBgNVBAYTAkpQMREwDwYDVQQI EwhLYW5hZ2F3YTERMA8GA1UEBxMIWW9rb2hhbWExFTATBgNVBAoTDE1haG9yb2Jh Lk9yZzEbMBkGA1UEAxMScGlhbm8ubWFob3JvYmEub3JnMR4wHAYJKoZIhvcNAQkB Fg9jYUBtYWhvcm9iYS5vcmeCAQAwDQYJKoZIhvcNAQEEBQADgYEAEuihTEWE+MUJ dg8OoLUVJkL+hvm6jbRZnR8ZYkT0YmyuMARMkMYVZjFYbrimES2cO7jlEGHCnfSM 3UNmmptxX4TbCPuqS5+0olik4Bx0zjZg589rKmPjrMPqZmC2vdsB5gyrQQXfnPmB W6GBbCNjkAFyFZUs8mZaXWVldVGy7lk= -----END CERTIFICATE-----
自CAでないCAで署名された証明書についても認証できる ようにもできます。この場合、図13のようにCAの証明書 をconfCACERT_PATHに置きハッシュ値でアクセスできる ようにします。
リスト4: リレー許可の例 CERTISSUER:/C=JP/ST=Kanagawa/L=Yokohama/O=Mahoroba.Org/CN=ca.mahoroba.org/Email=ca@mahoroba.org RELAY CERTSUBJECT:/C=JP/ST=Kanagawa/L=Yokohama/O=Mahoroba.Org/CN=mail.mahoroba.org/Email=postmaster@mahoroba.org RELAY
図13: 他CAの証明書の登録 # cd /etc/mail/certs # cp SOME/WHERE/cacert.pem mahoroba.pem # ln -sf mahoroba.pem `openssl x509 -noout -hash < mahoroba.pem`.0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ↑ ハッシュ値を生成
| http://www.stunnel.org/ | |
| http://www.hitachi-ms.co.jp/bjorb/ | |
| RFC2246 - The TLS Protocol Version 1.0 | |
| sendmail 8.12.0.Betaからメールを出すと、サー バの識別状況がログに記録されます。そのうちに、 信頼関係にないサーバに対してはメールを送らな いとか設定できるようになるのかもしれません。 | |
| Internet X.509 Public Key Infrastructure | |
| CA - 認証局 (Certificate Authority) | |
| CERT - 証明書 (Certificate) | |
| CRL - 証明書失効リスト (Certificate Revocation List) | |
| 筆者はIKE (RFC2409 - The Internet Key Exchange) と共用しています。 | |
| CSR - 証明書署名要求 (Certificate Signing Request) | |
| DN - 識別名 (Distinguished Name) |