クライアント認証を行う

tamuraです。

前回、オレオレ認証局でサーバ証明書に署名してもらい、Apacheに組み込みました。 今回は、クライアントの証明書を作り、オレオレ認証局で署名してもらいます。 最終的にはブラウザに組み込んで使います。 署名までの手順はサーバ証明書の場合とほぼ同じです。

クライアント用のOpenSSLの設定

既存の設定ファイルを元に、クライアント向けの設定ファイルを作ります。

[root@il-sus-web-www2 ~]# cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-client.cnf
[root@il-sus-web-www2 ~]# vi /etc/pki/tls/openssl-client.cnf

165行目から始まる [ usr_cert ] セクションの中の180行目付近

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email

# and for everything including object signing:
# nsCertType = client, email, objsign

ここの一番したの行のコメントをはずします。

# and for everything including object signing:
nsCertType = client, email, objsign

秘密鍵の作成

クライアントの秘密鍵を作ります。

[root@il-sus-web-www2 ~]# mkdir /etc/pki/client
[root@il-sus-web-www2 ~]# cd /etc/pki/client
[root@il-sus-web-www2 client]# openssl genrsa -out tamurashingo.key -aes256 2048
Generating RSA private key, 2048 bit long modulus
.......+++
............................................+++
e is 65537 (0x10001)
Enter pass phrase for tamurashingo.key:
Verifying - Enter pass phrase for tamurashingo.key:

クライアント用証明書作成用リクエストファイルの作成

サーバのときと同じようにCSRファイルを作成します。 オプションに -config /etc/pki/tls/openssl-client.cnf をつけてCSRファイルを作成します。

[root@il-sus-web-www2 client]# openssl req -new -key tamurashingo.key -out tamurashingo.csr -config /etc/pki/tls/openssl-client.cnf
Enter pass phrase for tamurashingo.key:
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjuku
Organization Name (eg, company) [Default Company Ltd]:il-sus-web
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:tamurashingo # ここで個人を判別します
Email Address []:xxxxxxxxxxx

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

CA(オレオレ認証局)による署名

オレオレ認証局で署名を行います。

[root@il-sus-web-www2 client]# openssl ca -in tamurashingo.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out tamurashingo.crt -config /etc/pki/tls/openssl-client.cnf
Using configuration from /etc/pki/tls/openssl-client.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15711698583568785535 (0xda0b2a9e1ba0207f)
        Validity
            Not Before: Jul 27 06:10:35 2016 GMT
            Not After : Jul 27 06:10:35 2017 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = il-sus-web
            commonName                = tamurashingo
            emailAddress              = xxxxxxxxxxxxxxxxxxxxxxxxx
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Client, S/MIME, Object Signing
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                A7:42:B0:CF:3D:1A:4C:D3:BF:39:48:8A:AE:F5:4B:2C:97:2B:20:62
            X509v3 Authority Key Identifier: 
                keyid:65:2D:A0:29:6D:29:7B:B7:FD:F7:25:D7:87:78:3F:F9:26:CE:5E:16

Certificate is to be certified until Jul 27 06:10:35 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

署名できました。

個人情報交換ファイル(PKCS12)の作成

署名されたCRTファイルと秘密鍵をPKCS#12フォーマットに変換します。

[root@il-sus-web-www2 client]# openssl pkcs12 -export -in tamurashingo.crt -inkey tamurashingo.key -certfile /etc/pki/CA/cacert.pem  -out tamurashingo.p12 -name "www2.il-sus-web.net"
Enter pass phrase for tamurashingo.key:(秘密鍵のパスワード)
Enter Export Password:(tamurashingo.p12にかけるパスワード)
Verifying - Enter Export Password:(確認のためもう一回)

これでできました。

ブラウザへのインポート

作成したp12ファイルを何らかの方法でローカル環境に持ってきてブラウザに証明書を入れ込みます。

セキュリティ → 証明書の管理

などからできると思います。

Apacheへの組み込み

クライアント証明書を持つ人だけがアクセスできるページを作ってみます。

[root@il-sus-web-www2 client]# vi /etc/httpd/conf.d/ssl.conf

前回追加したあたりに以下の内容を追加します。

<Location /test/>
  SSLVerifyClient require
  SSLVerifyDepth 10
  Satisfy Any
  Allow from All
  SSLRequire \
   ( \
       %{SSL_CLIENT_S_DN_CN} eq "tamurashingo" \
    )
</Location>

commonNametamurashingoの場合に /test/ にアクセスできるようにしています。 実際にブラウザからつないでみます。 Firefoxの場合、以下のようなダイアログが出るので証明書を選択してアクセスします。

証明書を入れていないブラウザからは、ERR_SSL_PROTOCOL_ERRORでアクセスができません。

ユーザの追加/削除

Apacheの設定ファイルにcommonNameを追加、または削除を行います。

<Location /test/>
  SSLVerifyClient require
  SSLVerifyDepth 10
  Satisfy Any
  Allow from All
  SSLRequire \
   ( \
       %{SSL_CLIENT_S_DN_CN} eq "tamurashingo" \
    or %{SSL_CLIENT_S_DN_CN} qe "yamadataro" \
   )
</Location>

うまくいかない場合

ログレベルを詳細に出力するモードに変更し、ログを参照します。

ログレベルの変更

通常はwarnになっているので、debugにします。

[root@il-sus-web-www2 ~]# vi /etc/httpd/conf.d/ssl.conf

66行目付近のログレベルを変更します。

# 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
LogLevel debug

再起動します。

[root@il-sus-web-www2 ~]# service httpd restart

ログの確認

[root@il-sus-web-www2 ~]# tail -f /var/

ログを確認して原因を突き止めます。

関連記事

comments powered by Disqus