CentOS の Apache でクライアント証明書認証(修正版)

<2010/02/13追記>
MTからWordpressにインポートした時に失敗していたようで、記事が途中できれてました(^^;
確認したい内容があって自分で調べてて気が付きました。修正しましたので最後まで見れるようになりました。

CentOSのApacheでクライアント証明書認証をしてみる。CentOS5の場合、ちょっと手順を工夫しないとIEでつながらなかったので一部修正しました。(OpenSSLのバージョンの関係だと思うけど。)
IEでクライアント証明書をインポートしてつなぐと、
「証明のパスの証明機関は証明書を発行する権限がないか、この証明書をエンドエンティティ証明書として使うないとができないため、この証明書は無効です。」
となってしまう件の対応です。
openssl.cnfで、「basicConstraints=CA:true」でCAを作成していないと出る様子。

作業は「/var/www/ssl」で行い、独自認証局のフォルダは「/var/www/ssl/hogeCA」に作ります。また証明書の期限は10年(3650日)にしてあります。

◆作業準備
作業フォルダ作成

mkdir -p  /var/www/ssl

破棄証明書用フォルダ作成

mkdir -p  /var/www/ssl/ssl.crl
touch /var/www/ssl.crl/cert.crl

opensslの設定
/etc/pki/tls/openssl.cnf (CentOS5)
/usr/share/ssl/openssl.cnf (CentOS4)

> dir             = ./demoCA              # Where everything is kept
< dir             = ./hogeCA              # Where everything is kept

証明書のポリシーを変えたい場合(デフォルトはcountryName,stateOrProvinceName,organizationNameがCAと一致しないとだめなのでCA組織外に発行する場合に困る)

policy          = policy_match

policy_matchを直下に定義してある「policy_anything 」に変えるとか、「policy_match」自体を変更するとか(下の例)
変更前

[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

変更後

[ policy_match ]
countryName             = supplied
stateOrProvinceName     = supplied
organizationName        = supplied
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

ちなみに

match    CAと同じじゃないとダメ
supplied 入力必須
optional あってもなくてもいい

CSRを頻繁に作成してデフォルト値を決めておきたいときは以下の項目を変更しておくと入力が楽になります。

countryName_default             = JP
stateOrProvinceName_default     = 
localityName_default            = 
0.organizationName_default      = 

CA作成スクリプトコピー

cp -p /etc/pki/tls/misc/CA /var/www/ssl/ (CentOS5)
cp -p /usr/share/ssl/misc/CA /var/www/ssl/ (CentOS4)

/var/www/ssl/CA

#DAYS="-days 365"       # 1 year
DAYS="-days 3650"       # 10 year
#CADAYS="-days 1095"    # 3 years
CADAYS="-days 3650"     # 10 years
#CATOP=./demoCA
CATOP=/var/www/ssl/hogeCA

◆認証局CAの作成
/etc/pki/tls/openssl.cnf (CentOS5)

[ usr_cert ]
#MakeCA
basicConstraints=CA:true
nsCertType = sslCA, emailCA
keyUsage = cRLSign, KeyCertSign
cd /var/www/ssl
./CA -newca
CA certificate filename (or enter to create)
	止まるので改行をいれる


Making CA certificate ...
Generating a 1024 bit RSA private key
.............++++++
.......++++++
writing new private key to '/var/www/ssl/hogeCA/private/./cakey.pem'
Enter PEM pass phrase: CAの秘密鍵のパスフレーズ
Verifying - Enter PEM pass phrase: CAの秘密鍵のパスフレーズ確認
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: 国
State or Province Name (full name) [Some-State]: 県
Locality Name (eg, city) []: 市町村名
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名
Organizational Unit Name (eg, section) []: 部署名
Common Name (eg, YOUR name) []:サーバ名(FQDN名)
Email Address []: メールアドレス

CAの秘密鍵のパスフレーズ除去

openssl rsa -in hogeCA/private/cakey.pem -out hogeCA/private/cakey.pem

破棄証明書の管理番号ファイルを作成(CentOS5で破棄証明書を使用する際必要)

echo '00' > hogeCA/crlnumber

◆apacheのサーバで使うサーバ証明書を作成
/etc/pki/tls/openssl.cnf (CentOS5)

[ usr_cert ]
#MakeCA
#basicConstraints=CA:true
#nsCertType = sslCA, emailCA
#keyUsage = cRLSign, KeyCertSign
#Server
basicConstraints = CA:FALSE
nsCertType = server

秘密鍵の作成

openssl genrsa  -des3 -out /var/www/ssl/server.key 1024

秘密鍵のパスフレーズの除去

openssl rsa -in /var/www/ssl/server.key -out /var/www/ssl/server.key

上で付けたパスフレーズを聞いてくるので入力する

CSRの作成

openssl req -new -days 3650 -key /var/www/ssl/server.key -out /var/www/ssl/server.csr
Country Name (2 letter code) [AU]: 国
State or Province Name (full name) [Some-State]: 都道府県
Locality Name (eg, city) []: 市町村名
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名
Organizational Unit Name (eg, section) []: 部署名
Common Name (eg, YOUR name) []: サーバ名(FQDN名)
Email Address []: メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 適当にパスワード
An optional company name []: 適当にパスワード確認

CSRに作成した認証局で署名してサーバ証明書を作成

cd /var/www/ssl/
openssl ca -days 3650 -in server.csr -keyfile hogeCA/private/cakey.pem  \
        -cert hogeCA/cacert.pem -out server.crt

◆クライアント側の証明書を作成
/etc/pki/tls/openssl.cnf (CentOS5)

[ usr_cert ]
#MakeCA
#basicConstraints=CA:true
#nsCertType = sslCA, emailCA
#keyUsage = cRLSign, KeyCertSign
#Server
#basicConstraints = CA:FALSE
#nsCertType = server
#Client
basicConstraints = CA:FALSE
nsCertType = client, email

クライアント用秘密鍵作成

cd /var/www/ssl
openssl genrsa -des3 -out client.key 1024

秘密鍵のパスフレーズの除去

openssl rsa -in client.key -out client.key

上で付けたパスフレーズを聞いてくるので入力する

クライアント証明書のCSRを作成

openssl req -new -days 3650 -key client.key -out client.csr
Country Name (2 letter code) [AU]: 国
State or Province Name (full name) [Some-State]: 都道府県
Locality Name (eg, city) []: 市町村
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名
Organizational Unit Name (eg, section) []: 部署名
Common Name (eg, YOUR name) []: サーバ名(FQDN名)
Email Address []: メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 空欄でOK
An optional company name []: 空欄でOK

クライアント署名書にCAで署名する

openssl ca  -days 3650 -in client.csr -out client.crt

クライアント証明書をPEM形式からPKCS12形式形式へ変換

openssl pkcs12 -export -in client.crt              \
                       -inkey client.key           \
                       -certfile hogeCA/cacert.pem \
                       -out client.p12

できあがった「clcert.p12」をクライアントに配布しブラウザにインポートする
InternetExplorerの場合、ファイルをダブルクリックするだけ

◆Apacheの設定
/etc/httpd/conf.d/ssl.conf

DocumentRoot等は適当に。
以下SSLに必要な部分
SSLCertificateFile    /var/www/ssl/server.crt
SSLCertificateKeyFile /var/www/ssl/server.key
SSLCACertificatePath  /var/www/ssl/hogeCA
SSLCACertificateFile  /var/www/ssl/hogeCA/cacert.pem
#SSLCARevocationPath   /var/www/ssl/ssl.crl           ←破棄証明書を使用する場合(どちらか指定)
#SSLCARevocationFile   /var/www/ssl/ssl.crl/cert.crl  ←破棄証明書を使用する場合(どちらか指定)
SSLVerifyClient require
SSLVerifyDepth 1

◆その他
発行したクライアント証明書を失効させる場合

cd /var/www/ssl
openssl ca -gencrl -revoke client.crt -out ssl.crl/cert.crl

破棄証明書
破棄証明書を使用しているときは定期的に破棄証明書を更新してApacheのリロードを行わないと、破棄証明書の期限が切れてApacheが起動しなくなるので注意。

cd /var/www/ssl
openssl ca -gencrl  -out ssl.crl/cert.crl
/sbin/service httpd restart

CAの証明書ファイルをDER形式(ブラウザにインポートできるように)にエンコード

cd /var/www/ssl/
openssl x509 -inform PEM -outform DER -in hogeCA/cacert.pem -out CAcert.der

クライアント証明書の失効とCRL(apache)

CentOS の Apache でクライアント証明書認証(修正版)」への2件のフィードバック

  1. ピンバック: ギジュツメモ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA