$Id: https-guide.html,v 1.4 2004-05-31 01:27:24+09 taiji-k Exp $
https サーバの設定方法
はじめに
このドキュメントは、サーバ証明書を使って https サーバと https
クライアント(ブラウザ)の相互認証を行い、対象とするユーザに特定
のWebページを閲覧してもらうための設定方法について説明をします。
このドキュメントは、Apache HTTP サーバ http://httpd.apache.org/ の設定
と X.509 形式の公開鍵証明書に関する基本的な知識を持っている方を対象
としています。
Apache HTTP サーバを使って World Wide Web サーバを構築したことが
ない方は、「Apache HTTP サーババージョン 2.0 ドキュメント」
http://httpd.apache.org/docs-2.0/
を参考になさって下さい。
また X.509 形式の公開鍵証明書の有効性の検証をしたことがない方には
IPA による PKI 関連技術解説 の第三章「認証局と電子証明書」
http://www.ipa.go.jp/security/pki/031.html
が参考になります。
このドキュメントでは以下のバージョンのソフトウェアを使うことを想定しています。
- httpd-2.0.39
- OpenSSL-0.9.6e
設定の手順
このドキュメントでは以下の手順で設定するものとします。
- 証明書の取得と必要なファイルの用意
- ファイルの配置
- 設定ファイルの編集
なお、クライアント認証の際に必要になる設定項目については、"クライアント認証の場合"と特記してあります。すでにサーバ認証を行なっているサーバでクライアント認証を行なうように設定する場合に、参考にして下さい。
証明書の取得と必要なファイルの用意
https サーバで利用できるサーバ証明書を取得して下さい。
WIDE moCA のCAが発行しているサーバ証明書は
"サーバ証明書の発行申請"
http://moca.wide.ad.jp/moca_guide/new-server-cert.html
に書いてある手順に従うと申請することができます。
発行された証明書は基本的に電子メールを使って配布されます。
証明書を取得したら、以下のファイルを用意します。
証明書関連ファイルの配置
前節の手順で用意したファイルを、サーバの設定ファイルで指定するディレクトリの置き、検証に必要なシンボリックリンクの作成を行ないます。
ファイルは PEM 形式で置きます。PEM 形式は以下のようなテキストの形式です。
-
-----BEGIN CERTIFICATE-----
MIIDaDCCAlCgAwIBAgIBHTANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJKUDEV
MBMGA1UEChMMV0lERSBQcm9qZWN0MRAwDgYDVQQDEwdST09UIENBMB4XDTAwMDEy
:
mqo+8k1ltDM5gH/a+CR9yY+4VSo7B6h8ijNTInEl6YYOMgJ8S5jvCB0IhUB4aGKy
WJR+SzGDIQkyGHFp
-----END CERTIFICATE-----
証明書を保存する形式には、この PEM 形式の他に DER 形式、BER 形式があります。
moCA の配布するサーバ証明書は PEM 形式です。
ここでは、以下のようにファイルを置くものとします。
- サーバ証明書
/usr/local/apache2/conf/ssl.crt/server.crt
- サーバ秘密鍵
/usr/local/apache2/conf/ssl.key/server.key
- サーバ証明書を発行したCA証明書
/usr/local/apache2/conf/ssl.crt/ca.crt
※このファイルにすべてのCA証明書のファイルを連結して保存します。
CA証明書は DER 形式なので、連結するためには PEM 形式に変換する必要があります。
-
openssl コマンドを使うと形式の変更ができます。
# openssl x509 \
-inform der \
-in moca2048_0207.cert \
-outform pem \
-out moca2048_0207.pem
従って、ca.crt の内容は以下のようになると思います。
# cat ca.crt
-----BEGIN CERTIFICATE-----
MIIC/TCCAeWgAwIBAgIBEDANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJKUDEV
:
PvT1qvHA+Kl1+DmKa5N83zM2SEZV1osfLnIkn0eoOOssbtecKMY00OSFgu1l8kvs
QQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDHTCCAgWgAwIBAgIBGTANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJKUDEV
:
QuCQXL/mR2Mo+WNb6IFJMWjqq5w+oYzC2SMmyo8YEm7h
-----END CERTIFICATE-----
#
- クライアント認証に使われるCA証明書(クライアント認証する場合)
/usr/local/apache2/conf/ssl.crt/ssl.crt/
このディレクトリに適当なファイル名で保存します。
※以下の手順でシンボリックリンクを作成しておきます。(ファイル名は cacert.pem としています)
# cd conf/ssl.crt/
# ln -s cacert.pem `openssl x509 -in cacert.pem -noout -hash`.0
- クライアント認証に使われるCRL(クライアント認証する場合)
/usr/local/apache2/conf/ssl.crl/
このディレクトリに適当なファイル名で保存します。
※以下の手順でシンボリックリンクを作成しておきます。
# cd conf/ssl.crl/
# ln -s widerootcrl.crl `openssl crl -in widerootcrl.crl -noout -hash`.r0
# ln -s mocacrl.crl `openssl crl -in mocacrl.crl -noout -hash`.r0
ln コマンドや openssl コマンドを実行しているのは、いわゆるハッシュリンクと呼ばれるシンボリックリンクを作成するためです。
ハッシュリンクとは、ファイル名がDNのハッシュ値になっているシンボリックリンクのことで、証明書の検証の際に openssl のライブラリが発行者の名前(DN)から該当する証明書のファイルを見つけるために使われます。
httpd の設定
httpd の SSL に関する設定ファイルである ssl.conf の基本的な設定項目について説明します。
前節までに述べたファイルの置き場所を記述する例を紹介します。
- SSLEngine on
SSLが有効か無効かの設定。VirtualHost 構文を使用している場合、VirtualHost ごとに設定することができます。
ここでは SSL を利用するので on を指定します。
- SSLVerifyClient optional
httpsサーバがSSLクライアントの認証をするかどうかを決定します。
なお、クライアント認証をしない場合にもクライアントによるサーバ認証は必ず行なわれます。
- require
クライアント認証を行なう。認証が成功しなければ接続を拒否する。
- optional
クライアント認証ができる場合に行なう。
- optional_no_ca
クライアント証明書の検証が成功しなくてもよい。
- none
クライアント認証を行なわない。TCPデータグラムは暗号化される。
- SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
サーバ証明書のファイル名
- SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
サーバ秘密鍵のファイル名
- SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt
サーバ証明書のCA証明書のファイル名
- SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
(クライアント認証する場合)
クライアント認証に使われる証明書を置いたディレクトリ
このディレクトリにCA証明書のファイルとハッシュリンクが置かれる。
- SSLCARevocationPath /usr/local/apache2/conf/ssl.crl
(クライアント認証する場合)
クライアント認証に使われるCRLのディレクトリ
このディレクトリにCRLのファイルとハッシュリンクが置かれる。
以上の設定項目は証明書の置き場所に関するものです。
SSL の設定にはこの他に、以下のような設定項目があります。設定項目とデフォルト値を列挙します。
- SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSL のネゴシエーションの際に使われる鍵交換アルゴリズム・認証アルゴリズム・暗号化アルゴリズム・メッセージダイジェストアルゴリズムの種類の設定を行ないます。
詳しくは http://httpd.apache.org/docs-2.0/mod/mod_ssl.html#sslciphersuite をご覧下さい。
- SSLLogLevel none
SSL プロトコルエンジンが出力するログの詳しさを設定します。
設定項目の種類は none, error, warn, info, trace, debug で、より右の項目が詳細になります。
- SSLVerifyDepth 10
検証の際に有効なCA証明書の数を設定します。
0 に設定されていると、クライアント証明書が自己署名証明書である場合で、この証明書の他に証明書を検証する必要がない場合にのみ有効になります。
1 に設定されていると、クライアント証明書を発行しているCA証明書が自己証明書であるか、そのCAがサーバの知っているCAである場合にのみ有効になります。サーバが知っているCAとはSSLCACertificatePathで設定されているディレクトリに証明書が保存されているもののことです。
- SSLOption
SSLに関するオプショナルな設定です。
以下の項目を列挙して記述します。デフォルトは設定なしです。
特定のディレクトリに対して設定項目を増やしたり、逆に設定されている項目を無効にするために、+FakeBasicAuth -ExportCertData と記述することができます。
- FakeBasicAuth
HTTP の Basic Authentication 機能で使われるユーザ名に証明書中の DN が渡されます。
パスワードを xxj31ZMTZzkVA に設定するとそのユーザはパスワードを入力せずにアクセスできます。
- ExportCertData
SSLで交換された証明書が SSL_CLIENT_CERT や SSL_SERVER_CERT といった環境変数に設定されます。この環境変数は CGI や SSI を使って参照することができます。
- StdEnvVars
SSL_* という SSL に関連した環境変数が設定されます。
この環境変数は CGI や SSI を使って参照することができます。
- CompatEnvVars
Apache-SSL 1.x, mod_ssl 2.0.x, Sioux 1.0, Stronghold 2.x と共通の変数名で、環境変数が設定されるようになります。
元の変数名と共通化された変数名の対応付けについては http://httpd.apache.org/docs-2.0/mod/mod_ssl.html のEnvironment Variablesの項を参照して下さい。
- StrictRequire
"Satisfy any" の設定がされている場合にも SSLRequireSSL や SSLRequire が適用されます。
つまり他のアクセス制御に関する設定を行なっていても、SSLでない場合にはアクセスが拒否されます。
- OptRenegotiate
SSL の再交渉を有効にします。
ディレクトリ毎に SSL の設定をしているいて、SSL の再交渉が必要な場合に使います。
4. アクセス制御
SSL を使ってクライアント認証を行なうと、クライアント証明書に含まれる情報を使ったアクセス制御を行うことができます。
このアクセス制御は、mod_auth及びmod_accessを使った規則に加えて、httpd が持つ証明書の内容にもとづいた規則を使って行なうことができます。
ここでは、環境変数の値に応じたアクセス制御を行う例を紹介します。
すべての例では以下の設定を行なっているものとします。
-
SSLEngine on
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt
SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
SSLCARevocationPath /usr/local/apache2/conf/ssl.crl
-
特定のディレクトリ /usr/local/apache2/htdocs/require-clientauth で
クライアント認証を要求する場合
<Directory /usr/local/apache2/htdocs/require-clientauth>
SSLVerifyClient require
SSLVerifyDepth 2
</Directory>
この設定によって /usr/local/apache2/htdocs/require-clientauth/ 以下に
あるファイルは、クライアント認証が成功しなければアクセスできません。
-
特定のディレクトリに /usr/local/apache2/htdocs/require-cjp で
クライアント認証を要求し、クライアントの証明書の DN 中の C が JP である
場合にのみアクセスを許可する場合
<Directory /usr/local/apache2/htdocs/require-cjp>
SSLVerifyClient require
SSLVerifyDepth 2
SSLRequire ( %{SSL_CLIENT_S_DN_C} eq "JP" )
</Directory>
クライアント証明書の中のフィールドは、環境変数を参照することができます。
参照することができる環境変数の例を
SSLに関係する環境変数にまとめます。
a. SSLに関係する環境変数
SSLを使って接続すると httpd (mod_ssl) によって以下のような環境変数が
設定されます。
環境変数名 |
説明 |
値の例 |
HTTPS |
SSLを使った接続であるかどうか |
on, off |
REMOTE_USER |
BasicAuth 機能を使って認証された際のユーザ名 |
taiji-k |
SSL_PROTOCOL |
接続に使われているSSLのプロトコル名 |
TLSv1, SSLv2, SSLv3 のうちのどれか |
SSL_CLIENT_VERIFY |
クライアント認証が成功しているかどうか |
NONE, SUCCESS, GENEROUS, FAILED:理由 のうちのどれか |
SSL_CIPHER |
SSLで使われている暗号とハッシュアルゴリズムの名前 |
RC4-MD5 |
SSL_CIPHER_USEKEYSIZE |
SSLで使われている暗号鍵のビット長 |
128 |
SSL_CIPHER_ALGKEYSIZE |
SSLで使われる暗号鍵の可能性ビット長 |
128 |
SSL_SERVER_A_KEY |
SSLで使われている暗号アルゴリズムの名前 |
rsaEncryption |
SSL_SERVER_A_SIG |
SSLで使われている署名アルゴリズムの名前 |
sha1WithRSAEncryption |
参考文献
- SSL/TLS Strong Encryption: How-To
http://httpd.apache.org/docs-2.0/ssl/ssl_howto.html
Kimura Taiji <taiji-k@is.aist-nara.ac.jp>
moCA