apache でSSLを使ってみた(基本接続編) では、SSL接続の基本的な設定について解説しました。
今回は、apacheでSSL接続を行い、認証まで行ってみます。
つまり、https:// でアクセスできて、さらに、アクセスできるユーザ(あらかじめ準備したクライアント証明書を持つユーザのみ)を限定してしまう手順について解説します。
(SSL認証の仕組みについては、SSL 認証 の仕組みと OpenVPN の認証の仕組み を参照してください。)
- 目次
- 履歴
2013年3月20日 初版
SSL用の証明書作成
apache でSSLを使ってみた(基本接続編)同様、
ここでは、プライベート認証局にて署名されたサーバー証明書を使いたいと思います。
さらに、先の記事では作成しなかったクライアント証明書も作成します。
サーバー証明書の作成は、プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について を参照してください。
(ここでは例として、サーバー証明書作成時の Common Name に www.exmaple.com を指定して作成します。)
また、クライアント証明書の作成は、プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について を参照してください。
(ここでは例として、クライアント証明書作成時の Common Name に taro yamada を指定して作成します。)
クライアント証明書は、秘密鍵を含めた PKCS#12フォーマットのものを使用します。
- OpenSSLのインストールは、 → OpenSSLのインストールする からどうぞ。
- プライベート認証局から作成が必要な方は、 → 証明書を作成する からどうぞ。
- サーバー証明書のみ作成が必要な方は、 → サーバー用の証明書を作成する。 からどうぞ。
- クライアント証明書のみ作成が必要な方は、 → クライアント用の証明書を作成する。 からどうぞ。
ここでは、サーバー証明書、秘密鍵ファイルがそれぞれ以下のファイル名で作成されたものとして、以降、記述します。
- プライベート認証局証明書 → /etc/pki/CA/cacert.pem
詳しい手順は、 → 証明書を作成する を参照してください。
以下は、先の記事の手順をかいつまんで解説しています。$ cd /etc/pki/tls/ # プライベート認証局の証明書を作成します。 # -- あらかじめ openssl-ca.cnf の作成が必要です。 $ CADAYS="-days 3650" SSLEAY_CONFIG="-config /etc/pki/tls/openssl-ca.cnf" /etc/pki/tls/misc/CA -newca ... # 認証局用パスフレーズ(パスワード)を入力します。 Enter PEM pass phrase: # 認証局用パスフレーズ(パスワード)を再入力します。 Verifying - Enter PEM pass phrase: ...
- サーバー証明書 → /etc/pki/CA/certs/www.example.com.crt
詳しい手順は、 → サーバー用の証明書を作成する。 を参照してください。
以下は、先の記事の手順をかいつまんで解説しています。$ cd /etc/pki/tls/ # サーバー証明書を作成します。 # -- あらかじめ openssl-server.cnf の作成が必要です。 $ DAYS="-days 3650" SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf" /etc/pki/tls/misc/CA -newreq ... # サーバー用のパスフレーズ(パスワード)を入力します。 Enter PEM pass phrase: # サーバー用のパスフレーズ(パスワード)を再入力します。 Verifying - Enter PEM pass phrase: ... # サイト名--ウェブサーバーで利用する場合は必ずここをサイト名に合わせる Common Name (eg, your name or your server's hostname) []: www.exmple.com ... # サーバー証明書にプライベート認証局の署名を行います。 $ SSLEAY_CONFIG="-config /etc/pki/tls/openssl-server.cnf" /etc/pki/tls/misc/CA -sign ... # CA証明書を作成する際に設定したパスフレーズ(パスワード)を入力する Enter pass phrase for /etc/.../CA/private/cakey.pem: ... # サーバー証明書にファイル名を変更して移動します。 $ mv /etc/pki/tls/newcert.pem /etc/pki/CA/certs/www.example.com.crt
- サーバー秘密鍵 → /etc/pki/CA/private/www.example.com.key
サーバー秘密鍵は、先のサーバー証明書を作成した時に作成されます。
ただ、そのままでは、Apache起動時にパスフレーズ(パスワード)が必要になりますので、それを回避するためにパスフレーズをはずします。$ cd /etc/pki/tls/ # 作成したサーバー用秘密鍵へパスフレーズを埋め込みます。 $ openssl rsa -in /etc/pki/tls/newkey.pem -out /etc/pki/CA/private/www.example.com.key ... # サーバー証明書、秘密鍵を作成したときのパスフレーズを入力する Enter pass phrase for newkey.pem: writing RSA key
- クライアント証明書(PKCS#12) → /etc/pki/CA/private/taro.yamada.example.com.pfx
このファイルのディレクトリは意味がありません。このファイルは、SSL接続するユーザのウェブブラウザにインストールされなければなりません。(以降で解説します。)
詳しい手順は、 → クライアント用の証明書を作成する。 を参照してください。
以下は、先の記事の手順をかいつまんで解説しています。$ cd /etc/pki/tls/ # クライアント証明書を作成します。 # -- あらかじめ openssl-client.cnf の作成が必要です。 $ DAYS="-days 3650" SSLEAY_CONFIG="-config /etc/pki/tls/openssl-client.cnf" /etc/pki/tls/misc/CA -newreq ... # クライアント用のパスフレーズ(パスワード)を入力します。 Enter PEM pass phrase: # クライアント用のパスフレーズ(パスワード)を再入力します。 Verifying - Enter PEM pass phrase: ... # クライアント名 Common Name (eg, your name or your server's hostname) []: Taro Yamada ... # クライアント証明書にプライベート認証局の署名を行います。 $ SSLEAY_CONFIG="-config /etc/pki/tls/openssl-client.cnf" /etc/pki/tls/misc/CA -sign ... # CA証明書を作成する際に設定したパスフレーズ(パスワード)を入力する Enter pass phrase for /etc/.../CA/private/cakey.pem: ... # クライアント証明書+秘密鍵からPKCS#12フォーマットへ変換します。 $ openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out /etc/pki/CA/private/taro.yamada.example.com.pfx ... # クライアント証明書を作成した時のパスフレーズ Enter pass phrase for newkey.pem: # ここで作成したPCL12ファイルを展開(読み込む)するためのパスフレーズ Enter Export Password: # --再入力 Verifying - Enter Export Password: ... # クライアント証明書のバックアップを作成します。失効時に必要になります。 $ mv /etc/pki/tls/newcert.pem /etc/pki/CA/client/certs/taro.yamada.example.com.crt
証明書 : SSL接続共通に必要な証明書です。
証明書 : SSL接続でクライアント認証を行う場合に必要な証明書です。
apache の SSL設定
apache の場合、まずは、SSLモジュールをインストールする必要があります。
以下にモジュールのインストールからapacheの設定まで簡単に解説します。
- まずは、SSLモジュールをインストールする。
まずは、SSLモジュールがインストールされていることが大前提になりますので、確認も含めてインストールしておきます。
# SSLモジュールがインストールされているか確認します。 $ rpm -qa|grep mod_ssl # SSLモジュールがインストールされていないようなので、インストールします。 $ yum -y install mod_ssl ... Complete! # 以下は、ちゃんとSSLモジュールがインストールされたか再確認しています。 $ rpm -qa|grep mod_ssl mod_ssl-2.2.15-15.el6.centos.1.i686
- apache の SSL設定する。
apache のSSL関連の設定は、すべて以下 /etc/httpd/conf.d/ssl.conf で行うことになっています。 以下にデフォルトの設定からの変更イメージを記載します。太字が編集箇所です。
/etc/httpd/conf.d/ssl.conf
... ## ## SSL Virtual Host Context ## <VirtualHost _default_:443> # General setup for the virtual host, inherited from global configuration # コメントをはずす DocumentRoot "/var/www/html" # コメントをはずす ServerName www.example.com:443 # Use separate log files for the SSL virtual host; note that LogLevel # is not inherited from httpd.conf. ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol all -SSLv2 # SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW # Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. A new # certificate can be generated using the genkey(1) command. #SSLCertificateFile /etc/pki/tls/certs/localhost.crt # サーバー証明書のパスを指定 SSLCertificateFile /etc/pki/CA/certs/www.example.com.crt # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key # サーバー秘密鍵のパスを指定 SSLCertificateKeyFile /etc/pki/CA/private/www.example.com.key ... # Certificate Authority (CA): # Set the CA certificate verification path where to find CA # certificates for client authentication or alternatively one # huge file containing all of them (file must be PEM encoded) #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt # プライベート認証局証明書のパスを指定 SSLCACertificateFile /etc/pki/CA/cacert.pem # Client Authentication (Type): # Client certificate verification type and depth. Types are # none, optional, require and optional_no_ca. Depth is a # number which specifies how deeply to verify the certificate # issuer chain before deciding the certificate is not valid. # SSL接続時 クライアント証明書を要求するように指定 SSLVerifyClient require # クライアント証明書を確認する階層レベルを指定(デフォルト10のままでOK) SSLVerifyDepth 10 ... </VirtualHost> ...
ここで設定しているのは、以下の必要最小限の項目のみの設定です。
- DocumentRoot : ドキュメントルート
- ServerName : サーバー名、ポート番号
- SSLCertificateFile : サーバー証明書
- SSLCertificateKeyFile : サーバー秘密鍵
- SSLCACertificateFile : プライベート認証局証明書
- SSLVerifyClient : クライアント接続時の認証
- SSLVerifyDepth : クライアント証明書を確認する階層レベル
各設定項目の色の違いは、以下のとおりです。
設定項目 : SSL接続共通に設定が必要な項目です。
設定項目 : SSL接続でクライアント認証を行う場合に設定が必要な項目です。
また、ここでの設定は、あくまで必要最小限の設定です。
- apacheを再起動する。
ここまでの設定を終えたら、最後にapacheを再起動します。
$ /etc/init.d/httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ]
FireFox の 設定
最後にウェブブラウザの設定例です。
先にも書いたようにプライベート認証局で署名したものは、デフォルトのウェブブラウザの設定では、警告メッセージが表示されます。
それを回避するためにプライベート認証局の証明書をウェブブラウザに取り込む必要があります。
ここでは、ウェブブラウザのFireFoxのみについて簡単に解説してみます。
- CA証明書をインストールする。
- CA証明書をコピーする。
サーバーで作成したプライベート認証局の証明書(CA証明書)をコピーします。
上記の例でいうと、/etc/pki/CA/cacert.pem になります。
ファイルの拡張子は、 crt がデフォルトですから、ダウンロードする際に、private_ca.crt へ変更しておきます。
- FireFoxのオプション画面を表示する。
FireFoxの [ メニュー ] – [ オプション ] でオプション画面を表示します。
FireFoxのオプション画面から、暗号化タブをクリック、証明書を表示…をクリックします。
- FireFoxの証明書マネージャ画面からCA証明書をインポートする。
先に手順で、以下のように証明書マネージャ画面が表示されます。認証局証明書タブをクリックし、インポートボタンをクリックします。
ファイル選択の画面が表示されますので、ここで、先にダウンロードし、ファイル名を変更したCA証明書(private_ca.crt )を選択し、インポートします。
ファイルが正しく読めたら、以下の確認画面が表示されます。
このチェックは、この認証局で署名された証明書は、どこまで信用しますか?ということです。
ここは、すべてをチェックしてもOKですが、とりあえず、ウェブサイトの信頼のみ(一番上)を有効とし、OKをクリックします。
あとは、すべてのオプション関連の画面を抜けて完了です。
- CA証明書をコピーする。
- クライアント証明書をインストールする。
- クライアント証明書(PKCS#12)をコピーする。
サーバーで作成したクライアント証明書(PKCS#12)をコピーします。
上記の例でいうと、/etc/pki/CA/private/taro.yamada.example.com.pfx になります。
- FireFoxのオプション画面を表示する。
FireFoxの [ メニュー ] – [ オプション ] でオプション画面を表示します。
FireFoxのオプション画面から、暗号化タブをクリック、証明書を表示…をクリックします。
- FireFoxの証明書マネージャ画面からクライアント証明書をインポートする。
先に手順で、以下のように証明書マネージャ画面が表示されます。あなたの証明書タブをクリックし、インポートボタンをクリックします。
ファイル選択の画面が表示されますので、ここで、先にダウンロードし、ファイル名を変更したクライアント証明書(taro.yamada.example.com.pfx )を選択し、インポートします。
この時、パスワードの問い合わせ画面が表示されます。
ここで入力するパスワードは、クライアント証明書からPCL12ファイルを作成した時に、設定したパスフレーズ になります。
パスワード(パスフレーズ)を入力し、OKボタンをクリックします。
パスワード(パスフレーズ)が正しければ、上記のようにOK画面が表示されます。
ファイルが正しくインポートできたら、以下のように証明書作成時にCommon Name に指定した名前が一覧に表示されるはずです。
これでOKです。あとは、すべてのオプション関連の画面を抜けて完了です。
- クライアント証明書(PKCS#12)をコピーする。
- 最後に https でアクセスしてみる。
最後に https でアクセスしてみましょう。
最初のアクセス時に、以下のようにFirefoxの場合、クライアント証明書の選択画面が表示されるはずです。
この画面は、
「サーバーから認証のためにクライアント証明書を求められていますが、どのクライアント証明書を送付しますか?」
というものです。
この例では、1つしかないのでそれを選択すればOKです。複数ある場合は、証明書の詳細内容から確認し、該当するクライアント証明書を選択し、OKボタンをクリックします。
警告メッセージが表示されずに、以下のようにアドレスバーに鍵マークが表示されればOKです。
鍵マークが灰色と緑色の違いは、
灰色が、通常の証明書によるSSL接続であるのに対して
緑色が、EV 証明書によるより厳格な認証手続きを行った上でSSL接続していることを意味します。
SSL接続時、以下のようなエラーが表示されることがあります。
- 接続がリセットされました。
このエラーは、単純にクライアント証明書がインストールされていない場合に出力されることがあります。
再度、クライアント証明書のインストールを行ってみてください。
- 安全な接続ができませんでした。
このエラーは、認証局をたどれない(エラーコード : ssl_error_unknown_ca_alert)というエラーです。
/etc/httpd/conf.d/ssl.conf の設定で、
SSLCACertificateFile の設定が正しく行えていない場合に出力されることがあります。
再度、apacheのSSLの設定を見直して行ってみてください。
- 接続がリセットされました。
これで、よりセキュアにはなりましたが、このクライアント証明書はコピーできますから、この証明書が外部に漏れる可能性もあります。 扱いには十分に注意が必要です。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :