2003/08/26 Tue
Apache+mod_sslでHTTPS通信を実現する
mod_sslを組み込んでのセキュアサーバの構築メモ。
かなり混乱ました。

[ベースシステム]
    ・OS:FreeBSD 4.7-Releasep9
    ・CPU:Pentium3 550Mh
    ・MEM : 256MB

[今回導入したアプリケーション]
    ・OpenSSL(既にインストール済なので割愛)
    ・apache_1.3.29.tar.gz
    ・MySQL-3.23
    ・mod_ssl-2.8.16-1.3.29.tar.gz

[注意点]
    ・"#" はスーパーユーザによるオペレーション、"%" は一般ユーザによるオペレーション。
    ・シェルは基本的にtcshを使用。


1:: インストール

Apacheのソースに対して、mod_sslを適用してからのInstallになるため、 若干面倒。 次にナニをすべきかメッセージを残してくれる場合もあるので、 見逃さないように。

(大まかな作業順序)

    1.Apacheソースディレクトリへ移動
      ↓
    2.Apache Configure
      ↓
    3.mod_sslソースディレクトリへ移動
      ↓
    4.mod_ssl Configure
      ↓
    5.Apacheソースディレクトリへ移動
      ↓
    6.make
      ↓
    7.make certificate
      ↓
    8.make install


