サポート

[マネージドPKI] クライアント認証 Apacheの設定方法(SHA-1/SHA256併用)

SSLクライアント認証を行うにあたって、Apache上でSSLサーバー認証を有効にしている必要があります。SSLサーバー証明書の設定詳細は弊社サポートページを参照してください。

認証局証明書の用意

no01.gif以下より、ルート証明書・中間CA証明書を取得してください。

ルート証明書 SHA-1 SHA256
中間CA証明書 2016年4月3日以前に発行された証明書 SHA-1
2016年4月4日以降に発行された証明書 SHA-1
2016年7月10日以前に発行された証明書 SHA256
2016年7月11日以降に発行された証明書 SHA256

取得したファイルを1つのファイルに結合し、サーバに保存します。順不同でもかまいません。

結合の例

-----BEGIN CERTIFICATE-----
   <ルート証明書1>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
   <中間CA証明書1>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
   <ルート証明書2>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
   <中間CA証明書2>
-----END CERTIFICATE-----

保存先の例

/etc/httpd/conf/ssl.crt/root.pem

Apache設定ファイルの変更

Apacheのバージョン等により設定ファイル名、場所は多少異なりますがhttpd.conf 、ssl.conf、httpd-ssl.conf等の該当部分を設定します。

クライアント認証用 認証局証明書の設定例

SSLCACertificateFile /etc/httpd/conf/ssl.crt/root.pem

CRLファイルの設定例

SSLCARevocationFile /etc/httpd/conf/ssl.crl/crl.pem

SSLクライアント認証の設定の有効化

SSLOptions +StdEnvVars
SSLVerifyClient require
SSLVerifyDepth 3
<Directory "/var/www/httpdocs/test">
SSLRequire %{SSL_CLIENT_S_DN} =~ m?/O=GlobalSign K\.K\./OU=Sales/?
</Directory>

※SSLRequire で指定したクライアント証明書以外の接続を拒否するよう設定します。
専用BaseDNを利用することで、証明書のO(組織名)とOU(部門名)フィールドにはお客様固有の情報が設定されます。この部分をクライアント認証の設定にご利用ください。

CRL自動取得の設定

失効確認を利用する場合、前項で設定したCRLを自動で取得できるように設定します。
CRLは、証明書のCRL配布ポイントに記載されているURLからHTTPで取得することができます。
手動で指定場所に保存することも可能ですが、有効期限の切れたCRLは無効な情報と判断され、Apacheは認証しません。定期的に最新のCRLを取得する必要があります。
各アルゴリズムにおけるCRLの発行場所は以下のようになります。

SHA-1 2016年4月3日以前に発行された証明書 http://crl.globalsign.com/gs/gspersonalsign2g2.crl
2016年4月3日以降に発行された証明書 http://crl.globalsign.com/gs/gspersonalsign2g3.crl
SHA256 2016年7月10日以前に発行された証明書 http://crl.globalsign.com/gs/gspersonalsign2sha2g2.crl
2016年7月11日以降に発行された証明書 http://crl.globalsign.com/gspersonalsign2sha2g3.crl

ApacheはDER形式のCRLは読み込めないので、OpenSSLコマンドにてPEM形式に変換して利用します。
以下はサンプルスクリプトです。このようなスクリプトがcron設定等で自動的に実行されるようにしておきます。
※あくまでも一例であり、すべての環境における動作を保証するものではありません。
 サーバ環境等により設定が異なる場合がありますので、参考情報に留めていただき、ご利用の環境に合った設定をご確認ください。

対象CRLが2つの場合

以下のような設定が必要です。
赤字の部分は、対象のCRL配布ポイント、CRLファイル名、中間CA証明書ファイル名に合わせて適宜変更する必要があります。

#!/bin/sh

export LANG=C

# クライアント証明書に記載のCRL配布ポイント(CDP)からCRLを取得します。
# ご利用の証明書に対応する適切なURLで利用する必要があります。
# 最新のCRLをローカルに持っている場合はCRLを新たに取得しません。
wget --timestamping http://crl.globalsign.com/gs/gspersonalsign2sha2g2.crl >/dev/null 2>res1.txt
grep -w saved res1.txt > /dev/null
RES1=$?
rm -f res1.txt
wget --timestamping http://crl.globalsign.com/gspersonalsign2sha2g3.crl >/dev/null 2> res2.txt
grep -w saved res2.txt > /dev/null
RES2=$?
rm -f res2.txt

# 新たに取得したCRLをPEM形式に変換し、上位CAの署名を確認します。
# あらかじめ対応する中間CA証明書をリポジトリ(https://jp.globalsign.com/repository/)から取得し、
# シェルスクリプトが存在する同じディレクトリに保存しておく必要があります。
if [ $RES1 = 0 ] ; then
rm -f crl1.pem
openssl crl -inform der -in gspersonalsign2sha2g2.crl -outform pem -out crl1.pem 2>&1
openssl crl -in crl1.pem -CAfile ./pscacert_v3-2.cer -noout > /dev/null 2>/dev/null
RES1=$?
fi

