Apache2でmod_sslを使う

 今回、SSL通信を試したいと思い、Apache2にmod_sslを導入することにしました。
 Apache2ではmod_sslが組み込まれているので、別途インストールする必要はないのですが、Apache2のコンパイルを行う際に、SSLを使用することを指定しておかなければなりません。
 私のサーバーにもApache2はインストールされていますが、SSLを利用するためのオプションはつけずにコンパイルしていた為、再コンパイルする必要がありました。どうせコンパイルからするなら最新を使おうということで、2.0.47を使います。

現在のApache2にmod_sslが組み込まれているか確認したい場合は、以下のように行います。
mod_ssl.cが一覧になければ組み込まれていません、再コンパイルが必要になります。
[root conf]# /usr/local/apache2/bin/httpd -l
Compiled in modules:
    core.c
    mod_access.c
    mod_auth.c
    ・
    ・


インストールの流れは次のようになります。
作業は全てrootで行います。
  1. ソースコードのダウンロード
  2. make
  3. httpd.confの設定
  4. 秘密鍵、サーバー証明書の作成
  5. ssl.confの設定
  6. 接続確認
  7. 起動スクリプトの作成
Tomcatのインストールと連携方法については→Tomcatのインストール ApacheとTomcatとの連携
SSL通信など興味がなく、Apacheだけ設定したい人はこっち→Apacheのインストール
  1. ソースコードのダウンロード
    アパッチのFTPサイトからソースコードをダウンロードします。(ダウンロード可能なFTPサイトはこれ以外にもたくさんあります。http://www.apache.org/で見つかります。)
    ダウンロードしたファイルはチェックサムを利用して正規のファイルである事を確認します。
    [root src]# ftp ring.asahi-net.or.jp
    ftp> cd /pub/net/apache/dist/httpd
    ftp> lcd /usr/local/src
    ftp> get httpd-2.0.47.tar.gz
    ftp> get httpd-2.0.47.tar.gz.md5
    ftp> quit

    ダウンロードしたファイルが改竄されていない事を確認します。
    [root /root]# cd /usr/local/src
    チェックサムの確認
    [
    root src]# md5sum httpd-2.0.47.tar.gz チェックサムの計算
    63f16638c18b140b649fab32b54d7f9c httpd-2.0.47.tar.gz
    [
    root src]# cat httpd-2.0.47.tar.gz.md5
    63f16638c18b140b649fab32b54d7f9c httpd-2.0.47.tar.gz

    値が一致するので大丈夫そうです。

  2. make
    次はダウンロードしたファイルを展開して、make、インストールを行います。
    今回の目的、mod_sslを追加する為、「--enable-ssl」オプションを指定します。
    デフォルトのインストール先は/usr/local/apache2ですが、今回はprefixオプションでインストール先を変更します。オプションの詳細は./configure --helpで確認する事が出来ます。

    ※ SSLを有効にする為には、OpenSSLがインストールされている必要があります。また、OpenSSLのヘッダファイルも必要になる為、RPMパッケージでインストールされている場合は、openssl-XXXの他に、openssl-devel-xxxxも必要になります。ソースコードからインストールされている場合は問題ないです。

    ※ 今回の作業を行う際に古いapache2がインストールされている為、apache2.0.47というディレクトリにインストールし、最終的には/usr/local/apacheにシンボリックリンクを張ります。
    新規にインストールする場合には、prefixオプションは付けなくてよいです。
    [root src]# tar zxvf httpd-2.0.47.tar.gz
    [
    root src]# cd httpd-2.0.47
    [
    root httpd-2.0.47]# ./configure --enable-ssl --prefix=/usr/local/apache2.0.47
    [
    root httpd-2.0.47]# make
    [
    root httpd-2.0.47]# make install -> /usr/local/apache2.0.47にインストールされます。
    古いApacheをリネイムし、今回インストールしたアパッチにシンボリックリンクを張ります。(古いapacheがある人だけ。)

    [root httpd-2.0.47]# cd /usr/local/
    [
    root local]# mv apache2 apache2.0.43 <-- 古いapacheを適当な名前にリネイムします。
    [root local]# ln -s apache2.0.47 apache2

  3. httpd.confの設定
    私の環境では、既にApache2を利用していた為、httpd.confは以前のものをコピーして使います。これ以外にもtomcatとの連携で必要なファイルも既存のapache2ディレクトリよりコピーしておきます。(/usr/local/apache2/modules/mod_jk2.so、/usr/local/apache2/conf/workers2.properties)

    参考までに、下記に以前の設定内容を掲載しておきます。(Apache2のインストールで掲載しているものと同様です。)


    apacheの基本設定を行います。
    設定する内容は次の通りです。
    ・サーバー名
    ・不要に公開されているaliasを削除
    ・ログ出力の設定
    ・言語に関する設定
    [root httpd-2.0.47]# cd /usr/local/apache2.0.47/
    [root apache2]# vi conf/httpd.conf
    以下にhttpd.confに指定した項目について説明します。
    サーバー名を設定します。
    ServerName www.ryouto.jp
    不要なalias等を削除します。 muanualのディレクトリは公開する必要がないのですべてコメントにしておきます。同様にicon,cgi-binなども不要なのでコメントアウトしておきます。
    これの関しては各環境により異なると思われるので不要と思われる方のみ処理して下さい。
    #Alias /manual "/usr/local/apache2/manual"
    #<Directory "/usr/local/apache2/manual">
    #    Options Indexes FollowSymLinks MultiViews IncludesNoExec
    #    AddOutputFilter Includes html
    #    AllowOverride None
    #    Order allow,deny
    #    Allow from all
    #</Directory>
    ログ出力に関する設定を行います。
    ここでは、次のルールを設定しています。
     ・ローカルアクセス(192.168.0.*)からのアクセスはログ出力しない
     ・ワームからのアクセスと思われるログはworm_logファイルにのみ出力し、access_logには出力しない。
    #Local zone
    SetEnvIf Remote_Addr 192\.168\.0\. dontlog
    #worm
    SetEnvIf Request_URI "default\.ida" worm dontlog
    SetEnvIf Request_URI "root\.exe" worm dontlog
    SetEnvIf Request_URI "cmd\.exe" worm dontlog
    SetEnvIf Request_URI "scripts" worm dontlog
    SetEnvIf Request_URI "NULL\." worm dontlog
    SetEnvIf Request_URI "\.files" worm dontlog

    CustomLog logs/access_log common env=!dontlog
    CustomLog logs/worm_log combined env=worm

    言語に関する設定
    私の環境で使用する文字コードはSJISです。その為、この設定は外しておきます。
    この行を有効にしておくと文字化けなどが発生します。
    #AddDefaultCharset ISO-8859-1

    シグネチャ等の設定
    これは、HTTPレスポンスなどでapacheやOSの情報を出力しないようにする設定です。
    セキュリティーの為にも、むやみな情報の出力は避けるべきと思います。
    ServerTokens Prod
    ServerSignature Off

    一通りの設定が終わったら誤りが無いかチェックします。
    [root apache2]# bin/apachectl configtest <-これで設定ファイルの誤りがないかチェックします。

  4. 秘密鍵、サーバー証明書の作成
    証明書や秘密鍵は/usr/local/apache2/conf/certディレクトリに作成することとします。
    鍵作成の流れは次のようになります。詳細についてはOpenSSLのインストールを参照してください。
    [root conf]# mkdir cert
    [
    root conf]# cd cert/
    まずは、秘密鍵と証明要求書の作成です。
    [
    root cert]#openssl req -new -text -out httpd.req -keyout httpd.pem
    秘密鍵に含まれるパスフレーズを削除します。
    [
    root cert]#openssl rsa -in httpd.pem -out ryocho.pem
    自己署名証明書の作成
    [
    root cert]#openssl req -x509 -in httpd.req -text -key ryocho.pem -out ryocho.crt
    ここで、最終的に出来上がったryocho.pemとryocho.certが必要になります。
    秘密鍵・・・ryocho.pem
    証明書・・・ryocho.crt

  5. ssl.confの設定
    次にhttpd.confに以下の記述があることを確認します。
    以下の記述があれば、mod_sslの設定はconf/ssl.confファイルで行うことが宣言されます。
    <IfModule mod_ssl.c>
        Include conf/ssl.conf
    </IfModule>

      ssl.confで編集する箇所は数カ所です。
    DocumentRoot "/usr/local/apache2/ssldocs"  <--httpsと指定された場合のドキュメントルートです。適当なディレクトリを割り当てます。
    ServerName www.ryouto.jp:443
       <--サーバー名です。
    ServerAdmin webmaster@ryouto.jp
    <--サーバー管理者です。
    ErrorLog logs/error_log                
    <--ssl用のエラーログです。通常のapacheと同じファイルが指定されます。
    TransferLog logs/access_log        
    <--ssl時のアクセスログです。通常のapacheのログと同名になっています。別にしたければ名前を変えましょう。

    SSLCertificateFile /usr/local/apache2/conf/cert/ryocho.crt  
    <--サーバー証明書
    SSLCertificateKeyFile /usr/local/apache2/conf/cert/ryocho.pem
     <--秘密鍵

  6. 接続確認
    まずは、SSLのドキュメントルートにあたる/usr/local/apache2/ssldocsに簡単なhtmlファイルを作成しておきます。
    [root htdocs]# vi /usr/local/apache2/ssldocs/index.html
    <head>
    <title> ssl test page </title>
    </head>
    <body>
    SSL TOP PAGE!
    </body>
    </html>

    次はアパッチを起動して接続確認!
    [root apache2]# bin/apachectl startssl (通常のstartではありません。)<- エラーがでなければOKです。早速他のマシンから接続してみてください。
    アクセスする際は、https://ドメイン名/index.htmlで先に作成したテストページが表示されるはずです。ex).https://www.ryouto.jp/index.htmlでテストページにアクセスできます。
  7. 起動スクリプトの作成
    最後に起動用スクリプト(/etc/rc.d/init.d/httpd)を作成します。
    今までのapacheの機動スクリプトとほぼ同じですが、mod_sslを使ったことにより、startの際が"apachectl start"から"apachectl startssl"になっています。
    #!/bin/sh

    # Source function library.
    . /etc/init.d/functions

    APACHBINDIR=/usr/local/apache2/bin

    case "$1" in
        start)
            echo -n "Starting httpd: "
            ${APACHBINDIR}/apachectl startssl $HTTPDOPT
            echo
            touch /var/lock/subsys/httpd
        ;;
        stop)
            echo -n "Shutting down http: "
            ${APACHBINDIR}/apachectl stop
            echo
            rm -f /var/lock/subsys/httpd
            rm -f /var/run/httpd.pid
            ;;
        status)
            status httpd
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        reload)
            echo -n "Reloading httpd: "
            ${APACHBINDIR}/httpd -HUP
            echo
            ;;
        *)
            echo "Usage: $0 {start|stop|restart|reload|status}"
            exit 1
    esac
    exit 0

    最後に、システム起動時に自動起動するようrunlevelの設定をしておきます。
    これは先ほど作成した/etc/rc.d/init.d/httpdにシンボリックリンクを張るだけです。
    runlevel3,5で起動、0,6の時を終了するように設定します。
    起動時の順番、終了時の順番は私の環境に依存しているので各環境に合わせて下さい。networkより遅く起動すれば問題ないと思います。
    [root rc3.d]# ln -s ../init.d/httpd S80httpd
    [root rc3.d]# cd ../rc5.d
    [root rc5.d]# ln -s ../init.d/httpd S80httpd
    [root rc5.d]# cd ../rc0.d
    [
    root rc0.d]# ln -s ../init.d/httpd K10httpd
    [root rc0.d]# cd ../rc6.d
    [root rc6.d]# ln -s ../init.d/httpd K10httpd

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.