OpenSSLでプライベートCAを構築して、クライアント用ルート証明書を作成


投稿日:2012年11月13日
  • 5
  • 0
  • 10



OpensSSLを利用すればプライベートCAの構築も、わずか数行のコマンドで実現できます

このページではメールサーバでSSL暗号化を実現するべく「プライベートCAの構築」と、「各種証明書の発行」をします。
今回作成する「プライベートCAの公開鍵証明書」を「ルート証明書」に登録することで、ブラウザやメールソフトでSSL通信をする際に警告が出なくなります。


プライベートCAを構築する準備1:CAの編集

プライベートCAの構築OpenSSLの「CA」というスクリプトで行います。設定も同スクリプトに記述されているため、実行の前に設定をします。(ディストリビューションによってファイル名が「CA.sh」の場合や「CA.pl」の場合もあります。環境に合わせて読み替えてください。)

1.スクリプト「CA」のあるディレクトリに移動、バックアップを取ります。

※コマンドラインの見方
コマンド」「引数、その他」「コメント」「#(rootユーザ)」「$(一般ユーザ)」

# cd /etc/pki/tls/misc/
# cp CA CA.org

2.viエディタでスクリプト「CA」を開きます。

# vi CA

行番号を表示する場合はコマンドモードで以下のコマンドを入力してください。

:set number

3.35行目あたりにある、「DAYS」が証明書の有効期限、「CADAYS」がCAの有効期限です。1度失効した証明書をインストールし直すのはただ面倒なだけ(第三者機関としての信頼はもともと無い)なので有効期限を伸ばします。

DAYS="-days 365"	# 1 year
CADAYS="-days 1095"	# 3 years

以下の値に変更。

DAYS="-days 3650"
CADAYS="-days 3650"

以上の編集が終わったら保存してviを終了します。

補足

42行目あたりに以下の記述があると思いますが、ここでCAの秘密鍵自己証明書を書き出すディレクトリを指定します。

CATOP=../../CA

デフォルトで「/etc/pki/CA/」に書き出す設定になっています。外部からアクセスされない場所ならどこでも構いません。

例えば「/ver/ssl/CA」へ書き出す場合は

CATOP=/ver/ssl/CA

としてください。


プライベートCAを構築する準備2:openssl.cnfの編集

続いて「/etc/pki/tls/openssl.cnf」を編集します。
この設定ファイルはCAの構築以外にも、OpenSSL全般の動作に利用します。
今回はプライベートCA用に設定します。

1.まずはディレクトリの移動して、バックアップを取ります。

# cd /etc/pki/tls
# cp openssl.cnf openssl.cnf.org

2.viでopenssl.cnfを編集します。

# vi openssl.cnf

3.viで以下のとおり編集

173行目」あたり「usr_cert」セクションの項目を変更。

# basicConstraints=CA:FALSE
basicConstraints=CA:TRUE
ここを「TRUE」にしないとブラウザやメールソフトで正常に証明書として認識されません。

解説にあるように「basicConstraints = critical,CA:true」としないと動作しないソフトもあるようです。どうしてもうまくいかない時は試してみてください。

4.「186行目」あたり、こちらもCA用にコメントアウトを外します。
CA用を「sslCA, emailCA」もしくは「ssl, email」、サーバやメール用を「server」とするのが一般的なようです。
(解説にはネットスケープ用の設定とありますが、現在設定の意味があるのかどうかは疑問です。)

# nsCertType			= server
nsCertType = sslCA, emailCA

5.「197行目」あたりプライベートCAの証明書の鍵を何の用途で利用するか指定します。
それぞれ「cRLSign」は「証明書失効リスト(CRL)の検証
keyCertSign」は「鍵署名」を意味します。

# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
keyUsage = cRLSign, keyCertSign

6.ついでに「公開鍵証明書用」の設定も済ませます
openssl.cnf」は後に公開鍵証明書を作成するときにも利用するので、228行目あたり、「v3_req」セクションが以下の内容になっているか確認してください。こちらはCA用でないので「CA:FALSE」、鍵の用途を「否認防止」「デジタル署名」「鍵配布」という指定をしています。

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

鍵の用途を指定するパラメータ

鍵の用途に合わせて以下の指定が可能です。目的に合わせて適宜選択してください。

digitalSignature デジタル署名
nonRepudiation 否認防止
keyEncipherment 鍵配布
dataEncipherment データ暗号化
keyAgreement 鍵の検証
keyCertSign 鍵署名
cRLSign 証明書失効リスト(CRL)の検証
encipherOnly 暗号化のみ
decipherOnly 復号化のみ

拡張鍵用途

serverAuth TLS Webサーバ認証
clientAuth TLS Webクライアント認証
codeSigning コードサイニング
emailProtection 電子メールの保護(S/MIMEなど)
timeStamping タイムスタンプ
msSGC Microsoft Server Gated Crypto
nsSGC Netscape Server Gated Crypto
msSmartcardLogin Microsoft Smartcardlogin

以上でCA用の設定が完了しました。
次は、この設定ファイルと先ほど設定した「/etc/pki/tls/misc/CA」を利用して、プライベートCAを作成します。


プライベートCAの構築

設定を変更した「/etc/pki/tls/misc/CA」を利用してプライベートCAを構築します。「-newca」というオプションを付けることで新しいCAを構築できます。

# cd /etc/pki/tls/misc/
# ./CA -newca

