~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 のガイドラインに従って画面写真を掲載しています Copyright by JCCH Security Solution Systems Co., Ltd., All Rights reserved
目次 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 3 / 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へのインポート方法 4 / 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: 各ディレクトリが存在しない場合は新規に作成してください プライベート 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 ファイルより秘密鍵を取得 openssl pkcs12 in ssl-server.p12 nocerts nodes out ssl-server.key 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 ディレクティブで指定してください 5 / 13
2.2.2. 秘密鍵の指定 SSLCertificateKeyFileディレクティブのコメントアウトをはずしてサーバ証明書の秘密鍵ファイルをフルパスで指定します 例 ) SSLCertificateFile /etc/pki/tls/server/ssl-server.key Note: 秘密鍵は root をオーナーにし パーミッションを 400 にすることをお勧めします 2.2.3. CA 証明書の指定 以下のコマンドで CA 証明書のハッシュリンクを作成します c_rehash /etc/pki/tls/ca_certs/ c_rehash は yum install openssl-perl でインストールします ssl.confのsslcacertificatefileディレクティブの下に SSLCACertificatePathディレクティブを記載し CA 証明書ファイルが置かれたディレクトリを指定します 例 ) SSLCACertificatePath /etc/pki/tls/ca_certs/ Note: openssl を 1.x 以上にアップデートした場合は ハッシュアルゴリズムが変更されているので c_rehash でハッシュリンクを作り直す必要があります 2.2.4. クライアント証明書要求を有効化 SSLVerifyClientディレクティブのコメントアウトをはずして クライアント証明書要求を有効にします この設定によりクライアント証明書による認証が有効になります SSLVerifyClient require 6 / 13
2.3. Apache の再起動 ssl.confファイルの編集が完了したら Apacheを再起動します netstat a grep https を実行して 以下の行が表示されれば正常に起動しています 何も表示されない場合 設定を確認してください tcp 0 0 *:https *:* LISTEN 以上で Apache の設定は終了です 7 / 13
3. 動作確認 クライアント証明書がインストールされた PC でインターネットエクスプローラを 起動して https://{web サーバのホスト名 }/ にアクセスします クライアント証明書を選ぶダイアログが表示されるので OK ボタンを押下しま す クライアント証明書による認証が実施され ウェブページが表示されます 8 / 13
Note: セキュリティ警告が表示される場合は 4.1 接続時の セキュリティ警 告 について を参照してください 4. その他 4.1. 接続時の セキュリティ警告 について Web サーバへの接続時 クライアント PC は Web サーバへサーバ証明書の提示を求めます クライアント PC は提示されたサーバ証明書の検証を行い 不備があった場合に セキュリティ警告 を表示します サーバ証明書の検証では 以下の項目を確認しています 1 信頼された認証局から発行された証明書であるか確認 2 サーバ証明書の有効期限の確認 3 接続先とサーバ証明書の一致確認 セキュリティ警告が表示されないようにするには 1 信頼された認証局から発行された証明書であるか確認サーバ証明書の発行元を信頼できるかどうかを クライアント PC が確認できない 9 / 13
場合に表示されます グローバルサインなどのパブリックな認証局で発行されたサーバ証明書を Web サーバに搭載するか 拇印を確認して CA 証明書を 信頼されたルート証明機関 に登録することで解決します クライアント PC の OS やブラウザによって表示されたり されなかったりする場合は Apache に中間証明書が正しく指定されているか確認します 2 有効期限の確認アクセス時のクライアント PC の時刻が サーバ証明書に記載されている有効期限の開始日と終了日の間ではないときに発生します クライアント PC の時刻が正しいか確認してください 時刻が正しい場合は サーバ証明書の有効期限が切れていないか確認し 切れている場合は新たなサーバ証明書を準備し搭載します 3 接続先とサーバ証明書の一致確認接続先 (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/ 10 / 13
c_rehashは yum install openssl-perl でインストールします 2.ssl.confのVirtualHostディレクティブの中に以下を記載します SSLCARevocationPath /etc/pki/tls/crls/ 3.Apacheを再起動 もしくは リロードします Notes: 認証局で証明書を失効しても Web サーバ上の証明書失効リストが自動的に更新される訳ではありません また NextUpdate の日付を過ぎた証明書失効リストは無効な情報と判断され Apache は全ての接続を拒否します 新たに証明書を失効した時や NextUpdate の日付が過ぎる前に 新しい証明書失効リストを取得して 既存の証明書失効リストと置き換える必要があります 多くの場合 証明書失効リストは認証局のリポジトリから HTTP または LDAP を用いてダウンロード可能です 以下の処理を cron などで定期的に実施することを推奨します CRL 取得処理手順 : 1. 認証局のリポジトリから wget 等で CRL ファイルを取得する 2. 正常にダウンロード出来たことを確認して /etc/pki/tls/crls/ のファイルを上書きコピーする 3.Apache を再起動 ( もしくはリロード ) する c_rehash を再度実行する必要はありません プライベート CA Gléas をご利用のお客様へ : Gléas の証明書失効リストは次の URL から取得できます http://{gléas のホスト名 or IP アドレス }/crl/crl_ia1.pem cron で実行を推奨する CRL 取得処理手順 のスクリプトを提供しております 5. 問い合わせ までご連絡ください 4.3. ディレクトリ毎にアクセス可能な証明書を変える方法 例えば https://{webサーバのホスト名 }/group-a/ はグループAのみがアクセス可能で https://{webサーバのホスト名 }/group-b/ はグループBのみがアクセス可能にしたい場合は SSLRequireディレクティブを利用します 11 / 13
<Location /group-a/> SSLRequire %{SSL_CLIENT_S_DN_OU} eq group-a </Location> <Location /group-b/> SSLRequire %{SSL_CLIENT_S_DN_OU } eq group-b </Location> Notes: 証明書のサブジェクトに複数の OU が存在する場合 apache の環境変数 SSL_CLIENT_S_DN_OU にはどれか一つだけが記録されているため 意図した動作とならない事があります その場合は サブジェクト全体を表す環境変数 SSL_CLIENT_S_DN を利用して 部分一致検索で対応可能です 例 ) SSLRequire %{SSL_CLIENT_S_DN} =~ m/group-a/ 4.4. クライアント証明書の情報をログに記録する方法 Apacheのログにクライアント証明書の情報を記録する事が可能です 記録することにより 下記例の様に誰が何時 何処からアクセスしてきたかを把握できます 192.168.20.28 user001 [08/Sep/2010:17:17:00 +0900] "GET / HTTP/1.1" 200 user001がクライアント証明書のcn アクセスログに証明書の情報を記載するには ssl.confのvirtualhostディレクティブの中に以下を記載します 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 4.5. PHP からクライアント証明書の情報を取得する方法 ssl.conf のSSLOptionsディレクティブのコメントアウトをはずすと PHPなどのサーバサイドプログラムの中でクライアント証明書の情報を参照することができます 12 / 13
SSLOptions +StdEnvVars 以下は PHP においてクライアント証明書の情報を参照する例です $_SERVER[ SSL_CLIENT_S_DN ] $_SERVER[ SSL_CLIENT_S_DN_CN ] // クライアント証明書のサブジェクト // クライアント証明書の CN(CommonName) 5. 問い合わせ ご不明な点がございましたら 以下にお問い合わせください 本書に関するお問い合わせ先株式会社 JCCH セキュリティ ソリューション システムズ Tel: 03-5615-1020 Mail: support@jcch-sss.com 13 / 13