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
最近のコメント