(インストール)
  1. ソースの入手

    配布元からソースを入手。

    # cd /usr/local/src
    # ftp ftp.apache.jp
    (中略)

    # ftp ftp.win.ne.jp
    (中略)


  2. ApacheのConfigure

    configureはやらなくていい事に気付いてしまいました。ショボーン。

  3. mod_sslのConfigure

    [黒字]はmod_ssl定番オプション、 [緑字] は、ApacheのConfigureとして、任意のオプション指定する。

    # cd /usr/local/src
    # tar xfvz mod_ssl-2.8.16-1.3.29.tar.gz
    # ./configure \
    --with-apache=/usr/local/src/apache_1.3.29 \
    --with-ssl=/usr \
    --enable-shared=ssl \
    --prefix=/usr/local/apache-ssl\
    --enable-shared=max \
    --server-uid=www \
    --server-gid=www \
    --enable-module=most \
    --disable-module=auth_dbm \
    ※make, make installはまだ行なわない

    最後に

    Now proceed with the following commands:
     $ cd /usr/local/src/apache_1.3.28
     $ make
     $ make certificate
     $ make install
    と、この後の手順を表示してConfigureが完了。


  4. make

    mod_sslのConfigureの最後に表示されたインストール方法に習って、インストールしていく。

    # cd
    # make

    特に問題がなければ以下のメッセージを表示してmakeが終了する。次のステップについての指示なので良く読む事。

    +---------------------------------------------------------------------+
    | Before you install the package you now should prepare the SSL       |
    | certificate system by running the 'make certificate' command.       |
    | For different situations the following variants are provided:       |
    |                                                                     |
    | % make certificate TYPE=dummy    (dummy self-signed Snake Oil cert) |
    | % make certificate TYPE=test     (test cert signed by Snake Oil CA) |
    | % make certificate TYPE=custom   (custom cert signed by own CA)     |
    | % make certificate TYPE=existing (existing cert)                    |
    |        CRT=/path/to/your.crt [KEY=/path/to/your.key]                |
    |                                                                     |
    | Use TYPE=dummy    when you're a  vendor package maintainer,         |
    | the TYPE=test     when you're an admin but want to do tests only,   |
    | the TYPE=custom   when you're an admin willing to run a real server |
    | and TYPE=existing when you're an admin who upgrades a server.       |
    | (The default is TYPE=test)                                          |
    |                                                                     |
    | Additionally add ALGO=RSA (default) or ALGO=DSA to select           |
    | the signature algorithm used for the generated certificate.         |
    |                                                                     |
    | Use 'make certificate VIEW=1' to display the generated data.        |
    |                                                                     |
    | Thanks for using Apache & mod_ssl.       Ralf S. Engelschall        |
    |                                          rse@engelschall.com        |
    |                                          www.engelschall.com        |
    +---------------------------------------------------------------------+

    現在の所、Redhat Linux9 + Apache1.3.x + mod_sslにおいて、make時に「Includeされるファイルが見つからない」エラーが表示される。
    /usr/include/openssl/kssl.h:72:18: krb5.h: No such file or directory
    In file included from /usr/include/openssl/ssl.h:179,
    (以下略)
    Includeされるファイルパスの中に、/usr/kerberos/include/が含まれていないのが原因。
    最初は、CPPFLAGSによって検索ファイルパスに追加してやろうかと思ってチャレンジしてましたが、そもそも、Makefileでその 環境変数使われてませんでした(;;)ので没。
    ショウガナイのでシンボリックリンクはって対処しました。
    # ln -s /usr/kerberos/include/krb5.h /usr/include/krb5.h
    # ln -s /usr/kerberos/include/profile.h /usr/include/profile.h
    # ln -s /usr/kerberos/include/com_err.h /usr/include/com_err.h
    # make
    (…以下略)
    もっとスマートにナンとかできるとおもったんですが、タイムオーバー。ゴメン。誰かおせーて。


  5. make certificate

    次に make certificate を実行する。
    このコマンドを実行する事によってSSLに関する必要なファイル(server.key等)や、 システムが準備される。
    既にkeyが存在する場合(バージョンアップ目的)、 実行する必要はないだろう。

    このコマンドには4つほどオプションがあり、デフォルトは"TYPE=test"。

    # make certificate
    • STEP 0: Decide the signature algorithm used for certificate
      (証明書のために使用された署名アルゴリズムを決定する。)
      Signature Algorithm ((R)SA or (D)SA) [R]: (Enter)

    • STEP 1: Generating RSA private key (1024 bit) [server.key]
      (RSA秘密鍵(1024bit)を生成[server.key])
      (自動処理)

    • STEP 2: Generating X.509 certificate signing request [server.csr] (X.509証明書署名要求(CSR)を生成)

      特に入力せずにEnterを押して行く。正式なCSRを作成するのであれば、ここで正規の情報を入力しても良い。
      (参考ページ:日本ベリサイン ステップ3 CSRの生成)

      1. Country Name             (2 letter code) [XY]: ※ 国名コード (Enter)
      2. State or Province Name   (full name)     [Snake Desert]: ※ 都道府県 (Enter)
      3. Locality Name            (eg, city)      [Snake Town]: ※ 市区町村番地 (Enter)
      4. Organization Name        (eg, company)   [Snake Oil, Ltd]: ※ 組織名 (Enter)
      5. Organizational Unit Name (eg, section)   [Webserver Team]: ※ 部門名 (Enter)
      6. Common Name              (eg, FQDN)      [www.snakeoil.dom]: ※ サーバのFQDN (Enter)
      7. Email Address            (eg, name@FQDN) [www@snakeoil.dom]: (Enter)
      8. Certificate Validity     (days)          [365]: (Enter)

    • STEP 3: Generating X.509 certificate signed by Snake Oil CA [server.crt]
      (Snake Oil CA[server.crt]によって署名されたX.509証明書の生成...「Snake Oil=いんちき薬(エキサイト翻訳)」)
      (自動処理)

    • STEP 4: Enrypting RSA private key with a pass phrase for security [server.key]
      (セキュリティの為に、秘密鍵に含まれるパスフレーズを暗号化する)
      Encrypt the private key now? [Y/n]: (Enter)
      Enter PEM pass phrase: (4文字以上でパスフレーズを入力)
      Verifying - Enter PEM pass phrase: (4文字以上でパスフレーズを入力)
    これで終了。


  6. make install

    最後の仕上げのインストールを行なう。

    # make install
    特に問題がなければ以下のメッセージを表示してインストールが完了する。
    サーバの起動方法等の案内が書いてあるので、ざっと目を通しておこう。
    +--------------------------------------------------------+
    | You now have successfully built and installed the      |
    | Apache 1.3 HTTP server. To verify that Apache actually |
    | works correctly you now should first check the         |
    | (initially created or preserved) configuration files   |
    |                                                        |
    |   /usr/local/apache-ssl/conf/httpd.conf
    |                                                        |
    | and then you should be able to immediately fire up     |
    | Apache the first time by running:                      |
    |                                                        |
    |   /usr/local/apache-ssl/bin/apachectl start
    |                                                        |
    | Or when you want to run it with SSL enabled use:       |
    |                                                        |
    |   /usr/local/apache-ssl/bin/apachectl startssl
    |                                                        |
    | Thanks for using Apache.       The Apache Group        |
    |                                http://www.apache.org/  |
    +--------------------------------------------------------+


  7. 動作確認。

    まずは、構文チェック(configtest)。

    # /usr/local/apache-ssl/bin/apachectl configtest
    Syntax OK
    別のファイル名で用意しているときはオプションをつけて実行。
    # /usr/local/apache-ssl/bin/httpd -t -f /usr/local/apache-ssl/conf/my-httpd.conf
    Syntax OK

    [warn] Loaded DSO libexec/libdav.so uses plain Apache 1.3 API, this module might crash under EAPI! (please recompile it with -DEAPI)」このメッセージは対象のモジュール(この場合mod_dav) が、EAPI対応でインストールされていない為、もしかしたらうまく動かないかも〜というメッセージ。 モジュールをEAPI対応でインストールすればOK。インストールについてはここにちょっとだけ書いてある。

    ApacheサーバをSSLオプションを付与してテスト起動する。SSL対応での起動には秘密のパスワードが必要となるので注意。

    既に運用中のサーバの場合は、別のポートで立ち上げて確認すれば良い。

    Port    8000
    ※Port番号は1000番以降で任意指定。

    # /usr/local/apache-ssl/bin/apachectl startssl
    Apache/1.3.28 mod_ssl/2.8.15 (Pass Phrase Dialog)
    Some of your private key files are encrypted for security reasons.
    In order to read them you have to provide us with the pass phrases.

    Server blog.unknown.jp:443 (RSA)
    Enter pass phrase: パスワード入力(Private Key)

    Ok: Pass Phrase Dialog successful.
    # ps aux|grep apache
    root 81843 0.0 1.4 3424 2656 ?? Ss 5:19PM 0:00.11 /usr/local/apache-ssl/bin/httpd -DSSL
    nobody 81844 0.0 1.4 3424 2676 ?? I 5:19PM 0:00.00 /usr/local/apache-ssl/bin/httpd -DSSL
    nobody 81845 0.0 1.4 3424 2676 ?? I 5:19PM 0:00.00 /usr/local/apache-ssl/bin/httpd -DSSL
    nobody 81846 0.0 1.4 3424 2676 ?? I 5:19PM 0:00.00 /usr/local/apache-ssl/bin/httpd -DSSL
    nobody 81847 0.0 1.4 3424 2676 ?? I 5:19PM 0:00.00 /usr/local/apache-ssl/bin/httpd -DSSL
    nobody 81848 0.0 1.4 3424 2676 ?? I 5:19PM 0:00.00 /usr/local/apache-ssl/bin/httpd -DSSL
    ※ちなみにパスフレーズ入力をとばす方法もいくつかある。

    Apache+mod_ssl Finished! successfulが表示されたら、早速ブラウザで接続。
    問題がなければ、↓なメッセージが表示される。

    おい、それは作動しました!
    「SSL/TLSaware」アパッチ・ウェブサーバは、このウェブサイトに首尾よくにインストールされました。
    なかなか乱暴な翻訳(エキサイトより)スマソ。



  8. 秘密鍵(server.key)をバックアップしておく!(重要)

    起動する事が分かったら、兎にも角にもserver.keyをバックアップする。なくしたら絶対ダメ。
    パーミッションにも気をつけること。

    # /usr/local/apache-ssl/conf/ssl.key
    # cp -p server.key server.key.BACKUP


