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設定作業

 

第一回では、サーバー上にインストールするサービスとそれに伴う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 を使います。

 

Linux OSのインストールと各サーバーソフトウェアのインストール

 

今回の検証では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 ServerCentOS 5.xではSSLサーバー証明書を、各サーバーソフトウェアの設定ファイルとは別に、ある特定のディレクトリ配下に配置することを推奨しているようです。Ubuntu Serverでは下記ディレクトリに証明書関連ファイルを置いています。

 

  /etc/ssl/certs/ : サーバーおよびCASSL証明書

  /etc/ssl/private/ : サーバー証明書の秘密鍵

 

CentOS 5.xでも同様です。

 

  /etc/pki/tls/certs/ : サーバーおよびCASSL証明書

  /etc/pki/tls/private/ : サーバー証明書の秘密鍵

 

しかし、将来のサーバー拡張に備えて、各サーバーソフトウェアが提供するサービスはサーバーマシンと出来るだけ疎な関係にしておき、サーバーソフトウェアの関連ファイルだけを別サーバーに簡単に持っていけるようにしておきたいと考えます。 上記の慣習に従った場合、具体的には以下のような問題が出ます。

     秘密鍵ファイルのパーミッションの設定が複雑になる。
秘密鍵ファイルはサーバーソフトウェアだけが読めるように設定しなければなりません。多くのサーバーソフトウェアはまだrootユーザーで実行中の間に秘密鍵を読み込み、その後、指定された一般ユーザーまで権限を落とすという動作を行うので、rootユーザーだけが秘密鍵を読み込めればよいのですが、そうではないサーバーソフトウェアもあります。例えばOpenldapopenldap用一般ユーザーで秘密鍵を読みに行きます。その場合、秘密鍵ファイルおよびそのディレクトリprivaterootだけでなくopenldapユーザーでも読めるように設定しておかなければなりません。Tomat6も同様にtomcat6ユーザーで秘密鍵ファイルを読みに行きます。したがってprivateディレクトリはtomcat6ユーザーでも読めるように設定する必要が出てきます。他のサーバーソフトウェアとprivateディレクトリや秘密鍵ファイル自体を共有した環境でこのような設定を行うのは多くのミスを招きやすいものです。[1](読めるべきものが読めなかったり、読めないはずのものが読めたりする。)

     あるサーバーソフトウェアを別サーバーに移行する際などでサーバーソフトウェア環境をバックアップすると他サービスの秘密鍵までバックアップ・転送されてしまう。例えばFTPサービスを別マシンに移行するのにLDAPサービスの秘密鍵まで間違ってコピーされ移行先サーバーにおかれるというミスがおきやすくなります。

     あるサーバーソフトウェアが侵入された場合他のサーバーソフトウェア用の秘密鍵も危機にさらされる。

 

上記理由から、サービスに付随すべきSSL証明書はそのサーバーソフトウェアの他の設定ファイルと同じ場所に配置しておき、パーミッションをrootだけ、必要ならそのサーバーソフトウェア専用のユーザーだけに与えるように設定していくこととします。具体的には、例えばApacheが使うSSL証明書であれば、/etc/apache2/OpenLDAPであれば/etc/ldap/の下にssl/certsssl/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 証明書関連ファイルの場所とセキュリティ設定

サービス

秘密鍵の場所
証明書の場所

秘密鍵のowner:group

秘密鍵のpermission

OpenLDAP

/etc/ldap/ssl/private/ldap.example.com.key
/etc/ldap/ssl/certs/ldap.example.com.crt

root:openldap

0640

Apache2

/etc/apache2/ssl/private/www.example.com.key
/etc/apache2/ssl/certs/www.example.com.crt

root:root

0600

FTP Server

/etc/vsftpd/ssl/private/www2.example.com.key
/etc/vsftpd/ssl/certs/www2.example.com.crt

root:root

0600

Postfix

/etc/postfix/ssl/private/smtp.example.com.key
/etc/postfix/ssl/certs/smtp.example.com.crt

root:root

0600

Dovecot

/etc/dovecot/ssl/private/pop.example.com.key
/etc/dovecot/ssl/certs/pop.example.com.crt

root:root

0600

Tomcat6

