Hatena::ブログ(Diary)

架空線 はてな避難所

2009-11-23

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

/etc/dovecot/dovecot.conf

# 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
---------------------------------

If you install the ssl-cert package, a self-signed certificate will be
automatically created using the hostname currently configured on your computer.
You can recreate that certificate (e.g. after you have changed /etc/hosts or
DNS to give the correct hostname) as user root with:

        make-ssl-cert generate-default-snakeoil --force-overwrite

ssl-certパッケージをインストールした時に得たドメイン名になっているので、DNSなり/etc/hostsファイルなりを設定した後で、作り直すのもいいかもね。ということらしい。

もちろんVeriSignのような正規の認証局の署名を取得するような予算はどこにもないので、自前で認証局を用意して自己署名で証明書を発行することにする。

ちなみに、なぜデフォルトの自己署名証明書&鍵名がsnakeoilになっとるんじゃ? と思って軽くググってみると次のような理由らしい

http://www.hotfix.jp/archives/word/2005/word05-33.html

へー。いかがわしい万能薬のことで、サンプルのSSL認証局の名前なのか。皮肉が効いてていいね!


認証局(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:
-----
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]:Tokyo
Locality Name (eg, city) []:Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:AerialLine.com
Organizational Unit Name (eg, section) []:Manga Creation
Common Name (eg, YOUR name) []:www.aerialline.com
Email Address []:seo@aerialline.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
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:81
        Validity
            Not Before: Nov 22 22:29:50 2009 GMT
            Not After : Nov 21 22:29:50 2012 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = AerialLine.com
            organizationalUnitName    = Manga Creation
            commonName                = www.aerialline.com
            emailAddress              = seo@aerialline.com
        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
Certificate is to be certified until Nov 21 22:29:50 2012 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated


これで/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.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:AerialLine.com
Organizational Unit Name (eg, section) []:Manga Creation
Common Name (eg, YOUR name) []:www.aerialline.com
Email Address []:seo@aerialline.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

標準では、認証局と国コード・都道府県名・組織名の違う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から置き換える。デフォルト値がコメントアウトしてあるので、その下に新しい設定を並べておく。

/etc/dovecot/dovecot.conf

# 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 

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

Connection: close