オレオレ認証局は,ルートCAからユーザ証明書やサーバ証明書を発行するケースが多いと思います。今回は3階層のオレオレ認証局をOpenSSLで実現してみます。
はじめに. 概要
SSLサーバ証明書などを参照すると,CAが複数階層になっているケースが多いです。例えば,GoogleのSSLサーバ証明書を見るとこうなっています。
ルートCAがGeoTrust Global CAで中間CAがGoogle Internet Authority G2です。
他のサイトも確認してみると分かりますが,3階層のCAで構築されています。これは,セキュリティ上必要とされている措置です。
となると,OpenSSLでオレオレ認証局を構築する場合でも,3階層でCAを構築したくなってきます。早速やってみました。
手順
1. ルートCAを構築する
ルートCAの構築は,こちらの記事の通りです。
2. 中間CAを構築する
中間CAはルートCAから署名をしてもらったCAということになります。証明書の機能に,クライアント証明書の発行ができるような属性を設定する必要があります。
中間CAの構築は,以下の手順で実施します。
(1) 証明書リクエストファイル(CSR:Certificate Signing Request)を作成する
コマンドプロンプトから証明書リクエスト「CA.pl -newreq」を実行します。
C:\myCA>perl c:\OpenSSL-Win32\bin\CA.pl -newreq
C:\myCA>perl c:\OpenSSL-Win32\bin\CA.pl -newreq Generating a 2048 bit RSA private key ............+++ .......+++ writing new private key to 'newkey.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]:JP # ← 国名を入れる State or Province Name (full name) [Some-State]:Tokyo # ← 県名を入れる Locality Name (eg, city) []: # ← 町の名前を入れる Organization Name (eg, company) [Internet Widgits Pty Ltd]:Trusted Design # ← 会社名を入れる Organizational Unit Name (eg, section) []:Issuing CA # ← ユーザグループ名を入れる(RootCAと異なるようにすること) Common Name (e.g. server FQDN or YOUR name) []:Issuing CA # ← 中間CA名を入れる Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # ← 何も入れずにリターン An optional company name []: # ← 何も入れずにリターン Request is in newreq.pem, private key is in newkey.pem
(2) CSRをルートCAの秘密鍵で署名する
(1)で生成したCSRをルートCAの秘密鍵で署名します。コマンドプロンプトから署名のコマンドを実行します。
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -signCA
この時,証明書の属性にCA証明書であることを示すことが必要です。「CA.pl -signCA」この-signCAのパラメタがCA証明書であることを示しています。
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -signCA Using configuration from C:\OpenSSL-Win32\bin\openssl.cfg Enter pass phrase for ./demoCA/private/cakey.pem: # ← ルートCAの秘密鍵のパスワードを入力 Check that the request matches the signature Signature ok Certificate Details: Serial Number: c3:b0:ac:cb:99:9b:d8:dd Validity Not Before: Aug 21 06:56:25 2016 GMT Not After : Aug 21 06:56:25 2017 GMT Subject: countryName = JP stateOrProvinceName = Tokyo localityName = Edogawa organizationName = Trusted Design organizationalUnitName = Issuing CA commonName = Issuing CA X509v3 extensions: X509v3 Subject Key Identifier: 42:2F:54:0B:51:12:1F:18:AF:F2:82:AE:7C:91:C5:76:1F:6E:DA:C2 X509v3 Authority Key Identifier: keyid:D0:59:65:97:90:8C:DA:A2:EC:5F:79:94:4C:AF:5E:94:FB:C1:B2:23 X509v3 Basic Constraints: CA:TRUE # ← CA証明書であることを示している Netscape Cert Type: SSL CA, S/MIME CA Certificate is to be certified until Aug 21 06:56:25 2017 GMT (365 days) Sign the certificate? [y/n]:y # yを入力してリターン 1 out of 1 certificate requests certified, commit? [y/n]y # yを入力してリターン Write out database with 1 new entries Data Base Updated Signed CA certificate is in newcert.pem
これで中間証明書が発行できました。中間証明書を取り出しておきます。
C:\myCA>openssl x509 -in newcert.pem -out issuingCACert.cer
証明書を表示すると,中間CAとなっていることが分かります。
3. 中間CAからクライアント証明書を発行する
中間CAを通常署名するCAにしてからクライアント証明書を発行します。
(1) 中間CAから署名できるように設定を変更する
ルート証明書の環境(demoCAフォルダ以下)をバックアップします。
上で作成した中間CAの鍵や証明書のファイル名をcacert.pemやcakey.pemのように変更し,demoCAの下にある同名ファイルと置き換えます。これで中間CAが署名CAとなりました。置き換えるのは,次の3つのファイルです。
元のファイル名 置き換え後のファイル名
・newreq.pem → careq.pem
・newkey.pem → cakey.pem
・newcert.pem → cacert.pem
ルートCAから証明書を発行したい場合は,ルートCAの上記3ファイルを元に戻すことで実現できます。
(2) クライアント証明書を発行する
こちらの記事の手順でクライアント証明書を発行します。
確認してみたところ,確かに3階層のCAになっています。オレオレ認証局で3階層にする意味がどのくらいあるのかは不明ですが。。。ちなみに,この画像はルートCAと中間CAをPCに登録した状態での表示です。