Copyright by JCCH Security Solution Systems Co., Ltd., All Rights reserved
プライベートCA Gléas ホワイトペーパー
~Apache におけるクライアント証明書を
利用したユーザ認証の設定手順~
Ver.1.1 2010 年 9 月Copyright by JCCH Security Solution Systems Co., Ltd., All Rights reserved ・ JCCH・セキュリティ・ソリューション・システムズ、JS3 およびそれらを含むロゴは日本および他 の国における株式会社 JCCH・セキュリティ・ソリューション・システムズの商標または登録商標で す。Gléas は株式会社 JCCH・セキュリティ・ソリューション・システムズの商標です。 ・ その他本文中に記載されている製品名および社名は、それぞれ各社の商標または登録商標です。 ・ Microsoft Corporation のガイドラインに従って画面写真を掲載しています。
3 / 13 目次 1. はじめに ... 4 1.1. 本書について ... 4 1.2. 本書における環境 ... 4 2. Apache の設定 ... 5 2.1. ファイルのアップロード ... 5 2.2. ssl.conf の編集 ... 5 2.2.1. サーバ証明書の指定 ... 5 2.2.2. 秘密鍵の指定 ... 6 2.2.3. CA 証明書の指定 ... 6 2.2.4. クライアント証明書要求を有効化 ... 6 2.3. Apache の再起動 ... 7 3. 動作確認 ... 8 4. その他 ... 9 4.1. 接続時の「セキュリティ警告」について ... 9 4.2. 証明書失効リスト(CRL)の設定 ... 10 4.3. ディレクトリ毎にアクセス可能な証明書を変える方法... 11 4.4. クライアント証明書の情報をログに記録する方法 ... 12 4.5. PHP からクライアント証明書の情報を取得する方法 ... 12 5. 問い合わせ ... 13
4 / 13
1. はじめに
1.1. 本書について
本書では、Apacheでクライアント証明書認証を行う環境を構築するための設定例 を記載します。 主な対象とするユーザは、公開鍵暗号基盤(PKI)を利用したクライアント証明書 による認証を検討しているWebサイト管理者、および、Webプログラマーをター ゲットとしています。 なお、サーバ証明書およびクライアント証明書がお手元に無い方は、テスト用証 明書をご利用ください。(※テスト証明書につきましては、『5. 問い合わせ』ま でご連絡ください)1.2. 本書における環境
本書における手順は、以下の環境で作成しています。 CentOS 5.5 Apache HTTP Server 2.2.3 ※以後、「Apache」と記載します mod_ssl 2.8.31 OpenSSL 0.9.8e openssl-perl Apache、mod_ssl、OpenSSL、openssl-perlはyumを利用してインストールして います。これらがインストールされていない場合は、「yum -y install httpd openssl mod_ssl openssl-perl」等のコマンドでインストールしてください。 以下については、本書では説明を割愛します。 - Webサーバのネットワーク設定等の基本設定 クライアントPCから、https://{Webサーバのホスト名}/として接続できること を前提としています。 接続できない場合は、Apacheやファイヤーウォール、SELinux、名前解決等の 設定を確認してください。 - クライアント証明書のPCへのインポート方法5 / 13
2. Apacheの設定
2.1. ファイルのアップロード
次のファイルを Web サーバにアップロードします。 ファイル名、アップロード先ディレクトリ共にサンプルとなります。本書では以下 の名前であることを前提に記載します。 ファイル名※1 アップロード先ディレクトリ名※2 CA 証明書 ia1.pem /etc/pki/tls/ca_certs/ サーバ証明書 ssl-server.crt /etc/pki/tls/server/ 秘密鍵 ssl-server.key /etc/pki/tls/server/ 失効情報ファイル crl_ia1.pem /etc/pki/tls/crls/ ※2 ※1:テスト用証明書の各ファイル名も、上記と同じファイル名となっています。 ※2:各ディレクトリが存在しない場合は新規に作成してください。2.2. ssl.conf の編集
ssl.conf(/etc/httpd/conf.d/ssl.conf)ファイルを以下のとおり編集します。2.2.1. サーバ証明書の指定
SSLCertificateFileディレクティブのコメントアウトをはずしてサーバ証明書ファイ ルをフルパスで指定します。 例) SSLCertificateFile /etc/pki/tls/server/ssl-server.crt ※ サ ー バ 証 明 書 の 発 行 元 か ら 指 定 が あ っ た 場 合 、 中 間 証 明 書 を SSLCertificateChainFile ディレクティブで指定してください。 プライベートCA Gléasをご利用のお客様へ: Ⅰ. CA証明書は次のURLからダウンロードできます。 http://{Gléasのホスト名 or IPアドレス}/crl/ia1.pem Ⅱ. Gléasからダウンロードしたサーバ証明書はPKCS#12という形式に なっているため、PEM形式に変換・分離する必要があります。 1.PKCS#12ファイルより証明書を取得openssl pkcs12 –in ssl-server.p12 –clcerts –nokeys –out ssl-server.crt
2.PKCS#12ファイルより秘密鍵を取得
6 / 13
2.2.2. 秘密鍵の指定
SSLCertificateKeyFileディレクティブのコメントアウトをはずしてサーバ証明書の 秘密鍵ファイルをフルパスで指定します。 例) SSLCertificateFile /etc/pki/tls/server/ssl-server.key2.2.3. CA 証明書の指定
以下のコマンドでCA証明書のハッシュリンクを作成します。※c_rehashは「yum install openssl-perl」でインストールします
ssl.confのSSLCACertificateFileディレクティブの下に、SSLCACertificatePathディレ クティブを記載し、CA証明書ファイルが置かれたディレクトリを指定します。 例) SSLCACertificatePath /etc/pki/tls/ca_certs/
2.2.4. クライアント証明書要求を有効化
SSLVerifyClientディレクティブのコメントアウトをはずして、クライアント証明書 要求を有効にします。この設定によりクライアント証明書による認証が有効になり ます。 SSLVerifyClient require Note: 秘密鍵はrootをオーナーにし、パーミッションを400にすることをお勧 めします。 Note: opensslを1.x以上にアップデートした場合は、ハッシュアルゴリズムが 変更されているので、c_rehash でハッシュリンクを作り直す必要があり ます。 c_rehash /etc/pki/tls/ca_certs/7 / 13
2.3. Apache の再起動
ssl.confファイルの編集が完了したら、Apacheを再起動します。
「netstat –a | grep https」を実行して、以下の行が表示されれば正常に起動していま す。何も表示されない場合、設定を確認してください。
以上でApacheの設定は終了です。
8 / 13 クライアント証明書がインストールされた PC でインターネットエクスプローラを 起動して、https://{Web サーバのホスト名}/にアクセスします。 クライアント証明書を選ぶダイアログが表示されるので、「OK」ボタンを押下しま す。 クライアント証明書による認証が実施され、ウェブページが表示されます。
9 / 13
4. その他
4.1. 接続時の「セキュリティ警告」について
Web サーバへの接続時、クライアント PC は Web サーバへサーバ証明書の提示を 求めます。クライアント PC は提示されたサーバ証明書の検証を行い、不備があっ た場合に「セキュリティ警告」を表示します。 サーバ証明書の検証では、以下の項目を確認しています。 ① 信頼された認証局から発行された証明書であるか確認 ② サーバ証明書の有効期限の確認 ③ 接続先とサーバ証明書の一致確認 ※セキュリティ警告が表示されないようにするには・・・ ① 信頼された認証局から発行された証明書であるか確認 サーバ証明書の発行元を信頼できるかどうかを、クライアント PC が確認できない Note: セキュリティ警告が表示される場合は、『4.1 接続時の「セキュリティ警 告」について』を参照してください。10 / 13 グローバルサインなどのパブリックな認証局で発行されたサーバ証明書を Web サ ーバに搭載するか、拇印を確認して CA 証明書を「信頼されたルート証明機関」に 登録することで解決します。 クライアント PC の OS やブラウザによって表示されたり、されなかったりする場 合は、Apache に中間証明書が正しく指定されているか確認します。 ② 有効期限の確認 アクセス時のクライアント PC の時刻が、サーバ証明書に記載されている有効期限 の開始日と終了日の間ではないときに発生します。 クライアント PC の時刻が正しいか確認してください。時刻が正しい場合は、サー バ証明書の有効期限が切れていないか確認し、切れている場合は新たなサーバ証明 書を準備し搭載します。 ③ 接続先とサーバ証明書の一致確認 接続先(Internet Explorer のアドレスバーの「https://」から次の「/ (スラッシュ)」 まで)とサーバ証明書の発行先(Subject の CN や SubjectAltName)が異なってい る場合に発生します。 サーバ証明書の CN が正しいか確認してください。正しくない場合は、サーバ証明 書を再発行してください。また、サーバ証明書の CN がホスト名で書かれている場 合は、IP アドレスでアクセスした場合も発生します。
4.2. 証明書失効リスト(CRL)の設定
証明書失効リスト(CRL:Certificate Revocation List)とは、特定の証明書の利用を停 止させたい時などに利用します。証明書の利用を停止することで、その証明書を所 有しているユーザのアクセスを禁止させることができます。 証明書の利用を停止することを、証明書の失効と言い、失効情報が記載されたデー タを証明書失効リストと言います。証明書失効リストの中には失効した証明書のシ リアル番号の全て(または一部)が記載されています。 テスト証明書では、user002.p12 が失効された証明書となっています。 証明書失効リストを利用するには以下の手順を実施します。 1.次のコマンドを実行し、証明書失効リストのハッシュリンクを作成します。 c_rehash /etc/pki/tls/crl/
11 / 13
※c_rehashは「yum install openssl-perl」でインストールします
2.ssl.confのVirtualHostディレクティブの中に以下を記載します。 3.Apacheを再起動、もしくは、リロードします。
4.3. ディレクトリ毎にアクセス可能な証明書を変える方法
例えば、https://{Webサーバのホスト名}/group-A/ はグループAのみがアクセス可能 で、https://{Webサーバのホスト名}/group-B/ はグループBのみがアクセス可能にし たい場合は、SSLRequireディレクティブを利用します。 Notes: 認証局で証明書を失効しても、Web サーバ上の証明書失効リストが自動 的に更新される訳ではありません。また、NextUpdate の日付を過ぎた証 明書失効リストは無効な情報と判断され、Apacheは全ての接続を拒否し ます。 新たに証明書を失効した時やNextUpdateの日付が過ぎる前に、新しい証 明書失効リストを取得して、既存の証明書失効リストと置き換える必要が あります。 多くの場合、証明書失効リストは認証局のリポジトリから HTTP または LDAP を用いてダウンロード可能です。以下の処理を cronなどで定期的 に実施することを推奨します。 CRL取得処理手順: 1.認証局のリポジトリからwget等でCRLファイルを取得する 2.正常にダウンロード出来たことを確認して、 /etc/pki/tls/crls/のファイ ルを上書きコピーする 3.Apacheを再起動(もしくはリロード)する ※ c_rehashを再度実行する必要はありません。 SSLCARevocationPath /etc/pki/tls/crls/プライベート
CA Gléasをご利用のお客様へ
: ・Gléasの証明書失効リストは次のURLから取得できます。 http://{Gléasのホスト名 or IPアドレス}/crl/crl_ia1.pem ・cronで実行を推奨する「CRL 取得処理手順」のスクリプトを提供して おります。『5. 問い合わせ』までご連絡ください。12 / 13
4.4. クライアント証明書の情報をログに記録する方法
Apacheのログにクライアント証明書の情報を記録する事が可能です。記録すること により、下記例の様に誰が何時、何処からアクセスしてきたかを把握できます。 ※user001がクライアント証明書のCN アクセスログに証明書の情報を記載するには、ssl.confのVirtualHostディレクティブ の中に以下を記載します。4.5. PHP からクライアント証明書の情報を取得する方法
ssl.conf のSSLOptionsディレクティブのコメントアウトをはずすと、PHPなどのサ ーバサイドプログラムの中でクライアント証明書の情報を参照することができます。 Notes: 証明書のサブジェクトに複数のOU が存在する場合、apacheの環境変数 SSL_CLIENT_S_DN_OU にはどれか一つだけが記録されているため、意 図した動作とならない事があります。その場合は、サブジェクト全体を表 す環境変数 SSL_CLIENT_S_DN を利用して、部分一致検索で対応可能 です。 例)SSLRequire %{SSL_CLIENT_S_DN} =~ m/group-a/
LogFormat "%h %l %{SSL_CLIENT_S_DN_CN}i %t \
\"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" ssl_access
CustomLog logs/ssl_access_log ssl_access
192.168.20.28 – user001 [08/Sep/2010:17:17:00 +0900] "GET / HTTP/1.1" 200 SSLRequire %{SSL_CLIENT_S_DN_OU} eq “group-a”
</Location>
<Location /group-B/>
SSLRequire %{SSL_CLIENT_S_DN_OU } eq “group-b” </Location>
13 / 13 SSLOptions +StdEnvVars 以下は、PHPにおいてクライアント証明書の情報を参照する例です。