Apache SSL 設定

Apache
SSL の設定
SSL の設定は httpd.conf に書いてもよいが、別のファイルに SSL 関連のディレクティブをまとめて記述し、httpd.conf から Include ディレクティブを使用してファイルを読み込むこともできる。
Include conf/ssl.conf
デフォルトの ssl.conf に記述されているディレクティブについて、順に見ていく。 (重複するものは省略)
デフォルトの ssl.conf
<IfDefine> ~ </IfDefine> [core モジュール]
httpd を起動するとき -D でパラメータが指定されていれば、<IfDefine> と </IfDefine> で囲まれたディレクティブを有効にする。
次の例では、httpd 起動時に -D でパラメータ SSL が 指定されていれば、囲まれたディレクティブを有効にする。
<IfDefine SSL>
  ....
</IfDefine>
httpd を起動するためのスクリプト apachectl を見ると、sslstart するときに -D でパラメータ SSL を指定している。
HTTPD='/usr/local/apache2/bin/httpd'

startssl|sslstart|start-SSL)
    $HTTPD -k start -DSSL
    ERROR=$?
    ;;
Listen [prefork モジュール]
リクエストを待つ IP アドレスとポートを指定する。 複数の IP アドレスとポートでリクエストを受け付けるよう、複数の Listen ディレクティブを記述することができる。 ポート番号だけ指定した場合は、すべての IP インターフェースへのリクエストを受け付ける。
Listen 443
AddType [mod_mime モジュール]
拡張子を MIME タイプにマップする。 TypesConfig で指定したファイルに定義されていないマップを追加するときに使用する。 同じ拡張子に対するマップが既に存在する場合、新しい MIME タイプで上書きされる。
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
SSLPassPhraseDialog [mod_ssl モジュール]
秘密鍵ファイルを開くパスフレーズを入力するための、ダイアログタイプを指定する。 指定できるのは、builtin または exec。 デフォルト値は、builtin。
builtin を指定した場合、httpd 起動時にパスフレーズを対話的に入力しなければならない。 パスフレーズを入力するまで、httpd は起動しない。
SSLPassPhraseDialog  builtin
exec を指定すると、外部プログラムからパスフレーズを自動的に入力することができる。 外部プログラムは、パスフレーズを STDOUT に出力する。 httpd は STDOUT からパスフレーズを受け取る。 外部プログラムのパーミッションは、root のみ実行可能(500 とか 700 とか)にしておくこと。
SSLPassPhraseDialog  exec:/usr/local/apache2/bin/pp-filter