if [ $RES2 = 0 ] ; then
rm -f crl2.pem
openssl crl -inform der -in gspersonalsign2sha2g3.crl -outform pem -out crl2.pem 2>&1
openssl crl -in crl2.pem -CAfile ./gspersonalsign2sha2g3ocsp.cer -noout > /dev/null 2>/dev/null
RES2=$?
fi

# どちらかのCRLがアップデートされていたら、2つのCRLを結合します。
# 必要であれば適切なディレクトリに移動させます。
if [ $RES1 = 0 ] || [ $RES2 = 0 ]
then
cp crl1.pem crl.pem
cat crl2.pem >> ./crl.pem
echo "Now crl.pem is updated"
else
echo "Current CRL is up-to-date and so not updated, otherwise there's an error"
exit 1
fi

/etc/rc.d/init.d/httpd graceful
# gracefulで問題のある環境ではrestartで対応ください。
# /etc/rc.d/init.d/httpd restart

対象CRLが3つの場合

以下のような設定が必要です。
赤字の部分は、対象のCRL配布ポイント、CRLファイル名、中間CA証明書ファイル名に合わせて適宜変更する必要があります。

#!/bin/sh

export LANG=C

# クライアント証明書に記載のCRL配布ポイント(CDP)からCRLを取得します。
# ご利用の証明書に対応する適切なURLで利用する必要があります。
# 最新のCRLをローカルに持っている場合はCRLを新たに取得しません。
wget --timestamping http://crl.globalsign.com/gs/gspersonalsign2sha2g2.crl >/dev/null 2>res1.txt
grep -w saved res1.txt > /dev/null
RES1=$?
rm -f res1.txt
wget --timestamping http://crl.globalsign.com/gspersonalsign2sha2g3.crl >/dev/null 2> res2.txt
grep -w saved res2.txt > /dev/null
RES2=$?
rm -f res2.txt
wget --timestamping http://crl.globalsign.com/gs/gspersonalsign2g3.crl >/dev/null 2> res3.txt
grep -w saved res3.txt > /dev/null
RES3=$?
rm -f res3.txt

# 新たに取得したCRLをPEM形式に変換し、上位CAの署名を確認します。
# あらかじめ対応する中間CA証明書をリポジトリ(https://jp.globalsign.com/repository/)から取得し、
# シェルスクリプトが存在する同じディレクトリに保存しておく必要があります。
if [ $RES1 = 0 ] ; then
rm -f crl1.pem
openssl crl -inform der -in gspersonalsign2sha2g2.crl -outform pem -out crl1.pem 2>&1
openssl crl -in crl1.pem -CAfile ./pscacert_v3-2.cer -noout > /dev/null 2>/dev/null
RES1=$?
fi

if [ $RES2 = 0 ] ; then
rm -f crl2.pem
openssl crl -inform der -in gspersonalsign2sha2g3.crl -outform pem -out crl2.pem 2>&1
openssl crl -in crl2.pem -CAfile ./gspersonalsign2sha2g3ocsp.cer -noout > /dev/null 2>/dev/null
RES2=$?
fi

if [ $RES3 = 0 ] ; then
rm -f crl3.pem
openssl crl -inform der -in gspersonalsign2g3.crl -outform pem -out crl3.pem 2>&1
openssl crl -in crl3.pem -CAfile ./gspersonalsign2g3ocsp_v2.cer -noout > /dev/null 2>/dev/null
RES3=$?
fi

# どちらかのCRLがアップデートされていたら、3つのCRLを結合します。
# 必要であれば適切なディレクトリに移動させます。
if [ $RES1 = 0 ] || [ $RES2 = 0 ] || [ $RES3 = 0 ]
then
cp crl1.pem crl.pem
cat crl2.pem >> ./crl.pem
cat crl3.pem >> ./crl.pem
echo "Now crl.pem is updated"
else
echo "Current CRL is up-to-date and so not updated, otherwise there's an error"
exit 1
fi

/etc/rc.d/init.d/httpd graceful
# gracefulで問題のある環境ではrestartで対応ください。
# /etc/rc.d/init.d/httpd restart

設定は以上で完了です。
Apacheを再起動し、有効なクライアント証明書でのアクセスが可能かご確認ください。

サポートサイト内検索

03-6370-6500 お気軽にお問い合わせください

音声ガイダンスが流れましたら、お問合わせの内容により以下の番号をプッシュしてください。

  1. 証明書のお申し込み、更新及びパスワードのお問い合わせ
  2. インストールなどの技術的なお問い合わせ
  3. 審査及び進捗確認に関するお問い合わせ
  4. その他のお問い合わせ(4を押した上で、以下の番号をお選びください。)
  5. お支払い、経理書類に関するお問い合わせ
  6. パートナー契約に関するお問い合わせ
  7. 総務へのご連絡

お問い合わせはこちら

SSLはグローバルサイン - © 2007-2017 GMO GlobalSign K.K. All rights reserved.