mkdir: ディレクトリ `../../CA' を作成できません: ファイルが存在します
CA certificate filename (or enter to create)

すでに存在するディレクトリを指定すると上記エラーが出ますが、構わず「Enter」。

Making CA certificate ...
Generating a 1024 bit RSA private key
.............................................++++++
................................++++++
writing new private key to '../../CA/private/./cakey.pem'
Enter PEM pass phrase: ←PEM passを求められるので任意のパスワードを入力
Verifying - Enter PEM pass phrase: ←同じパスワードを求められるので入力
-----
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) [GB]:JP ←国を入力
State or Province Name (full name) [Berkshire]:Tokyo ←都市を入力
Locality Name (eg, city) [Newbury]:Shinagawa ←市区町村を入力
Organization Name (eg, company) [My Company Ltd]:hoge ←組織名を入力
Organizational Unit Name (eg, section) []: ←部署名を入力(空欄でよい)
Common Name (eg, your name or your server's hostname) []:PrivateCA ←サイト名やサーバ名など
Email Address []:info@example.com ←メールアドレスを入力(空欄でよい)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←証明書破棄時のパスワードを入力(空欄でよい)
An optional company name []: ←別の組織名を入力(空欄でよい)
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ../../CA/private/./cakey.pem: ←上で入力したパスを入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Sep 20 00:00:00 2012 GMT
            Not After : Sep 18 00:00:00 2022 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = hoge
            commonName                = PrivateCA
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:TRUE
            Netscape Cert Type:
                SSL CA, S/MIME CA
            X509v3 Key Usage:
                Certificate Sign, CRL Sign
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FE:38:77:D5:F2:CD:2F:A5:8E:DB:89:33:F7:86:04:57:D3:C3:ED:88
            X509v3 Authority Key Identifier:
                keyid:FE:38:77:D5:F2:CD:2F:A5:8E:DB:89:33:F7:86:04:57:D3:C3:ED:88

Certificate is to be certified until Sep 18 02:35:50 2022 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

以上でプライベートCAが構築できました。

確認して欲しいのは
X509v3 Basic Constraints:」が「CA:TRUE」、
X509v3 Key Usage:」が「Certificate Sign, CRL Sign」、
CAの有効期限」が「3650 days」となっていることを確認してください。

/etc/pki/CA」以下にプライベートCAに必要なファイルが書きだされていると思います。重要なファイルは、それぞれ以下のディレクトリに保存されています。(デフォルトの場合)

CAの秘密鍵の保存場所「/etc/pki/CA/private/cakey.pem」

秘密鍵は他のユーザーから読めないようにパーミッションを変更する。

# cd /etc/pki/CA/private
# chmod 600 cakey.pem

CAの公開鍵証明書(公開鍵)の保存場所「/etc/pki/CA/cacert.pem」

こちらは公開する鍵なので他のユーザーから見えても問題ありません。


ルート証明書に追加するプライベートCAの証明書を作成

先ほど作った「プライベートCAの公開鍵証明書」はそのままではクライアント(メールソフトやブラウザ)にインストールできないので、インストールできる形式に変換をします。具体的にはPEM形式からDER形式へ変換します。

CAの公開鍵証明書のあるディレクトリに移動

# cd /etc/pki/CA/

以下のコマンドを入力

# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der

コマンドの解説をすると
x509」が、X.509 証明書データ管理
-inform DER|PEM|NET」が、元データの形式を指定
-in filename」が、変換する元データの指定
-outform DER|PEM|NET」が、出力するデータ形式の指定
-out filename」が、出力するファイル名の指定
という指定になります。

あまり使うことは無いと思いますが、以下のコマンドで逆(DERからPEM)も可能です。

# openssl x509 -inform der -in cacert.der -outform pem -out cacert.pem

x509についての更に詳しい解説は「公式ページ」をご覧ください

/etc/pki/CA/」ディレクトリに「cacert.der」というファイルが作成されています。このファイルをダウンロードしてクライアントの「ルート証明書」に登録します。すると、このプライベートCAが信頼できる認証機関として登録されます。そうなれば、このプライベートCAの署名を持つSSL通信で警告がでなくなります。

Windows Vistaで証明書を正常にインポートできない不具合があります。
詳しくは対処法は「メールサーバに合わせたOutlookの設定と、ルート証明書の登録方法」のページにまとめてあります。

以上でプライベートCAの構築と、クライアントのルート証明書に登録するCAの証明書が作成できました。
次は「OpenSSLとプライベートCAでメールサーバ用の秘密鍵と公開鍵証明書を作成」です。



現在のページを共有する



現在のページに関連する記事


おすすめの記事


いただいたコメントなど

  1. ピンバック: Squid Reverse Proxy with Domain Based Virtual Hosting for HTTPS | にーまるろく あーるしー どっと ねっと

  2. mac のコメント:

    自分も過去に「できるんじゃない」? かと試したことがありましたが、いわゆる「公的認証」みたいな証明が確保できるのでしょうか。そのときはどこかの「公的」な機関で承認されていないと結局は駄目だなとの結論だったのですが、どうでしょう。その上で、domainのみを登録しておいて、www.domainだとかmail.domainだとかを確立できるなら参考にしたいと思います。
    私が検索したころにはあまりなかった情報でしたので参考にしたいと思っています。

    • oxy のコメント:

      > いわゆる「公的認証」みたいな証明が確保できるのでしょうか。
      とのことですが、ユーザー側でブラウザやメールクライアントのルート証明書プライベートCAで発行した証明書を登録する必要があります。

      登録の仕方は以下のページで解説したので、参考にしてみてください。
      http://oxynotes.com/?p=4716

      ユーザー側で登録をせずに認証を行うこともできますが、その場合は常に警告が表示されます。

  3. mac のコメント:

    すばやいご返答、ありがとうございます。参考にします。

コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。