/usr/local/apache2/bin/pp-filter
#!/bin/sh
echo "パスフレーズ"
SSLSessionCache [mod_ssl モジュール]
SSL セッションのキャッシュを保存する形式とファイルを指定する。 指定できるのは、none | dbm:/filepath | shm:/filepath(size) のいずれか。 デフォルト値は、none(キャッシュを保存しない)。
デフォルトの ssl.conf では、次のように記述されている。
SSLSessionCache 
dbm:logs/ssl_scache
SSLSessionCacheTimeout [mod_ssl モジュール]
SSL セッションのキャッシュが無効になるまでの時間を、秒単位で指定する。 デフォルト値は、300(秒)。
SSLSessionCacheTimeout 300
SSLMutex [mod_ssl モジュール]
This configures the SSL engine’s semaphore (aka. lock) which is used for mutual exclusion of operations which have to be done in a synchronized way between the pre-forked Apache server processes. デフォルト値は、none。
SSLMutex none
SSLRandomSeed [mod_ssl モジュール]
起動時と SSL 接続確立時、OpenSSL が擬似乱数を生成するためのソースを設定する。
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
<VirtualHost> ~ </VirtualHost> [core モジュール]
指定されたホスト名・ IP アドレス・ポートに適用するディレクティブをグルーピングする。
次の例は、443 番ポート宛のリクエストであれば、VirtualHost ディレクティブの中で指定したディレクティブを適用する。
<VirtualHost _default_:443>
....
</VirtualHost>
注意! SSLではホストベースのバーチャルホストを使用できない。 設定しようとしても、最初のバーチャルホストディレクティブで指定した証明書を使用してしまう。
ServerName [core モジュール]
サーバが自分を認識するのに使用するホスト名とポートを指定する。 URL リダイレクションで使用される。 名前解決できないホストは、IP アドレスで指定する。
ServeraName www.nina.jp:443
ServerAdmin [core モジュール]
サーバ管理者のメールアドレスを指定する。 エラーページに表示される。
ServeraAdmin info@nina.jp
ErrorLog [core モジュール]
エラーログファイルを指定する。 デフォルト値は logs/error_log。
ErrorLog logs/error_log
TransferLog [log_config モジュール]
アクセスログファイルを指定する。 CustomLog ディレクティブと同様の効果があるが、ログフォーマットを明示できない。 最後に LogFormat ディレクティブで指定されたニックネームを持たないフォーマットが使用される。 他にフォーマットが指定されない場合は、common ログフォーマットが使用される。
Transfer logs/access_log
SSLEngine [mod_ssl モジュール]
SSL/TLS プロトコルエンジンを使用するか指定する。 デフォルト値は off。 通常、バーチャルホストで SSL/TLS を可能にするため、VirtualHost ディレクティブの中で使用される。
SSLEngine on
SSLCipherSuite [mod_ssl モジュール]
デフォルト値は以下のとおり。
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
SSLCertificateFile [mod_ssl モジュール]
PEM 形式の WEB サーバ証明書ファイルを指定する。
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile [mod_ssl モジュール]
PEM 形式の WEB サーバ秘密鍵ファイルを指定する。 SSLCertificateFile ディレクティブで指定したサーバ証明書にサーバ秘密鍵が含まれている場合は、SSLCertificateKeyFile ディレクティブは不要。 しかし、サーバ証明書とサーバ秘密鍵は分離することが推奨される。
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
SSLCertificateChainFile [mod_ssl モジュール]
PEM 形式の チェーン証明書ファイルを指定する。
下位 CA によって署名されたクライアント証明書を認証に使用したい場合、ルート CA からのチェーン証明書が必要になる。
SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt
SSLCACertificateFile [mod_ssl モジュール]
クライアント証明書を発行した CA の、CA 証明書ファイルを指定する。 クライアント認証で使用される。 複数の CA で発行されたクライアント証明書を使用する場合は、SSLCACertificatePath ディレクティブを使用する。
SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle.crt
SSLCACertificatePath [mod_ssl モジュール]
クライアント証明書を発行した CA の、CA 証明書を置くディレクトリを指定する。 CA 証明書ファイルを置くだけでなく、CA 証明書のハッシュ.0(.0 を忘れるとエラーになる)を名前とした CA 証明書へのシンボリックリンクの作成が必要。
# ln -s ca-bundle.crt `openssl x509 -noout -hash -in ca-bundle.crt`.0
SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
SSLCARevocationFile [mod_ssl モジュール]
クライアント証明書を発行した CA の、失効証明書リストファイルを指定する。 破棄されたクライアント認証を確認するために使用される。 複数の CA で発行されたクライアント証明書を使用する場合は、SSLCARevocationPath ディレクティブを使用する。
SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle.crl
SSLCARevocationPath [mod_ssl モジュール]
クライアント証明書を発行した CA の、失効証明書リストを置くディレクトリを指定する。 失効証明書リストファイルを置くだけでなく、失効証明書リストのハッシュ.r0(.r0 を忘れるとエラーになる)を名前とした 失効証明書リストへのシンボリックリンクの作成が必要。
# ln -s ca-bundle.crl `openssl crl -noout -hash -in ca-bundle.crl`.r0
SSLCARevocationPath /usr/local/apache2/conf/ssl.crl
SSLVerifyClient [mod_ssl モジュール]
クライアント認証のレベルを設定する。 次のレベルを指定できる。 デフォルト値は none。
none クライアント認証を要求しない
optional クライアントは有効な証明書を提示するかもしれない
require クライアントは有効な証明書を提示しなければならない
optional_no_ca クライアントは有効な証明書を提示するかもしれないが、それは検証できなくてもよい
SSLVerifyClient ディレクティブは、サーバごとまたはディレクトリごとに設定できる。
SSLVerifyClient ( none | optional | require | optional_no_ca )
SSLVerifyDepth [mod_ssl モジュール]
mod_ssl がクライアントが有効な証明書を持っていないことを決定する前に、どれくらい深く確認しなければならないか設定する。 デフォルト値は 1。
深さは、クライアント証明書を認証するのに必要な CA 証明書の最大数。 深さ 0 なら、自己署名されたクライアント証明書だけ許可される。 デフォルトである深さ 1 なら、自己署名されたクライアント証明書もしくは SSLCACertificateFile ディレクティブで指定した証明書の CA によって署名されたクライアント証明書が許可される。
SSLVerifyDepth 1
<Location> ~ </Location> [core モジュール]
URL によって、<Location> ディレクティブで囲まれた範囲を制限する。 <Directory> セクション、.htaccess ファイル、<Files> セクションの後に処理される。
<Location> セクションは、ファイルシステムとは関係なく作動する。 ファイルシステムに関する内容については、<Directory> セクションや <Files> セクションを使用する。 例外は <Location /> で、サーバ全体に設定を適用する簡単な方法である。
URL を指定するときは、ワイルドカードや正規表現を使用することができる。
<Location />
    ....