2:: Apacheの設定

Apacheの設定に入ります。
FreeBSDではhttpd.confにSSLの説明と設定例がついているので、これを参考に設定する。
Redhat Linux9の場合は、/etc/httpd/conf/httpd.confが/etc/httpd/conf.d/*.confをIncludeしているので、 conf.d/ssl.confを編集する。もちろん設定例と解説付き。以下、SSLの設定部分だけ抜粋。

尚、設定を変更したら、Apacheを再起動することを忘れずに。また、古いApacheを立ち上げてしまったり なんかしてまごまごしないように。

(基本設定)

    ./configure \ --with-apache=/usr/local/src/apache_1.3.28 \ --prefix=/usr/local/apache-ssl \ --enable-shared=ssl \ --with-ssl=/usr
  • Listen 443
    Listenするポート番号。デフォルトは443。

  • AddType application/x-x509-ca-cert .crt
  • AddType application/x-pkcs7-crl .crl
    各ファイル拡張子を指定したコンテントタイプへマップする。拡張子が異なる場合は、任意変更が必要。

  • SSLPassPhraseDialog builtin
    起動時のパスフレーズダイアログに関する設定。
    デフォルト(builtin)の場合は起動時にパスフレーズを聞かれてしまう。 (とはいえ、server.keyを空パスワードでセットしてれば問題ないとおもうんだが…) パスワードを自動入力したいという人は以下のようなスクリプトを作成するとよい。
    #!/bin/sh
    echo "pass_phrase"
    exit 0
    そして、SSLPassPhraseDialogに該当のシェルスクリプトをセットする。

    SSLPassPhraseDialog exec:/usr/local/ssl/apache_ssl/test.sh

    ..まぁ、セキュリティ上良くないって言えばそれでしまいなんですけどね。

  • SSLSessionCache dbm:/var/cache/mod_ssl/scache
  • SSLSessionCacheTimeout 300
    SSLセッションのキャッシュに関する設定。

(VirtualHost ディレクティブ)
  • <VirtualHost _default_:443>〜</VirtualHost>
    バーチャルホストを定義。

  • ServerName FQDN
    サーバ名の指定。

  • ErrorLog logs/ssl_error_log
    エラーログの指定。

  • TransferLog logs/ssl_access_log
    アクセスログの指定。

  • SSLEngine on
    SSLを有効にする。

  • SSLVerifyClient
    0 クライアント認証を行わない
    1 有効な証明書を提示することが出来る
    2 必ずクライアントの証明書を確認する
    3 クライアントの証明書を確認する
    ※サーバが信頼していないCAの証明書でもいい

  • SSLRequireSSL
    Directory ディレクティブ内で使用し、指定のディレクトリ内は 必ずSSLで通信する

  • SSLCertificateFile /usr/local/apache_ssl/conf/ssl.crt/your.server.crt
    サーバの証明書(CRT)の場所
    ベリサインから証明書をもらっている場合には、もらった証明書を指定する。

  • SSLCertificateKeyFile /usr/local/apache_ssl/conf/ssl.key/server.key
    サーバの秘密鍵の場所

  • SSLCertificateChainFile /usr/local/apache_ssl/conf/ssl.crt/ca.crt
    中間CA局の証明書を指定する
    グローバル・サーバIDは、中間CA局から発行された証明書です。
    また、中間CA局証明書はルートCA局より発行された証明書です。

    中間CA局証明書がないとブラウザ側で最上位のルートCA局までたどりつくことができません。

    このため、グローバル・サーバIDをインストールしたウェブサーバには、中間CA局の証明書もインストールする必要があります。
    参考資料:Verisign FAQ「このセキュリティ証明は信頼された証明機関から発行されていません」と表示されます」

    IE NN7

    とにかく、、、、何もいわずに中間CA局証明書はきちんと入れておきましょう...私はここでめちゃめちゃはまりました。


3:: 補足というかおまけというか

SSLのキーやら、証明書を扱う上でのFAQみたいなもの。

ApacheのServerRoot「/usr/local/apache」
サーバの秘密鍵 「server.key」
サーバ証明書要求 「myname.csr」
サーバ証明書 「myname.crt」
...として説明しますのでよろしく。


  • 秘密鍵を作る

    インストール時(make certificate)に生成されるもんですが、改めて作成する場合。
    まず、乱数発生用のランダムファイル(ファイルであれば何でもOK)を作り、これから秘密鍵を作り出す。

    # cd /usr/local/apache
    # openssl md5 * > rand.dat
    # openssl genrsa -rand rand.dat -des3 1024 > ssl.key/server.key


  • CSRの生成

    opensslコマンドから、直接CSRを生成する方法。
    一つのサーバで複数のCSRを作成したり、単にCSRを作りなおしてみたり、グローバルIDの更新のしてみたりなど、 CSRを作成するときはこの手順で。日本ベリサイン「Apache + OpenSSL CSR生成手順(更新)」 のページにも詳しく掲載されてるので、そっちのほうがいいかもしれん。

    # cd /usr/local/apache
    # openssl req -new -key ssl.key/server.key -out ssl.csr/myname.csr
    このとき聞かれるCommonName等の情報は「make certificate」時とほぼ同じ。記述についても詳細はベリサインのページに記載があるので参考にするとよい。 ただし、以下の箇所については、未入力で先に進むことだけ覚えておく。
    14. これ以降入力を求められる以下の情報は、可能であれば何も入力せず[Enter]キーを押して進んでください。

      Email Address
      A challenge password
      An optional company name


  • 作成したCSRに自己署名する。

    作成したCSRを公的機関(ベリサインとか)に提出して証明書をもらうのではなくて、自己署名する場合。
    まぁ、ちゃんと通信の暗号化さえされていれば、 所詮個人ページ程度では、ン十万もかけて自分を「本物」と証明してもらわなくてもいいんで、自己署名で十分。。。でしょ?

    # cd /usr/local/apache/conf
    # openssl req -x509 -in ssl.csr/myname.csr -text -key ssl.key/server.key -out ssl.crt/myname.crt


  • Apacheの起動時にパスワードを聞いてこないように黙らせる

    SSLのオプション付きの起動(startssl)では、サーバの起動時にサーバのパスワードを求めるようになっている。 これはセキュリティを強固にする為だけど、実際運用してみるとかなり面倒くさいので、 パスワードを聞いてこないよう黙らせてしまおう。

    運用よりセキュリティをとる場合は以下の設定は必要無いし、してはダメ。

    1. server.keyから、パスフレーズを解除してしまう場合

      いっそのことserver.keyのパスフレーズを解除してしまうこともできる。 もちろんserver.keyが変わるので、前後のバックアップをとっておくように。

      # cd /usr/local/apache/conf/ssl.key/
      # cp -p server.key server.key.BACKUP
      # openssl rsa -in server.key.BACKUP -out server.key
      Enter pass phrase for server.key.BACKUP:
      writing RSA key

    2. 起動時に自動でパスワードを入力する場合

      サーバ内の安全な空間(rootだけが読み書きできるような)にパスフレーズを書いた ファイルを配置し、起動時に読み込む仕組み。

      1.起動パスワードを書いたファイル(ssl_startup.sh)を作成

      #!/bin/sh
      echo "Password-phrase"

      2.ファイルを安全なところへ配置し、パーミッションを変更

      # chown root ssl_startup.sh
      # chmod 700 ssl_startup.sh
      # mv ssl_startup.sh /PATH/TO/DIR

      3.httpd.confに、SSLPassPhraseDialogをセット

      SSLPassPhraseDialog exec:/PATH/TO/DIR/ssl_startup.sh


      これで多分大丈夫...

  • ベリサインからCRT鍵をもらったら...

    生成したCSRをベリサインに提出したり、その他いろいろ書類を提出し、晴れて証明書を入手したら、 あとは、設定するだけ。
    中間CA局証明書をインストールするのを忘れずに。

Posted by sakagami at 2003/08/26 Tue | TrackBack
Comments
Post a comment










Remember personal info?



表示されているランダムな4桁の数字(セキュリティコード)を入力してください。