SSL証明書作成
SSL(Secure Socket Layer)はHTTPやPOP3などの通信を暗号化し、セキュアなネットワーク接続を提供する上で欠かせない仕組みだ。とくにUbuntu Server 9.10の標準メール配送エージェントであるDovecotはデフォルトの設定でプレーンテキストでのパスワード認証を禁止しており、事実上SSLは必須の機能となっている。
ところが、デフォルトで作成されるSSLサーバ証明書は、サーバのインストール時のホスト名で登録されており、かならずしも公開時のサーバー名とは一致しない。クライアントのアプリケーションによっては、証明書の情報とサーバーのFQDNが食い違うと毎回警告ダイアログを出す場合があるため、個人用途としても実用的とは言い難い。
自署名のサーバ証明書(いわゆる第四種オレオレ証明書)を作成するための便利なコマンドとして、openssl -signkeyオプションや、それをラップするmake-ssl-certがあるが、今回は勉強のためにも認証局の設置から一通りの手順を踏んで、その過程を記録しようと思う。
最後におまけとして、make-ssl-certを使って一発で自己署名のサーバ証明書を作成する方法も、簡単に記載しておく。
インストール時点の証明書と秘密鍵
Ubuntu Server 9.10では、自己署名のサーバ証明書と秘密鍵はインストール時点ですでに用意されている。正確にはssl-certパッケージのインストール時に発行されるもので、それぞれ次の場所にある。
/etc/ssl/certs/ssl-cert-snakeoil.pem --サーバ証明書
/etc/ssl/private/ssl-cert-snakeoil.key --秘密鍵
ちなみにこの証明書と鍵は、apacheやdovecotなどのSSLを利用するプログラムにはすでに登録されている。
/etc/apache2/sites-available/default-ssl
# A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2.2-common/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before # dropping root privileges, so keep the key file unreadable by anyone but # root. #ssl_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem #ssl_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
さっそく証明書の内容を確認してみる。
$ openssl x509 -in /etc/ssl/certs/ssl-cert-snakeoil.pem -text Certificate: Data: Version: 1 (0x0) Serial Number: fc:61:ae:49:16:dd:bf:fe Signature Algorithm: sha1WithRSAEncryption Issuer: CN=akane.corega Validity Not Before: Nov 18 12:51:51 2009 GMT Not After : Nov 16 12:51:51 2019 GMT Subject: CN=akane.corega Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:a2:0a:6b:e8:24:0d:cc:d9:52:ad:39:c0:47:4a: de:f5:11:fd:d1:74:dc:9f:00:8e:d3:08:91:26:64: 7b:77:d5:1a:b0:5b:e1:88:ea:aa:a2:57:6d:e0:66: d7:17:8b:ac:b7:6d:5a:a7:cf:1a:c1:5e:8b:a8:f2: 77:76:57:63:d7:1e:f3:ba:2b:a3:4f:e3:a8:55:c9: da:2e:4c:7c:1e:19:c4:53:0a:9f:af:47:f8:a6:21: 10:04:10:5a:15:e8:0c:34:f5:ee:c6:f1:83:79:80: 1c:2b:37:9d:38:48:12:c9:4b:e8:b5:6f:08:94:62: c6:31:14:1d:c9:50:61:ec:e7 Exponent: 65537 (0x10001) Signature Algorithm: sha1WithRSAEncryption 9e:6f:5f:15:ce:18:7a:2d:bc:19:34:94:b5:9a:34:58:e6:61: af:a1:08:61:c5:c9:00:06:3e:66:b4:3d:2d:ea:61:c2:89:26: 98:19:95:2d:ff:ec:12:26:58:3f:96:12:e0:8a:c4:24:30:5c: ce:e7:fd:7e:a7:40:2d:4e:2b:88:b0:e7:c6:bf:26:e0:ce:5e: 9c:5d:ad:df:33:ea:f0:b4:3d:8e:e3:65:4d:b5:97:07:96:bc: 79:be:b8:76:b6:6d:b6:33:66:7d:7f:66:89:39:cb:e5:bf:84: f0:16:f4:16:6b:78:7b:a0:f6:d5:89:d0:00:bf:0b:46:7d:d7: 6f:be -----BEGIN CERTIFICATE----- MIIBpTCCAQ4CCQD8Ya5JFt2//jANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDEwxh a2FuZS5jb3JlZ2EwHhcNMDkxMTE4MTI1MTUxWhcNMTkxMTE2MTI1MTUxWjAXMRUw EwYDVQQDEwxha2FuZS5jb3JlZ2EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB AKIKa+gkDczZUq05wEdK3vUR/dF03J8AjtMIkSZke3fVGrBb4YjqqqJXbeBm1xeL rLdtWqfPGsFei6jyd3ZXY9ce87oro0/jqFXJ2i5MfB4ZxFMKn69H+KYhEAQQWhXo DDT17sbxg3mAHCs3nThIEslL6LVvCJRixjEUHclQYeznAgMBAAEwDQYJKoZIhvcN AQEFBQADgYEAnm9fFc4Yei28GTSUtZo0WOZhr6EIYcXJAAY+ZrQ9LephwokmmBmV Lf/sEiZYP5YS4IrEJDBczuf9fqdALU4riLDnxr8m4M5enF2t3zPq8LQ9juNlTbWX B5a8eb64drZttjNmfX9miTnL5b+E8Bb0Fmt4e6D21YnQAL8LRn3Xb74= -----END CERTIFICATE-----
IssuerとSubjectの項を見ると分かるように、ドメイン名がルータのDHCPで得たものになってしまっている。apache2.2-commonパッケージのDebian用READMEを開いてSSL関連の箇所を読むと、そのあたりの説明がある。
$ less /usr/share/doc/apache2.2-common/README.Debian.gz (抜粋) Creating self-signed certificates
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ssl-certパッケージをインストールした時に得たドメイン名になっているので、DNSなり/etc/hostsファイルなりを設定した後で、作り直すのもいいかもね。ということらしい。
、
もちろんVeriSignのような正規の認証局の署名を取得するような予算はどこにもないので、自前で認証局を用意して自己署名で証明書を発行することにする。
ちなみに、なぜデフォルトの自己署名証明書&鍵名がsnakeoilになっとるんじゃ? と思って軽くググってみると次のような理由らしい
認証局(CA)作成
SSLベースのサービスを提供するのに必要なのはサーバ証明書だが、その前段階としてまず認証局を作成する必要がある。証明書に対して署名をし、それを持つサーバが成りすましではないことのお墨付きを与えるためだ。「このオレが認める、ヤツは本物だ!」と言う場合の「オレ」を作成するわけだ。
ただし自己署名の場合は上記の「ヤツ」も「オレ」になるわけで、結果としては「このオレが認める、オレは本物だ!」と言っているのと変わらない。オレオレ証明書の面目躍如である。雑魚役フラグがたちまくりな気もするが、自称漫画家の自分としては、やや親近感を覚えざるを得ない。
余談は激しくさておき、認証局作成にあたってはCA.plを使う。オプションが複雑怪奇なopensslコマンドを隠して、もう少し分かりやすいインターフェースを提供するラッパースクリプトだ。
/etc/ssl/openssl.cnfに記載されている標準の設定では、カレントディレクトリに新しい認証局用ディレクトリdemoCAを作成し、その下に必要なファイル群を生成する。特にポリシーがあって設定を書き換えるのではないかぎり、/etc/sslにカレントディレクトリを移動してCA.plを起動した方が、幸せになれるかもしれない。
/etc/ssl$ sudo /usr/lib/ssl/misc/CA.pl -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key ......................................................................................................++++++ ......++++++ writing new private key to './demoCA/private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
-
-
-
- -
-
-
-
-
-
- -
-
-
これで/etc/ssl/demoCAディレクトリ以下に、認証局として必要なファイル一式が生成される。CAの秘密鍵と自己署名型証明書は次の場所にある。
/etc/ssl/demoCA/private/cakey.pem | 秘密鍵
/etc/ssl/demoCA/cacert.pem | 自己署名型証明書
一応証明書の内容を確認してみる。
$ openssl x509 -in demoCA/cacert.pem -text Certificate: Data: Version: 3 (0x2) Serial Number: c4:f5:e7:66:97:b4:02:81 Signature Algorithm: sha1WithRSAEncryption Issuer: C=JP, ST=Tokyo, O=AerialLine.com, OU=Manga Creation, CN=www.aerialline.com/emailAddress=seo@aerialline.com Validity Not Before: Nov 22 22:29:50 2009 GMT Not After : Nov 21 22:29:50 2012 GMT Subject: C=JP, ST=Tokyo, O=AerialLine.com, OU=Manga Creation, CN=www.aerialline.com/emailAddress=seo@aerialline.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:aa:c1:b0:2b:d2:02:f5:2f:04:30:34:78:fd:8f: b1:c6:c4:4e:01:44:a7:76:c8:4c:5e:61:bb:d9:a1: a7:00:8b:0c:f0:74:22:7c:01:e3:fb:51:68:a2:e3: ab:7c:4d:bc:ce:f9:7e:85:a8:6c:c1:b7:01:bf:df: af:ae:be:04:db:2f:b5:c8:5f:fa:a3:69:ec:f5:5b: 45:1c:17:ad:37:7f:00:8c:dd:ef:32:37:31:c5:8a: ed:03:fc:80:10:8a:6e:4a:95:9f:07:03:90:57:29: 52:cd:d1:69:36:9a:45:b2:7f:46:fd:69:05:be:db: f8:0c:28:5f:d3:b0:fc:d7:73 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 23:FB:F0:5A:9A:DD:6E:FA:5A:23:1D:01:13:A3:68:1C:77:9D:48:08 X509v3 Authority Key Identifier: keyid:23:FB:F0:5A:9A:DD:6E:FA:5A:23:1D:01:13:A3:68:1C:77:9D:48:08 DirName:/C=JP/ST=Tokyo/O=AerialLine.com/OU=Manga Creation/CN=www.aerialline.com/emailAddress=seo@aerialline.com serial:C4:F5:E7:66:97:B4:02:81 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha1WithRSAEncryption 9b:6a:17:5d:0b:b0:ab:da:15:84:8b:2e:c1:27:22:4e:22:08: f0:0f:3a:97:aa:89:21:ae:4b:87:06:40:1e:f0:7e:b4:47:6b: 7a:2d:72:a8:0a:cd:04:48:f1:07:04:96:fa:f4:ba:18:73:ae: ab:72:12:b0:41:eb:60:ce:bc:cc:5a:5d:e1:66:62:9d:04:8d: 56:ae:d5:8e:a4:e2:6b:f7:65:4a:ba:36:16:b1:4e:00:84:9e: 2a:e3:d1:1c:46:b3:d8:7c:86:d2:61:75:1f:32:35:f4:10:7e: 6a:3f:74:57:e2:e0:cf:b6:70:6d:be:d2:8d:a5:e4:bb:78:f0: bf:9d -----BEGIN CERTIFICATE----- MIIDljCCAv+gAwIBAgIJAMT152aXtAKBMA0GCSqGSIb3DQEBBQUAMIGPMQswCQYD VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xFzAVBgNVBAoTDkFlcmlhbExpbmUuY29t MRcwFQYDVQQLEw5NYW5nYSBDcmVhdGlvbjEbMBkGA1UEAxMSd3d3LmFlcmlhbGxp bmUuY29tMSEwHwYJKoZIhvcNAQkBFhJzZW9AYWVyaWFsbGluZS5jb20wHhcNMDkx MTIyMjIyOTUwWhcNMTIxMTIxMjIyOTUwWjCBjzELMAkGA1UEBhMCSlAxDjAMBgNV BAgTBVRva3lvMRcwFQYDVQQKEw5BZXJpYWxMaW5lLmNvbTEXMBUGA1UECxMOTWFu Z2EgQ3JlYXRpb24xGzAZBgNVBAMTEnd3dy5hZXJpYWxsaW5lLmNvbTEhMB8GCSqG SIb3DQEJARYSc2VvQGFlcmlhbGxpbmUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQCqwbAr0gL1LwQwNHj9j7HGxE4BRKd2yExeYbvZoacAiwzwdCJ8AeP7 UWii46t8TbzO+X6FqGzBtwG/36+uvgTbL7XIX/qjaez1W0UcF603fwCM3e8yNzHF iu0D/IAQim5KlZ8HA5BXKVLN0Wk2mkWyf0b9aQW+2/gMKF/TsPzXcwIDAQABo4H3 MIH0MB0GA1UdDgQWBBQj+/Bamt1u+lojHQETo2gcd51ICDCBxAYDVR0jBIG8MIG5 gBQj+/Bamt1u+lojHQETo2gcd51ICKGBlaSBkjCBjzELMAkGA1UEBhMCSlAxDjAM BgNVBAgTBVRva3lvMRcwFQYDVQQKEw5BZXJpYWxMaW5lLmNvbTEXMBUGA1UECxMO TWFuZ2EgQ3JlYXRpb24xGzAZBgNVBAMTEnd3dy5hZXJpYWxsaW5lLmNvbTEhMB8G CSqGSIb3DQEJARYSc2VvQGFlcmlhbGxpbmUuY29tggkAxPXnZpe0AoEwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCbahddC7Cr2hWEiy7BJyJOIgjwDzqX qokhrkuHBkAe8H60R2t6LXKoCs0ESPEHBJb69LoYc66rchKwQetgzrzMWl3hZmKd BI1WrtWOpOJr92VKujYWsU4AhJ4q49EcRrPYfIbSYXUfMjX0EH5qP3RX4uDPtnBt vtKNpeS7ePC/nQ== -----END CERTIFICATE-----
OKっぽい。最後に秘密鍵とprivateディレクトリのパーミッションを変更して、認証局の作成はdone。
$ sudo chmod 600 /etc/ssl/demoCA/private/cakey.pem $ sudo chmod 700 /etc/ssl/demoCA/private/
サーバ証明書の作成
いよいよ本命のサーバ証明書の作成。手続きとしては、次のように進む。
1.サーバ秘密鍵の作成
2.秘密鍵に基づいて、証明書署名要求(CSR)を作成
3.証明局(CA)でCSRに署名、サーバ証明書を発行。
サーバ秘密鍵の作成
$ sudo openssl genrsa -out ssl-cert-aerialline.key 1024 Generating RSA private key, 1024 bit long modulus .................++++++ ............++++++ e is 65537 (0x10001)
カレントディレクトリに生成された秘密鍵を、Root権限でのみ読み書きできるように変更。安全さえ確保されていれば、どこに置くかは好みでいいのだが、素直にsnakeoilの秘密鍵と相部屋にすることにする。/etc/ssl/privateディレクトリに移動。
$ sudo chmod 600 ssl-cert-aerialline.key $ sudo mv ssl-cert-aerialline.key /etc/ssl/private/
証明書署名要求(CSR)の作成
お次は、証明書署名要求(CSR)を前項で作成した秘密鍵を元に作成する。同じくopensslプログラムにreqコマンドをつけて起動。
$ sudo openssl req -new -key /etc/ssl/private/ssl-cert-aerialline.key -out ssl-cert-aerialline.csr 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.
-
-
-
- -
-
-
標準では、認証局と国コード・都道府県名・組織名の違うCSRには署名できない設定になっているので、上記で認証局を作った時と全く同じ内容を記載する。設定ファイルである/etc/ssl/openssl.cnfの[ policy_match ]セクションの内容を変更すれば、違う内容のCSRにも署名できるようになるそうだ。
カレントディレクトリに作成されたCSRの中身を確認すると、次のようになっている。
$ openssl req -in ssl-cert-aerialline.csr -text Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, L=Chiyoda-ku, O=AerialLine.com, OU=Manga Creation, CN=www.aerialline.com/emailAddress=seo@gmail.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:bf:58:fa:08:9d:38:1d:fd:86:a5:63:e8:92:3f: a2:ec:6b:67:e8:86:8e:a5:82:07:7f:60:98:86:79: 31:82:f4:36:5e:88:52:06:c9:01:0d:c9:cc:5f:e5: 0d:1a:18:b2:45:54:22:d3:12:b5:7f:47:e1:1f:59: fe:20:ce:24:c6:25:b0:02:10:5d:50:02:76:20:09: 02:da:fa:3c:76:69:1a:92:02:c2:58:a6:ef:31:e0: 28:c4:9d:70:d0:26:09:7a:e3:9c:8f:e4:e7:e5:73: 88:b0:27:75:b2:8f:3d:94:84:b9:97:3d:49:ec:c7: b3:23:db:14:32:10:db:62:c5 Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha1WithRSAEncryption 35:79:cd:6b:e9:c3:2c:c5:17:c6:b4:c2:68:37:ce:91:cd:46: e4:85:ac:cb:60:31:e7:85:88:f5:21:1d:64:92:de:ae:0a:2e: 2f:3c:5e:2a:0d:f4:55:37:f5:0a:0f:0e:49:16:4a:99:68:61: dd:c0:8e:9b:87:57:a3:32:cf:7c:2e:d3:5b:c7:cf:5f:c2:81: d3:be:c9:af:7c:ae:d1:f5:8f:0a:47:38:0f:02:40:1e:10:87: 35:ae:f2:86:7c:4e:89:d0:2d:41:4f:d1:b6:0e:34:1d:dc:91: 9e:b1:8d:29:2a:aa:e9:33:05:d4:f5:1b:e1:55:6a:f5:a5:4c: 66:b9
認証局(CA)による署名
最後に、先ほど立てた自前の認証局で、証明書署名要求(CSR)に対して署名する。やはりopensslをcaコマンドで起動。
/etc/ssl$ sudo openssl ca -in ssl-cert-aerialline.csr -out ssl-cert-aerialline.crt -config /etc/ssl/openssl.cnf Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: c4:f5:e7:66:97:b4:02:82 Validity Not Before: Nov 23 01:07:47 2009 GMT Not After : Nov 23 01:07:47 2010 GMT Subject: countryName = JP stateOrProvinceName = Tokyo organizationName = AerialLine.com organizationalUnitName = Manga Creation commonName = www.aerialline.com emailAddress = seo@aerialline.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 70:06:4C:6F:9B:68:5F:4F:69:06:F8:0F:21:1A:DB:08:0C:8A:CF:70 X509v3 Authority Key Identifier: keyid:23:FB:F0:5A:9A:DD:6E:FA:5A:23:1D:01:13:A3:68:1C:77:9D:48:08 Certificate is to be certified until Nov 23 01:07:47 2010 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
そして、以下が自己署名で発行されたサーバ証明書の内容。
$ sudo cat /etc/ssl/certs/ssl-cert-aerialline.crt Certificate: Data: Version: 3 (0x2) Serial Number: c4:f5:e7:66:97:b4:02:83 Signature Algorithm: sha1WithRSAEncryption Issuer: C=JP, ST=Tokyo, O=AerialLine.com, OU=Manga Creation, CN=www.aerialline.com/emailAddress=seo@aerialline.com Validity Not Before: Nov 23 02:40:01 2009 GMT Not After : Nov 23 02:40:01 2010 GMT Subject: C=JP, ST=Tokyo, O=AerialLine.com, OU=Manga Creation, CN=www.aerialline.com/emailAddress=seo@aerialline.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:bf:58:fa:08:9d:38:1d:fd:86:a5:63:e8:92:3f: a2:ec:6b:67:e8:86:8e:a5:82:07:7f:60:98:86:79: 31:82:f4:36:5e:88:52:06:c9:01:0d:c9:cc:5f:e5: 0d:1a:18:b2:45:54:22:d3:12:b5:7f:47:e1:1f:59: fe:20:ce:24:c6:25:b0:02:10:5d:50:02:76:20:09: 02:da:fa:3c:76:69:1a:92:02:c2:58:a6:ef:31:e0: 28:c4:9d:70:d0:26:09:7a:e3:9c:8f:e4:e7:e5:73: 88:b0:27:75:b2:8f:3d:94:84:b9:97:3d:49:ec:c7: b3:23:db:14:32:10:db:62:c5 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 12:B0:1F:47:6B:8F:07:32:1E:89:DE:0B:05:BF:FC:A7:56:7B:50:29 X509v3 Authority Key Identifier: keyid:23:FB:F0:5A:9A:DD:6E:FA:5A:23:1D:01:13:A3:68:1C:77:9D:48:08 Signature Algorithm: sha1WithRSAEncryption 21:b2:3d:4b:c8:0e:d3:08:f9:07:ec:65:fd:14:ec:a8:31:10: 88:90:33:3d:75:27:13:cf:de:26:13:aa:ea:a9:6d:20:a1:4f: 24:cc:37:f0:ef:86:cc:e5:bc:91:7b:8a:bc:00:d4:d7:9d:73: 79:6c:97:6d:27:47:d0:2c:cc:6d:48:28:d2:fd:53:af:2f:b6: 31:2d:a6:25:67:74:fc:08:56:d9:d4:c0:29:dc:b3:6d:62:83: db:c3:4d:19:12:8f:56:80:a4:a8:82:e9:7a:ff:2b:99:d4:d4: e7:2e:54:2e:03:4b:57:96:1c:ac:b0:e3:e7:df:2d:b5:d3:87: 13:d9 -----BEGIN CERTIFICATE----- MIIDGTCCAoKgAwIBAgIJAMT152aXtAKDMA0GCSqGSIb3DQEBBQUAMIGPMQswCQYD VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xFzAVBgNVBAoTDkFlcmlhbExpbmUuY29t MRcwFQYDVQQLEw5NYW5nYSBDcmVhdGlvbjEbMBkGA1UEAxMSd3d3LmFlcmlhbGxp bmUuY29tMSEwHwYJKoZIhvcNAQkBFhJzZW9AYWVyaWFsbGluZS5jb20wHhcNMDkx MTIzMDI0MDAxWhcNMTAxMTIzMDI0MDAxWjCBjzELMAkGA1UEBhMCSlAxDjAMBgNV BAgTBVRva3lvMRcwFQYDVQQKEw5BZXJpYWxMaW5lLmNvbTEXMBUGA1UECxMOTWFu Z2EgQ3JlYXRpb24xGzAZBgNVBAMTEnd3dy5hZXJpYWxsaW5lLmNvbTEhMB8GCSqG SIb3DQEJARYSc2VvQGFlcmlhbGxpbmUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQC/WPoInTgd/YalY+iSP6Lsa2foho6lggd/YJiGeTGC9DZeiFIGyQEN ycxf5Q0aGLJFVCLTErV/R+EfWf4gziTGJbACEF1QAnYgCQLa+jx2aRqSAsJYpu8x 4CjEnXDQJgl645yP5Oflc4iwJ3Wyjz2UhLmXPUnsx7Mj2xQyENtixQIDAQABo3sw eTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBD ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUErAfR2uPBzIeid4LBb/8p1Z7UCkwHwYDVR0j BBgwFoAUI/vwWprdbvpaIx0BE6NoHHedSAgwDQYJKoZIhvcNAQEFBQADgYEAIbI9 S8gO0wj5B+xl/RTsqDEQiJAzPXUnE8/eJhOq6qltIKFPJMw38O+GzOW8kXuKvADU 151zeWyXbSdH0CzMbUgo0v1Try+2MS2mJWd0/AhW2dTAKdyzbWKD28NNGRKPVoCk qILpev8rmdTU5y5ULgNLV5YcrLDj598ttdOHE9k= -----END CERTIFICATE-----
作成されたサーバ証明書ssl-cert-aerialline.crtを、好みの場所に移動する。ここでは、snakeoilと同じく/etc/ssl/certs/におじゃまするコトにする。証明書署名要求はもはやいらない子なので削除。
$ sudo mv ssl-cert-aerialline.crt /etc/ssl/certs/ $ sudo rm ssl-cert-aerialline.csr
アプリケーションの設定
新しく作成した自己署名サーバ証明書を運用するためには、SSLを利用するアプリケーションに証明書と秘密鍵を登録する必要がある。ApacheのSSLは使わないので(だってオレオレ証明書だし!)、ここではDovecotだけ設定する。
Dovecotの設定ファイルは冒頭で述べた場所にあるので、該当する部分をsnakeoilから置き換える。デフォルト値がコメントアウトしてあるので、その下に新しい設定を並べておく。
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before # dropping root privileges, so keep the key file unreadable by anyone but # root. #ssl_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem #ssl_key_file = /etc/ssl/private/ssl-cert-snakeoil.key ssl_cert_file = /etc/ssl/certs/ssl-cert-aerialline.crt ssl_key_file = /etc/ssl/private/ssl-cert-aerialline.key
設定を再読込させて完了。
$ sudo /etc/init.d/dovecot reload * Reloading IMAP/POP3 mail server dovecot
課題
証明書のcommonNameで指定したFQDNと実際に運用しているサーバのFQDNが違うと、メールクライアントが毎度文句を言ってくる。なので、mail.aerialline.comではなくwww.aerialline.comでメールサーバにアクセスせざるを得ない。
OpenSSLの設定をいじって登録情報が同じでなくても証明書に署名をするようにして、ヴァーチャルホストごとに証明書を作成するしかないのかな。もっとスマートな方法があるんだろうか。などと思いつつ、しばしこれで運用。
ちなみに……
冒頭で述べたmake-ssl-certコマンドを使うと、上記で述べたような手順をすっとばして、腰が抜けるほどカンタンに自己署名のサーバ証明書が発行できる。
$ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf ./ssl-cert-aerialline.pem
上記のコマンドを実行し、FQDNのホスト名を答えるだけで証明書が作成される。ただしこれで作成されたファイルは、証明書と秘密鍵が同梱されているので取り扱いに注意。ドキュメントでは、/etc/ssh/private内に置くことが推奨されている。
$ sudo mv ./ssl-cert-aerialline.pem /etc/ssl/private/
この場合には、各アプリケーションの設定で証明書と秘密鍵に同じファイルを指定すればよい。Dovecotであれば下記のように記述する。
ssl_cert_file = /etc/ssl/private/ssl-cert-aerialline.pem ssl_key_file = /etc/ssl/private/ssl-cert-aerialline.pem