</Location>
SSLRequire [mod_ssl モジュール]
アクセスを許可するために満たされなければならない一般的なアクセス要求を指定する。
SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
            and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
            and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
            and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
            and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
            or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
<Files> ~ </Files> [core モジュール]
指定したファイルに適用するディレクティブをグルーピングする。 ワイルドカードや正規表現を使用することができる。
次の例では、正規表現を用いて .cgi、.shtml、.phtml、.php3x という文字で終わるファイルをグルーピングしている。
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    ....
</Files>
注意! <Files> ディレクティブは、<Location> ディレクティブより先に処理される。 <Location> ディレクティブにもマッチした場合、設定は上書きされる。
<Directory> ~ </Directory> [core モジュール]
指定したディレクトリに適用するディレクティブをグルーピングする。 ワイルドカードや正規表現を使用することができる。 サブディレクトリも設定を引き継ぐ。
<Directory "/usr/local/apache2/cgi-bin">
    ....
</Directory>
注意! .htaccess が許可されているとき、<Directory> ディレクティブでの設定は上書きされる。
注意! <Directory> ディレクティブは、<Files> ディレクティブと <Location> ディレクティブより先に処理される。 <Files> ディレクティブや <Location> ディレクティブにもマッチした場合、設定は上書きされる。
注意! <Directory> ディレクティブは、ディレクトリが短いものから(つまり親ディレクトリから)順に処理される。 同じディレクトリに対して複数の指定がある場合は、設定ファイルで記述された順に処理される。
SSLOptions [mod_ssl モジュール]
ディレクトリー単位で様々なランタイムオプションをコントロールするために使用する。 + / – を使用して、上位ディレクトリからの相対的な設定で記述することができる。
StdEnvVars SSL 関連の標準的な環境変数を、CGI/SSI で使用できるようになる
CompatEnvVars 古いバージョンの apache と互換を持った追加の環境変数を、CGI/SSI で使用できるようになる
ExportCertData 追加の環境変数(SSL_SERVER_CERT、SSL_CLIENT_CERT、SSL_CLIENT_CERT_CHAIN)を、CGI/SSI で使用できるようになる
FakeBasicAuth クライアント証明書の識別名(DN)を HTTP ベーシック認証のユーザ名に変換する
StrictRequire SSLRequire または SSLRequireSSL でアクセス禁止が決定されれば、Satisfy が Any でも強制的にアクセスを禁止する
OptRenegotiate This enables optimized SSL connection renegotiation handling when SSL directives are used in per-directory context.
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/usr/local/apache2/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
FakeBasicAuth を使用するときは、ユーザ名として “/C=JP/ST=Yokohama/O=nina/OU=web/CN=web client/emailAddress=user@nina.jp” のような DN を指定する。 パスワードは “password” を指定すること。
# htpasswd .htpasswd "/C=JP/ST=Yokohama/O=nina/OU=web/CN=web client/emailAddress=user@nina.jp"
New password: password
Re-type new password: password
SetEnvIf [mod_setenvif モジュール]
リクエストの属性に基づいて環境変数を設定する。 リクエスト属性として指定できるのは、次のとおり。
  • HTTP リクエストヘッダフィールド
  • Remote_Host、Remote_Addr、Server_Addr、Remote_User、Request_Method、Request_Protocol、Request_URI
  • リクエストと関連付けられる環境変数のリスト
次の例では、User-Agent に “MSIE” が含まれるとき、nokeepalive、ssl-unclean-shutdown、downgrade-1.0、force-response-1.0 をセットする。
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog [mod_log_config モジュール]
アクセスログファイルとフォーマットを指定する。 フォーマットは LogFormat ディレクティブで定義したニックネームを指定してもいいし、ここで定義してもいい。 デフォルト値は logs/access.log common。
フォーマットに指定できる文字は、LogFormat ディレクティブと同じで、次のようなものがある。
%h リモートホスト
%l リモートログ名
%u リモートユーザ
%t 時間
%r リクエストの最初の行(GET / HTTP/1.1 とか)
%>s ステータス
%b HTTP ヘッダを除く送信バイト数
%{xxxx}i リクエストヘッダの項目 xxxx
%{Referer}i どの URL から移動してきたか
%{User-Agent}i ブラウザ情報
CommonLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
出力されるログは次のようになっている。
[12/Jun/2013:10:14:12 +0900] 192.168.0.100 SSLv3 RC4-MD5 "GET / HTTP/1.1" 1500

スポンサーリンク
レクタングル(大)