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でメールサーバ用の秘密鍵と公開鍵証明書を作成」です。
ピンバック: Squid Reverse Proxy with Domain Based Virtual Hosting for HTTPS | にーまるろく あーるしー どっと ねっと
自分も過去に「できるんじゃない」? かと試したことがありましたが、いわゆる「公的認証」みたいな証明が確保できるのでしょうか。そのときはどこかの「公的」な機関で承認されていないと結局は駄目だなとの結論だったのですが、どうでしょう。その上で、domainのみを登録しておいて、www.domainだとかmail.domainだとかを確立できるなら参考にしたいと思います。
私が検索したころにはあまりなかった情報でしたので参考にしたいと思っています。
> いわゆる「公的認証」みたいな証明が確保できるのでしょうか。
とのことですが、ユーザー側でブラウザやメールクライアントのルート証明書にプライベートCAで発行した証明書を登録する必要があります。
登録の仕方は以下のページで解説したので、参考にしてみてください。
http://oxynotes.com/?p=4716
ユーザー側で登録をせずに認証を行うこともできますが、その場合は常に警告が表示されます。
すばやいご返答、ありがとうございます。参考にします。