/etc/tomcat6/ssl/private/www2.example.com.jks

root:tomcat6

0640

 

 

サーバーソフトウェア間での証明書関連ファイルは共有していいの?

 

Ubuntu Serverのデフォルトでは単一の自己署名証明書のファイルを物理的にも複数のサーバーソフトウェア間で共有しています。証明書の更新作業の削減のためだと思われますが、これだと証明書を共有しているサービス全てを停止してから証明書の更新が必要になります。

 

サーバーとサービスを分離するという原則からは、たとえマルチドメイン証明書を複数のサービスが使う場合でも物理的には別ファイルにしておくほうがよいでしょう。サービスの独立性が向上し、サービス毎に証明書の更新等が可能になります。

 

今回の検証では、POPIMAPFTPWWW2がそれぞれマルチドメイン証明書を使います。POPIMAPDovecotという単一のサーバーソフトウェアの制御下で共有されるので物理的にファイルも共有します。FTPWWW2はそれぞれvsftpdtomcat6が使用するのでファイルは別にしておきます。(ちなみにtomcat6ではJKSという証明書形式を使うためそもそもvsftpdと証明書ファイルを共有することはできません)

 

 

 

各サーバーソフトウェアのSSL証明書の初期設定を行う

 

さて、証明書の配置方針が決まったら、各サーバーソフトウェアの設定を行っていきます。Ubuntu Server 9.04ではソフトウェアパッケージのインストールと同時に基本的な設定も自動的に行われます。ただしSSLとその証明書の設定は多くのケースでほとんど行われないので、Ubuntu Serverの公式マニュアルであるUtuntu Server Guideにしたがって、SSLの設定を行っていきます。ここでは、SSLSSL証明書に関するポイントを記載します。

 

なお、記載しているコマンドはすべて rootになって実行します。(sudo –srootでシェルが起動する)

 

自己署名証明書の生成

 

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 GuideCreating a Self-Signed Certificateでの手順に従うか下記コマンドを実行すればよいでしょう(よりコマンド数を削減した手順です)

 

 

> cd /tmp
> openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout server.key -out server.crt
[DN
の情報を入力。Common Nameldap.example.comを入力。後はデフォルトにしたがってEnterを押していけばよい。]
> cp server.crt /etc/ssl/certs/ssl-cert-snakeoil.pem
> cp server.key /etc/ssl/private/ssl-cert-snakeoil.key

 

 

 

OpenLDAP (slapd)

 

Ubuntu Server GuideOpenLDAP 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を再起動させます。

 

Apache2 (httpd)

 

Ubuntu Server GuideApache2 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を再起動して動作確認を行います。

 

 

FTP Server (vsftp)

 

Ubuntu Server Guidevsftpdの章にしたがってインストールと設定を行っていきます。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 Server (Postfix)

 

今回構築する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.04dovecot-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/*

 

 

なお、PostfixSMTP Clientとして動作する場合に使用できるSSLクライアント証明書は設定しません。SMTPSSLを利用する主な目的は、SMTP認証を行うときの暗号化と相手認証です。

 

最後にPostfixを再起動して動作確認を行います。

 

 

POP/IMAP Server (Dovecot)

 

Ubuntu Server 9.04では、Dovecotをインストールするとデフォルトの自己署名証明書が設定されたコンフィグファイルが作られます。なおUbuntu Server GuideではPostfixのインストールにおいてSMTP-AUTHを有効にするために、dovecot-postfix というパッケージのインストールを推奨しています。これをインストールするとその延長でDovecot自体もインストールされますので既にDovecotはインストールされているはずです。


またUbuntu Server GuideDovecotインストールの章に書かれていないのですが、dovecot-postfixパッケージをインストールした場合、Dovecotのメインのコンフィグファイルは /etc/dovecot/dovecot.conf ではなく /etc/dovecot/dovecont-postfix.conf になります。Postfixもインストールした環境において、Ubuntu Server Guideを見ながらDovecotの設定を行う場合 dovecot.confdovecot-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を再起動して動作確認を行います。

 

 

Tomcat6

 

最後のサーバーソフトウェアは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

 

なお、tomcatrootで起動して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 passwordkey 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を設定しています。