LinuxインターネットサーバーのSSL証明書管理
〜Kousec Server Certificate Managerの導入効果の検証〜
第二回 サーバー上でのSSL設定作業
株式会社コウセック・ソフトウェア
Copyright 2009 Kousec Software, Inc. All rights reserved.
All company names and product names are trademarks of their respective holders.
シリーズインデックス
http://www.kousec.com/prod_cm_ja.html
第一回: 検証構成とSSL証明書の取得・配備計画
PDF: http://www.kousec.com/tj/tj_review_S1.pdf
第二回: サーバー上でのSSL設定作業
PDF: http://www.kousec.com/tj/tj_review_S2.pdf
第三回: 証明書仕様の定義と証明書の取得
PDF: http://www.kousec.com/tj/tj_review_S3.pdf
第四回: 証明書の配備と監視
PDF: http://www.kousec.com/tj/tj_review_S4.pdf
第五回: セキュリティと運用のベストプラクティス
PDF: http://www.kousec.com/tj/tj_review_S5.pdf
Table of Contents
サーバー上でのSSL設定作業............................................................................................ 5
Linux OSのインストールと各サーバーソフトウェアのインストール............................ 6
証明書関連ファイルのサーバー上での配置場所は?....................................................... 6
サーバーソフトウェア間での証明書関連ファイルは共有していいの?....................... 8
各サーバーソフトウェアのSSL証明書の初期設定を行う.............................................. 9
自己署名証明書の生成................................................................................................. 9
OpenLDAP (slapd)................................................................................................... 10
Apache2 (httpd)....................................................................................................... 12
FTP Server (vsftp).................................................................................................... 13
SMTP Server (Postfix)............................................................................................. 14
POP/IMAP Server (Dovecot).................................................................................... 15
Tomcat6.................................................................................................................... 17
サーバー作業の確認...................................................................................................... 19
第一回では、サーバー上にインストールするサービスとそれに伴うSSLサーバー証明書の要件を定義しました。今回からは実際にサーバーソフトウェアのインストール・設定、証明書の取得配備といった作業を行っていきます。
検証の全体作業の流れは以下のとおりです。
1. SSL証明書の取得・配備計画の作成
2. Linux OSのインストール・各サーバーソフトウェアのインストール
3.
各サーバーソフトウェアのコンフィギュレーション
このコンフィギュレーション内で、まず自己署名証明書が作成され、それを用いてSSLを設定しておきます。
4.
Kousec Server Certificate Manager上で証明書定義を作成
ステップ1で決めた証明書要件を証明書定義として作成していきます。
5.
Kousec Server Certificate Manager上で証明書取得プロセスを実行
証明書をCAから取得し証明書リポジトリに保存します。今回は各証明書をビルトインプライベートCAから発行します。
6.
Kousec Server Certificate Manager上で証明書配備プロセスを実行
証明書リポジトリに保存された証明書を定義されたサーバーに配備していきます。具体的には各サービスに対して証明書のインストールを行います。ここで、ステップ3で作成された自己署名証明書をCAからの証明書で置き換えることになります。
7. Kousec Server Certificate Manager上で配備した証明書の監視設定を実施
それぞれのステップを回を分けて説明していきます。
第二回: ステップ2、ステップ3
第三回: ステップ4、ステップ5
第四回: ステップ6、ステップ7
第五回: 運用ベストプラクティス、まとめ
また、今回から本文中でKousec Server Certificate Managerの略称として 「CertMgr」や「Kousec CertMgr」 を使います。
今回の検証ではUbuntu Server 9.04を使用します。
OSのインストール時には、Software selectionにて LAMP server, Mail server, OpenSSH server, Tomcat Java serverを選択しました。また足りないパッケージについてはUbuntu Server Guideに従い apt-get コマンドで追加インストールしていきます。
下記ガイドを参考にしてインストールを行います。
Ubuntu Server Guide 9.04 https://help.ubuntu.com/9.04/serverguide/C/index.html
各サーバーソフトウェアのSSLコンフィギュレーションを行うまえに、Linuxサーバー上での証明書関連ファイルの配置場所について考えておく必要があります。
Ubuntu ServerやCentOS 5.xではSSLサーバー証明書を、各サーバーソフトウェアの設定ファイルとは別に、ある特定のディレクトリ配下に配置することを推奨しているようです。Ubuntu Serverでは下記ディレクトリに証明書関連ファイルを置いています。
/etc/ssl/certs/ : サーバーおよびCAのSSL証明書
/etc/ssl/private/ : サーバー証明書の秘密鍵
CentOS 5.xでも同様です。
/etc/pki/tls/certs/ : サーバーおよびCAのSSL証明書
/etc/pki/tls/private/ : サーバー証明書の秘密鍵
しかし、将来のサーバー拡張に備えて、各サーバーソフトウェアが提供するサービスはサーバーマシンと出来るだけ疎な関係にしておき、サーバーソフトウェアの関連ファイルだけを別サーバーに簡単に持っていけるようにしておきたいと考えます。 上記の慣習に従った場合、具体的には以下のような問題が出ます。
・
秘密鍵ファイルのパーミッションの設定が複雑になる。
秘密鍵ファイルはサーバーソフトウェアだけが読めるように設定しなければなりません。多くのサーバーソフトウェアはまだrootユーザーで実行中の間に秘密鍵を読み込み、その後、指定された一般ユーザーまで権限を落とすという動作を行うので、rootユーザーだけが秘密鍵を読み込めればよいのですが、そうではないサーバーソフトウェアもあります。例えばOpenldapはopenldap用一般ユーザーで秘密鍵を読みに行きます。その場合、秘密鍵ファイルおよびそのディレクトリprivateはrootだけでなくopenldapユーザーでも読めるように設定しておかなければなりません。Tomat6も同様にtomcat6ユーザーで秘密鍵ファイルを読みに行きます。したがってprivateディレクトリはtomcat6ユーザーでも読めるように設定する必要が出てきます。他のサーバーソフトウェアとprivateディレクトリや秘密鍵ファイル自体を共有した環境でこのような設定を行うのは多くのミスを招きやすいものです。[1](読めるべきものが読めなかったり、読めないはずのものが読めたりする。)
・ あるサーバーソフトウェアを別サーバーに移行する際などでサーバーソフトウェア環境をバックアップすると他サービスの秘密鍵までバックアップ・転送されてしまう。例えばFTPサービスを別マシンに移行するのにLDAPサービスの秘密鍵まで間違ってコピーされ移行先サーバーにおかれるというミスがおきやすくなります。
・ あるサーバーソフトウェアが侵入された場合他のサーバーソフトウェア用の秘密鍵も危機にさらされる。
上記理由から、サービスに付随すべきSSL証明書はそのサーバーソフトウェアの他の設定ファイルと同じ場所に配置しておき、パーミッションをrootだけ、必要ならそのサーバーソフトウェア専用のユーザーだけに与えるように設定していくこととします。具体的には、例えばApacheが使うSSL証明書であれば、/etc/apache2/、OpenLDAPであれば/etc/ldap/の下にssl/certsとssl/privateディレクトリを作りそこに格納します。
証明書ファイル: /etc/<サーバーソフトウェア名>/ssl/certs/<証明書名>.crt
秘密鍵ファイル: /etc/<サーバーソフトウェア名>/ssl/private/<証明書名>.key
証明書チェーンファイル: (サーバー証明書が中間CAに署名されている場合のみ)
/etc/<サーバーソフトウェア名>/ssl/certs/<証明書名>-chain.crt
トラストCAファイル: (多くの場合SSLクライアント認証のときだけ必要)
/etc/<サーバーソフトウェア名>/ssl/certs/trusted-ca.crt
ファイルの場所に関する注意: Ubuntu Server上でデフォルトで稼動しているAppArmorがあるサーバーソフトウェアに対して有効になっている場合、そのサーバーソフトウェアはAppArmorで設定されたファイル・ディレクトリに対してしか読み書きができないようになります。上記のようにファイルの格納場所を検討する場合はAppArmorのプロファイルも確認する必要があります。apparmor_statusコマンドで現在のプロファイルが確認できます。Ubuntu Server 9.04ではslapd(OpenLDAP)にAppArmorプロファイルが適用されています。
下記に今回使用するサービスと証明書の場所・パーミッションなどを整理した表を掲載しておきます。
なお、後ほど使用するCertMgrでは各サーバーソフトウェアの設定ファイルから証明書関連ファイルの場所を読み出すようになっており、これらの場所を一つずつ入力していく必要はありません。
表 1 証明書関連ファイルの場所とセキュリティ設定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
サーバーソフトウェア間での証明書関連ファイルは共有していいの?
Ubuntu Serverのデフォルトでは単一の自己署名証明書のファイルを物理的にも複数のサーバーソフトウェア間で共有しています。証明書の更新作業の削減のためだと思われますが、これだと証明書を共有しているサービス全てを停止してから証明書の更新が必要になります。
サーバーとサービスを分離するという原則からは、たとえマルチドメイン証明書を複数のサービスが使う場合でも物理的には別ファイルにしておくほうがよいでしょう。サービスの独立性が向上し、サービス毎に証明書の更新等が可能になります。
今回の検証では、POPとIMAP、FTPとWWW2がそれぞれマルチドメイン証明書を使います。POPとIMAPはDovecotという単一のサーバーソフトウェアの制御下で共有されるので物理的にファイルも共有します。FTPとWWW2はそれぞれvsftpdとtomcat6が使用するのでファイルは別にしておきます。(ちなみにtomcat6ではJKSという証明書形式を使うためそもそもvsftpdと証明書ファイルを共有することはできません)
さて、証明書の配置方針が決まったら、各サーバーソフトウェアの設定を行っていきます。Ubuntu Server 9.04ではソフトウェアパッケージのインストールと同時に基本的な設定も自動的に行われます。ただしSSLとその証明書の設定は多くのケースでほとんど行われないので、Ubuntu Serverの公式マニュアルであるUtuntu Server Guideにしたがって、SSLの設定を行っていきます。ここでは、SSLとSSL証明書に関するポイントを記載します。
なお、記載しているコマンドはすべて rootになって実行します。(sudo –sでrootでシェルが起動する)
Ubuntu Server Guideでは、まず自己署名のサーバー証明書を一つ作り、全てのサーバーソフトウェアがそれを共有するという形でのコンフィギュレーションを説明しています。Ubuntu Server 9.04ではOSインストール時に一つでもSSLを使うサーバーソフトウェアをインストールしていると自動的に自己署名したサーバー証明書が下記の場所に作成されています。
/etc/ssl/certs/ssl-cert-snakeoil.pem
サーバー証明書
/etc/ssl/private/ssl-cert-snakeoil.key
サーバー秘密鍵
我々はSSLの初期設定としてこの自己署名証明書を各サーバーソフトウェア用にコピーして証明書の設定を行っていきます。
万が一この自己署名証明書を再作成したい場合は、Ubuntu Server GuideのCreating a Self-Signed Certificateでの手順に従うか下記コマンドを実行すればよいでしょう(よりコマンド数を削減した手順です)。
> cd /tmp
> openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout server.key
-out server.crt
[DNの情報を入力。Common Nameにldap.example.comを入力。後はデフォルトにしたがってEnterを押していけばよい。]
> cp server.crt /etc/ssl/certs/ssl-cert-snakeoil.pem
> cp server.key /etc/ssl/private/ssl-cert-snakeoil.key
Ubuntu Server GuideのOpenLDAP Server章にしたがってインストールと設定を行っていきます。apt-get installでインストールと基本的な設定が終わりますので、基本動作確認後、SSLの設定を行います。
Ubuntu Server Guideとは異なる場所にあるSSL証明書を設定します。SSL証明書パラメーターと設定すべきパスは以下のとおりです。
olcTLSCertificateFile
/etc/ldap/ssl/certs/ldap.example.com.crt
olcTLSCertificateKeyFile
/etc/ldap/ssl/private/ldap.example.com.key
olcTLSCACertificateFile
/etc/ldap/ssl/certs/trusted-ca.crt
ポイントは以下です。
・ 鍵ファイルはrootユーザーではなくopenldapユーザーで読み込まれるのでopenldapユーザーにreadパーミッションを与えなければならない。
・ slapdでは、SSLクライアント認証を行わない場合でもトラストCAファイルを指定する必要がある。自己署名証明書を使う場合、その証明書だけを格納しておく。
以下のコマンドで自己署名証明書をslapd用にコピーしてきます。
>mkdir -p /etc/ldap/ssl/certs
>mkdir /etc/ldap/ssl/private
>cd /etc/ldap/ssl
>chgrp openldap private ; chmod 0750 private
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/ldap.example.com.crt
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/trusted-ca.crt
>cp /etc/ssl/private/ssl-cert-snakeoil.key private/ldap.example.com.key
>chgrp openldap private/* ; chmod 0640 private/*
あとはUbuntu Server Guideに従い、ldapmodifyコマンドでcn=configに証明書関連ファイルの場所を設定します。なおUbuntu Server Guideではldifファイルを作らず直接入力する方法を示しているがldifファイルを作成したほうがミスが少なくなるでしょう。参考にldifファイルと必要なコマンドを載せておきます。
下記内容をcertfile.ldifというファイル名で保存する。
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/certs/ldap.example.com.crt
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/private/ldap.example.com.key
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/ssl/certs/trusted-ca.crt
コマンド
> ldapmodify -x -D cn=admin,cn=config -W -f certfile.ldif
ここで1点注意しなければならないのは、SSL証明書関連ファイルの設定が間違っていると通常の方法ではslapdが起動しなくなることです。しかしslapdが起動しなければldapmodifyコマンドでパラメーターを変更できません。その状態に陥った場合は、openldapユーザーで/etc/ldap/slapd.d/cn=config.ldif をviで開き、olcTLSCertificateFileなど3行を削除すれば起動するようになります。
そうなる前に、ldapmodifyコマンドを打つ前に下記の確認方法で証明書関連ファイルの整合性を確認しておくのがよいでしょう。
確認方法
> su -s /bin/bash openldap
[ パーミッションも確認するため openldapユーザーで実行する ]
> openssl verify -CAfile certs/trusted-ca.crt certs/ldap.example.com.crt
[ certs/ldap.example.com.crt: OK と表示されればOK]
> openssl x509 -noout -modulus -in certs/ldap.example.com.crt |
openssl md5
[ MD5のハッシュ値(1)が表示される。]
> openssl rsa -noout -modulus -in private/ldap.example.com.key | openssl md5
[ ここで表示されるMD5ハッシュ値が(1)の値と一致すればOK ]
あとは、Ubuntu Server Guideどおり、/etc/default/slapdで”ldaps”を有効にし、slapdを再起動させます。
Ubuntu Server GuideのApache2 Web Server章にしたがってインストールと設定を行っていきます。Ubuntu Server 9.04では、Apache2をインストールするとデフォルトのSSL仮想サーバーの設定ファイルまで自動的に作成されます。使用される証明書は/etc/ssl/certsにある自己署名証明書です。
これをApache2専用に配置した証明書を使うように設定ファイルを書き換えます。
証明書関連設定ファイル /etc/apache2/sites-available/default-ssl
パラメータの値は以下のとおり。
SSLCertificateFile
/etc/apache2/ssl/certs/www.example.com.crt
SSLCertificateKeyFile
/etc/apache2/ssl/private/www.example.com.key
(SSLCerticateChainFile
は自己署名証明書の場合設定しない)
以下のコマンドで自己署名証明書をapache2用にコピーしてくる。
>mkdir -p /etc/apache2/ssl/certs
>mkdir /etc/apache2/ssl/private
>cd /etc/apache2/ssl
>chgrp root private ; chmod 0700 private
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/www.example.com.crt
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/trusted-ca.crt
>cp /etc/ssl/private/ssl-cert-snakeoil.key private/www.example.com.key
>chgrp root private/* ; chmod 0700 private/*
そして、もしまだなら、”a2enmod ssl ; a2ensite default-ssl” を実行しSSLを有効にします。
最後にApache2を再起動して動作確認を行います。
Ubuntu Server Guideのvsftpdの章にしたがってインストールと設定を行っていきます。Ubuntu Server 9.04では、vsftpdをインストールするとデフォルトの自己署名証明書を使うよう設定されます。
これをvsftpd専用に配置した証明書を使うように設定ファイルを書き換えます。
証明書関連設定ファイル /etc/vsftpd.conf
パラメータの値は以下。
rsa_cert_file=/etc/vsftpd/ssl/certs/www2.example.com.crt
rsa_private_key_file=/etc/vsftpd/ssl/private/www2.example.com.key
vsftpdでは/etc配下に専用のディレクトリを持っていません。今回SSL証明書を格納するために/etc/vsftpd というディレクトリを作成します。
以下のコマンドで自己署名証明書をvsftpd用にコピーします。
>mkdir -p /etc/vsftpd/ssl/certs
>mkdir /etc/vsftpd/ssl/private
>cd /etc/vsftpd/ssl
>chgrp root private ; chmod 0700 private
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/www2.example.com.crt
>cp /etc/ssl/private/ssl-cert-snakeoil.key private/www2.example.com.key
>chgrp root private/* ; chmod 0700 private/*
vsftpdを再起動して動作確認を行います。
今回構築するSMTPサーバーには3つの機能が必要です。
A) 社内PCからの社外向け送信メールを受け取る (認証付SMTP Server機能)
B) 社外向けメールをインターネットへ転送する (SMTP Client機能)
C) インターネットから社内向けメールを受信する (公開SMTP Server機能)
この中でSSLサーバー証明書が頻繁に使われるのはAのケースだけです。SMTP認証を行うときの暗号化と相手認証のためにSSLが使用されます。ここではAに関連するSSL証明書についてのみ説明します。
Aの機能の仕様は以下のとおり。
l SMTP認証でメール送信を要求するユーザーを認証する。
l 送信専用ポート(submission port) TCP/587で受け取る
l TLSで暗号化とサーバー認証を行う
Ubuntu Server 9.04では、Postfixをインストールするとデフォルトの自己署名証明書が設定されたコンフィグファイルが作られます。またUbuntu Server Guideに従いdovecot-postfixというパッケージをインストールすると、SMTPユーザー認証をPOP/IMAPサーバーであるDovecot内のユーザー認証機能を使って実現するようになります。(ちなみにdovecot-postfixをインストールするとその延長でDovecot自体がインストールされます)。また、送信専用ポート587番はデフォルトでは有効になっていないので、/etc/postfix/master.cfファイルを開き”submission”の行を有効にします。
ではここから、SSLサーバー証明書の設定を行って行きましょう。Postfix専用に配置した証明書を使うように設定ファイルを書き換えます。
証明書関連設定ファイル /etc/postfix/main.cf
パラメータの値は以下を設定します。
smtpd_tls_cert_file=/etc/postfix/ssl/certs/smtp.example.com.crt
smtpd_tls_key_file=/etc/postfix/ssl/private/smtp.example.com.key
また、main.cfを修正するときに、ついでに下記パラメーターもコメントアウトしておきます(Ubuntu 9.04のdovecot-postfixパッケージのバグのようです)
smtpd_tls_mandatory_ciphers = medium, high
では、以下のコマンドで自己署名証明書をPostfix用にコピーします。
>mkdir -p /etc/postfix/ssl/certs
>mkdir /etc/postfix/ssl/private
>cd /etc/postfix/ssl
>chgrp root private ; chmod 0700 private
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/smtp.example.com.crt
>cp /etc/ssl/private/ssl-cert-snakeoil.key private/smtp.example.com.key
>chgrp root private/* ; chmod 0600 private/*
なお、PostfixがSMTP Clientとして動作する場合に使用できるSSLクライアント証明書は設定しません。SMTPでSSLを利用する主な目的は、SMTP認証を行うときの暗号化と相手認証です。
最後にPostfixを再起動して動作確認を行います。
Ubuntu Server 9.04では、Dovecotをインストールするとデフォルトの自己署名証明書が設定されたコンフィグファイルが作られます。なおUbuntu Server GuideではPostfixのインストールにおいてSMTP-AUTHを有効にするために、dovecot-postfix というパッケージのインストールを推奨しています。これをインストールするとその延長でDovecot自体もインストールされますので既にDovecotはインストールされているはずです。
またUbuntu
Server GuideのDovecotインストールの章に書かれていないのですが、dovecot-postfixパッケージをインストールした場合、Dovecotのメインのコンフィグファイルは /etc/dovecot/dovecot.conf ではなく /etc/dovecot/dovecont-postfix.conf になります。Postfixもインストールした環境において、Ubuntu Server Guideを見ながらDovecotの設定を行う場合 dovecot.confをdovecot-postfix.conf と読み替える必要があります。
ではSSL証明書の設定を行っていきましょう。Dovecot専用に配置した証明書を使うようにコンフィグファイルを書き換えます。
証明書関連設定ファイル /etc/dovecot/dovecot-postfix.conf
(dovecot-postfixパッケージを導入していない場合は /etc/dovecot/dovecot.conf)
パラメータの値は以下。
ssl_cert_file
= /etc/dovecot/ssl/certs/pop.example.com.crt
ssl_key_file
= /etc/dovecot/ssl/private/pop.example.com.key
以下のコマンドで自己署名証明書をDovecot用にコピーします。
>mkdir -p /etc/dovecot/ssl/certs
>mkdir /etc/dovecot/ssl/private
>cd /etc/dovecot/ssl
>chgrp root private ; chmod 0700 private
>cp /etc/ssl/certs/ssl-cert-snakeoil.pem certs/pop.example.com.crt
>cp /etc/ssl/private/ssl-cert-snakeoil.key private/pop.example.com.key
>chgrp root private/* ; chmod 0600 private/*
最後にDovecotを再起動して動作確認を行います。
最後のサーバーソフトウェアはTomcat 6です。
UbuntuではTomcatをインストールするのに2つの方法があります。一つ目は他のサーバーソフトウェアと同様にシステムにインストールしOSの起動にあわせて起動される方法です(System-wide installation)。もう一つは開発者向けに開発者のプライベートなインスタンスとしてインストールし可能する方法です(Using private instances)。今回はTomcatも運用向けに使用しますので、System-wide installationの方法でインストールを行います。Ubuntu Server Guideに従いインストールします。
SSL証明書の設定方法は、Ubuntu Server Guideには記載されていません。しかしApache Tomcatのマニュアル(http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html)を見ると簡単に設定できます。参考にここにも記載しておきます。
Tomcatでは他のUnixサーバーソフトウェアと異なり、Java Key Store (JKS)というファイルに証明書と秘密鍵を格納します。下記の場所にJKSファイルを置きます。
JKSファイル /etc/tomcat6/ssl/private/www2.example.com.jks
なお、tomcatはrootで起動してtomcat6ユーザーに権限を落としてからこのJKSファイルを読みに行きます。したがって下記コマンドでprivateディレクトリとその中のファイルには下記パーミッションに設定しておきます。
owner:group root:tomcat6 permission: 0640
注意: Tomcat 6.0からは、オプションとしてOpenSSLを使ったSSLエンジンも使用可能になったようです。今回はこちらは使用しませんのでマニュアルを読む際注意してください。
JSEEベースのSSLコネクター: 今回使用する
APR/OpenSSLベースのSSLコネクター:使用しない
SSLの初期設定時点では、このJKSファイルに自己署名証明書を生成・格納しておきます。そしてCertMgrを使って、正式な証明書と置き換えることにします。
1.
下記コマンドで自己署名証明書を生成しておきます。
>mkdir -p
/etc/tomcat6/ssl/private
>keytool -genkey -alias tomcat -keyalg RSA -keystore /etc/tomcat6/ssl/private/www2.example.com.jksパスワードはkeystore passwordとkey passwordという二つのパスワードの入力が求められます。Tomcatではこの2つを一致させる必要がありますので同じものを入力してください。Tomcatのデフォルトはchangeitですので、それを入力します。
あとは自己署名証明書に格納するDNに関する情報です。これについてはあとでCertMgrから正式な証明書で置き換えるのでここではデフォルトのまま進めてください。
最後にJKSファイルの権限を設定します。
>cd /etc/tomcat6/ssl
>chgrp tomcat6 private ; chmod 0750 private
>chgrp tomcat6 private/* ; chmod 0640 private/*
2. /etc/tomcat6/server.xml のSSLコネクターの設定を編集します。
(ア) SSLコネクター全体がコメントアウトされているのでそれを有効にする。
(イ) keystoreFileパラメータでJKSファイルへのパス名を追加
(ウ)
keystorePassで上記で設定したパスワードの追加
<!-- Define a SSL HTTP/1.1 Connector on port 8443
This connector uses the JSSE
configuration, when using APR, the
connector should be using the
OpenSSL style configuration
described in the APR documentation
-->
<!--
<Connector port="8443"
protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/etc/tomcat6/ssl/private/www2.example.com.jks"
keystorePass="changeit"
/>
-->
最後にtomcat6を再起動して動作確認を行います。
ここで各サーバーソフトウェアがサービスを提供するTCPポート番号とプロトコルを表にまとめて整理しておきます。これに従いFirewallの設定を行いましょう。
表 2 今回設定したサービスのポート番号一覧
|
ポート番号 |
サーバーソフトウェア |
プロトコル |
Over SSL / STARTTLS |
|
|
389 |
OpenLDAP (slapd) |
LDAP |
STARTTLS |
|
|
636 |
OpenLDAP (slapd) |
LDAP |
over SSL |
|
|
80 |
Apache2 (httpd) |
HTTP |
なし |
|
|
443 |
Apache2 (httpd) |
HTTP |
over SSL |
|
|
21 |
vsftpd |
FTP |
STARTTLS |
|
|
25 |
Postfix |
SMTP |
STARTTLS |
|
|
587 |
Postfix |
SMTP |
STARTTLS |
|
|
110 |
Dovecot |
POP3 |
STARTTLS |
|
|
995 |
Dovecot |
POP3 |
over SSL |
|
|
143 |
Dovecot |
IMAP |
STARTTLS |
|
|
993 |
Dovecot |
IMAP |
over SSL |
|
|
8443 |
Tomcat6 |
HTTP |
over SSL |
|
Over SSL/STARTTLSの列はSSL化の手法を示しています。over SSL とはアプリケーションプロトコルをSSLでカプセル化したもので接続と同時にSSL/TLS通信が始まります。この場合SSL専用のポートを必要とします。STARTTLSでは通常と同じ(SSL化されていない)ポートに接続して、アプリケーションプロトコルの命令の一つを使いTLS通信に切り替えます。クライアントの設定手順作成時やトラブルシューティングのときにこれを意識しておくことが重要です。
参考に、今回のサービスに関連するポートで今回のソフトウェアでは設定しなかったポート番号の一覧も載せておきます。
|
ポート番号 |
サーバーソフトウェア |
プロトコル |
Over SSL / STARTTLS |
|
|
465 |
(Postfix) |
SMTP |
over SSL |
|
|
990 |
|
FTP |
over SSL |
|
ポート465は smtps (SMTP over SSL)であり、多くのメーラーでサポートされています。Postfixでもサポートされており、Ubuntu Serverでは/etc/postfix/master.cfファイル中の、”smtps”の行を有効にすれば使えるようになります。より多くのクライアントに対応し、またクライアントPCの設定を容易にするためこのポートも使用したほうがよいでしょう。
ポート990は ftps (FTP over SSL - Implicit)と呼ばれています。Ubuntu Server 9.04に含まれるvsftpdではサポートされていませんが、SSL対応のFTPクライアントの設定では出てくる用語なので認識しておいたほうがよいでしょう。
トラブルシューティングについて
・
確認方法
SSL証明書の設定を行いサービスが正常に起動しても証明書の設定があっているかどうかは分かりません。まずは下記で基本的な確認を行っていきます。
Ø
該当ポートをサーバープロセスがリスンしていることを確認する。
netstat -untap
Ø
ローカルマシンから、opensslコマンドで実際にポートに接続しにいく。
例 openssl s_client -connect host:port
-showcerts [-starttls <smtp|pop3|imap|ftp>]
エラーになったりハングした場合は、syslogや各サーバーソフトウェアのログ(/var/log/*)をチェックします。
Ø
次に別のマシンから、telnetで直接、該当のTCPポートを叩く。
Connection refusedになったりConnection timedoutになる場合はFirewallの設定を見直します。
・
よくあるミス
秘密鍵が開けない。秘密鍵ファイルのパーミッションを見直す。AppArmorのプロファイルを見直す。
秘密鍵が暗号化されている。opensslコマンドで解除したものを配置する。
証明書と秘密鍵が対応していない。
この確認がとれた後、実際のクライアントやCertMgrから接続を試行できます。そこで発生しうるより上位レイヤー(SSL/PKI等)での問題については、第5章でCertMgrを使ってトラブルシューティングを行っていきます。
今回の作業をまとめます。
l 各サーバーソフトウェアをUbuntu Server Guideに従いインストール・設定する
l 各サーバーソフトウェアは自動生成された自己署名証明書を使ってSSLを有効にする
l ただしSSL証明書の場所については、サーバーソフトウェア毎にディレクトリを作成しそこに自己署名証明書をコピーし、そこを指すように設定ファイルを変更する
このようにSSL証明書を配置し、サービスのSSL証明書をサーバーマシンや他のサービスから独立させ、保守性を向上、将来のサーバー拡張に備えます。
以上が、サーバー上でのSSL設定作業です。
次回からは、実際にServer
Certificate Managerを使用し本番用のSSL証明書を取得・配備していきます。
[1] Ubuntu Serverでは、ssl-certというグループを作りprivateディレクトリおよび秘密鍵ファイルのグループをssl-certに設定、そしてopenldapユーザーなどの補助グループとしてssl-certを設定しています。