クライアント証明書 をブラウザにインポートしている人だけがアクセス出来るサイトを構築していきたいと思います。
Webサーバ構築
まずは適当にWebサイトを構築します。
# yum install httpd
# yum install mod_ssl
- 今回はApacheを使用します。
- ApacheでSSLを利用するためmod_sslをインストールします
続けてApacheの設定ファイルを編集します。
# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org
# vi /etc/httpd/conf.d/ssl.conf
# diff /etc/httpd/conf.d/ssl.conf.org /etc/httpd/conf.d/ssl.conf
122c122
< #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
---
> SSLCACertificateFile /etc/pki/tls/certs/ca.crt
129,130c129,130
< #SSLVerifyClient require
< #SSLVerifyDepth 10
---
> SSLVerifyClient require
> SSLVerifyDepth 1
- SSLCACertificateFile:
- クライアント証明書に署名した認証局の証明書のファイルパス
- 今回は自己認証局を利用するのでクライアント証明書のファイルパス
- SSLVerifyClient:
- クライアント認証にクライアント証明書を利用する
- SSLVerifyDepth:
- クライアント証明書に署名した認証局の階層の最大数を指定
- 0:
- 自己署名のSSLクライアント証明書のみ
- 1:
- 自己署名のSSLクライアント証明書と「SSLCACertificateFile」で指定している認証局の証明書で署名したSSLクライアント証明書を利用可能
/var/www/html/ 配下に適当なインデックスファイルを作成して置いてください。何でもいいです。
プライベート認証局作成
こちらを参考に作成してみて下さい。サーバ証明書は一旦は必要ないので、1と2だけで大丈夫です。(今回はアクセス制限を試したいだけで通信データを暗号化したいわけではない)
クライアント証明書 作成
クライアント証明書の設定ファイルを作成します。
# cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-client.cnf
# vi /etc/pki/tls/openssl-client.cnf
# diff /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-client.cnf
73c73
< default_days = 365 # how long to certify for
---
> default_days = 3650 # how long to certify for
187c187
< # nsCertType = client, email, objsign
---
> nsCertType = client, email, objsign
- nsCertType:
- クライアント側の証明書であることを表す
続いて下記の手順でクライアント証明書 を作成する。まずはcsr作成から。
# pwd
/root/CL (任意のディレクトリ)
# openssl req -new -config /etc/pki/tls/openssl-client.cnf -sha256 -keyout cl.key -out cl.csr
Generating a 2048 bit RSA private key
....+++
.............................................................................+++
writing new private key to 'cl.key'
Enter PEM pass phrase:【CL秘密鍵パスフレーズ】
Verifying - Enter PEM pass phrase:【CL秘密鍵パスフレーズ】
-----
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]:Momozo Company Ltd
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:xxx.xxx.xxx.xxx
Email Address []:XXXXXXXXXXX@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# ls
cl.csr cl.key
続いて認証局に署名をもらいクライアント証明書 を作成。
# openssl ca -config /etc/pki/tls/openssl-client.cnf -md sha256 -cert /root/CA/ca.crt -keyfile /root/CA/ca.key -out cl.crt -infiles cl.csr
Using configuration from /etc/pki/tls/openssl-client.cnf
Enter pass phrase for /root/CA/ca.key:【CA秘密鍵パスフレーズ】
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 4096 (0x1000)
Validity
Not Before: Jan 26 11:49:56 2020 GMT
Not After : Jan 23 11:49:56 2030 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = Momozo Company Ltd
commonName = xxx.xxx.xxx.xxx
emailAddress = XXXXXXXXXXX@gmail.com
~ 中略(csrの内容が表示される) ~
Certificate is to be certified until Jan 23 11:49:56 2030 GMT (3650 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
# ls
cl.crt cl.csr cl.key
更に端末にインストールするためのクライアント証明書 を作成。
# openssl pkcs12 -export -in cl.crt -inkey cl.key -out cl.pfx -name "xxx.xxx.xxx.xxx"
Enter pass phrase for cl.key:【CL秘密鍵パスフレーズ】
Enter Export Password:【pfxファイル保護用パスフレーズ】
Verifying - Enter Export Password:【pfxファイル保護用パスフレーズ】
# ls
cl.crt cl.csr cl.key cl.pfx
- pkcs12:
- PKCS #12の証明書ファイル(.pfx)を取り扱うコマンド
- .pfx:
- 証明書と一緒に秘密鍵も格納出来る形式
- .pfxファイルはパスワードで保護される
以上で必要な物は揃いましたので試しにアクセスしてみましょう。
試験
クライアント証明書 をインポートする前のアクセス結果は次のようになります。
インポートしてから再度アクセスしてみると
認証に使用する証明書を聞かれるので今回作成したものを選択すれば、認証に成功しアクセス出来るかと思います。