公開日: 2012年8月11日 13:07:47
最終更新: 2018年7月29日 21:05:13

クライアント証明書の発行

クライアント証明書の発行

クライアント証明書がインストールされている端末(と言うかブラウザ)のみアクセスを許可する、セキュアなサイトが構築できます。eTAX やオンラインバンキングなどで使われています。

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

CAの秘密鍵を作ったときやサーバ証明書を作ったときと同じです。
鍵の長さは 2048bit にします。

$ openssl genrsa -out client.key 2048
Generating RSA private key, 2048 bit long modulus
....................................+++
...+++
e is 65537 (0x10001)
$

クライアントの秘密鍵が作成されました。

秘密鍵からx509証明書発行要求(CSR)を作成

$ openssl req -new -key client.key -out client.csr

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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) []: 空エンター
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ghouls Project # 組織名 (CA と同じもの)
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:penguincrusher 一位の名前
Email Address []:abuse@cro-pel.com # 連絡先メールアドレス

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


Organization Name (eg, company) [example corp.]:
Organizational Unit Name (eg, section) []: 部署名 (省略可)

Common Name (eg, YOUR name) []: 一意の名前
Email Address []: 連絡先メールアドレス

CN にはクライアントの識別子になるので一意になるような値を入れてください。こうしてできた x509 証明書発行要求が client.csr です。

CSRにCAが署名してクライアント証明書を発行

証明書発行要求と秘密鍵をもとに、プライベート CA に署名をもらいます。

$ openssl ca -out client-ca.crt -days 730 -infiles client.csr

Using configuration from /usr/local/openssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Aug 11 08:51:19 2012 GMT
            Not After : Aug 11 08:51:19 2014 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = Ghouls Project    # 組織名 
            commonName                = penguincrusher    # 一意の名前
            emailAddress              = abuse@cro-pel.com # 連絡先メールアドレス
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                **.**.**.**.**.**.**.**.**.**.**.**.**.**.**.**.**.**.**.**
            X509v3 Authority Key Identifier:
                DirName:/C=JP/ST=Tokyo/L=Chiyoda-ku/O=Ghouls Project/CN=cro-pel.com
                serial:**.**.**.**.**.**.**.**

Certificate is to be certified until Aug 11 08:51:19 2014 GMT (730 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

証明書の内容について表示され、これでいいか確認を聞かれます。よければ[y]で許可しましょう。 こうしてできた client-ca.crt がプライベートCAによって署名されたクライアント証明書になります。

クライアント証明書をpkcs12でexportする

鍵と証明書を安全にexportするために、pkcs12という方法で鍵と証明書をひとつにまとめます。鍵と証明書を結合してopensslに放り込んでやればOKです。

$ cat client.key client-ca.crt | openssl pkcs12 -export -out client.p12 -name "client key"

Enter Export Password: 任意のパスワード
Verifying - Enter Export Password: パスワードを再入力
$

ここで設定するパスワードはpkcs12を展開するときのパスワードです。このパスワードは Windows に pkcs12 のファイルを持ってきたときに、展開するために必要になります。こうして client.p12 という pkcs12 形式の鍵ペアができました。

あとは winscp や usbメモリなどで作成した client.p12 を Windows クライアントにコピーします。

なお、今回はCAの証明書については前回のサーバ証明書でインポート済みなので入れていませんが、実際にプライベートCAの運営で証明書を配布していくときはCAの証明書もつけてあげないといけません。CAの証明書は接続先のサーバ証明書の署名検証するために必要になります。CAの証明書もつけるときはこんな感じでOKです。

$ cp /etc/CA/ca.crt ./
$ cat client.key client-ca.crt ca.crt | openssl pkcs12 -export -out client.p12 -name "client key" 

pkcs12はそもそも複数の鍵や証明書をひとつにしてインポートするためにあるので、この方法を使えばいくらでも証明書をくっつけることができます。RootCAまでのchainとかをこの方法でまとめるといいと思います。

Apacheの設定

Apache の設定は conf/extra/httpd-ssl.conf を編集します。

# https アクセス時のクライアント証明書の扱いを指定します。
# require => クライアント証明書は必須
# optional => クライアント証明書は持っていてもいなくてもよい
# none => クライアント証明書は不要(持っていても無視)
# optional_no_ca => optional と同じだが、CAの証明が無くても許可
SSLVerifyClient require

Apache を再起動すると、SSL サイトでクライアント認証が有効になります。

$ /etc/init.d/httpd restart