独自SSLサーバ認証局(CA)作成とサーバ証明書発行

<h2> <span class="mw-headline" id=".E4.BA.8B.E5.89.8D.E6.BA.96.E5.82.99"> 事前準備 </span></h2>
<ul><li> OpenSSL インストール
</li><li> Apache+mod_ssl or Apache-SSL インストール
</li></ul>
<h2> <span class="mw-headline" id=".E4.BD.9C.E6.A5.AD.E6.89.8B.E9.A0.86.28CA.E6.A7.8B.E7.AF.89.E7.B7.A8.29"> 作業手順(CA構築編) </span></h2>
<h3> <span class="mw-headline" id=".E4.BA.8B.E5.89.8D.E8.A8.AD.E5.AE.9A.28openssl.conf.E4.BF.AE.E6.AD.A3.E7.AD.89.29"> 事前設定(openssl.conf修正等) </span></h3>
<pre>/etc/ssl/openssl.conf
</pre>
<p>を修正します。最初にCA用ディレクトリを指定します。
</p>
<pre>dir = /etc/ssl/hogeCA
</pre>
<p>/etc/ssl/hogeCA の配下に certs,private,crl,newcerts のディレクトリを作成します。
</p>
<pre>mkdir -p /etc/ssl/hogeCA/certs
mkdir -p /etc/ssl/hogeCA/private
mkdir -p /etc/ssl/hogeCA/crl
mkdir -p /etc/ssl/hogeCA/newcerts
</pre>
<p>privateには秘密鍵が置かれるので以下のようにします。
</p>
<pre>chmod 700 private
</pre>
<p>シリアルを初期化します。
</p>
<pre>echo "01" &gt; /etc/ssl/hogeCA/serial
</pre>
<p>証明書データベースを初期化します。
</p>
<pre>touch /etc/ssl/hogeCA/index.txt
</pre>
<h3> <span class="mw-headline" id="CA.E8.A8.BC.E6.98.8E.E6.9B.B8.2F.E7.A7.98.E5.AF.86.E9.8D.B5.E4.BD.9C.E6.88.90"> CA証明書/秘密鍵作成 </span></h3>
<p>自己署名済みの証明書と秘密鍵を作成します。-days 1825 はCA証明書の有効期限です。365日*5年としています。
適当に変えてください。
</p>
<pre>cd /etc/ssl/hogeCA
openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 1825
</pre>
<p>パスフレーズを聞かれます。CA局のマスターパスワードみたいなモノなので、忘れない文字列を入れてください。
</p>
<pre>Enter PEM pass phrase: ***
</pre>
<p>証明書情報が聞かれます。正しく入れてください。
ベリサインのサイトを参考にすると良いと思われます。
<a href="http://www.verisign.co.jp/server/help/csr/capache_new.html" class="external free" rel="nofollow">http://www.verisign.co.jp/server/help/csr/capache_new.html</a>
</p>
<pre>Country Name: JP
State or Province Name: Kanagawa
Locality Name: hogehoge
Organization Name: foo bar
Organizational Unit Name: (なんかあれば)
Common Name: (サーバのFQDN/www.hoge.comとか)
Email Address: (あれば)
</pre>
<p>作成が終わると以下のファイルができあがります。
</p>
<pre>/etc/ssl/hogeCA/cacert.pem&nbsp;: 自己署名済みCA証明書
/etc/ssl/hogeCA/private/cakey.pem&nbsp;: CA証明書の秘密鍵
</pre>
<p>CA証明書の秘密鍵は他人にみられるとこまるので、こうします。
</p>
<pre>chown root:root /etc/ssl/hogeCA/private/cakey.pem
chmod 600 /etc/ssl/hogeCA/private/cakey.pem 
</pre>
<p>証明書が正しく出来たかを確認するには、以下のコマンドを発行します。
</p>
<pre>openssl x509 -in /etc/ssl/hogeCA/cacert.pem -text
</pre>
<h3> <span class="mw-headline" id=".E3.83.96.E3.83.A9.E3.82.A6.E3.82.B6.E3.81.ABCA.E8.A8.BC.E6.98.8E.E6.9B.B8.E3.82.92.E7.B5.84.E3.81.BF.E8.BE.BC.E3.82.80"> ブラウザにCA証明書を組み込む </span></h3>
<p>これをしないと、アクセスするたびに警告が発生します。
以下のコマンドでブラウザに取り込めるDER形式にエンコードします。
</p>
<pre>openssl x509 -inform PEM -outform DER -in /etc/ssl/hogeCA/cacert.pem -out /etc/ssl/hogeCA/hogeCAcert.der
</pre>
<p>hogeCAcert.der をブラウザからダウンロード出来るようにします。
</p>
<pre>cp /etc/ssl/hogeCA/hogeCAcert.der /var/www/
</pre>
<p>また、*.derファイルのMIMEタイプを登録する必要があります。
</p>
<pre>- /ver/www/.htaccess -
AddType application/x-x509-ca-cert der
- ここまで -
</pre>
<p>IE6.0の場合ですが、<a href="http://www.hoge.com/hogeCAcert.der" class="external free" rel="nofollow">http://www.hoge.com/hogeCAcert.der</a> とかアクセスすると、
ファイルのダウンロードが表示されてファイル種別:セキュリティ証明書になっています。
ここで、「開く」を選択すると「証明書」ダイアログが表示されるので「証明書のインストール」を選んでください。
以下の質問は「次へ」としてください。最後に「ルート証明書ストア」と出たら「はい」を選択すれば自己認証CAの
証明書がインストールされます。
インストールは、Opera7,Mozilla Firebird/0.6 でも確認済み
</p>
<h2> <span class="mw-headline" id=".E4.BD.9C.E6.A5.AD.E6.89.8B.E9.A0.86.28.E3.82.B5.E3.83.BC.E3.83.90.E8.AA.8D.E8.A8.BC.E7.B7.A8.29"> 作業手順(サーバ認証編) </span></h2>
<p>作成した自己認証CA局を使って、目的のサイト自体の証明書を発行します。
ここからちょっと判りにくくなります。自分の立場(演じる役)を明確にさせておきましょう。
,役,説明
,CA管理者,ベリサインみたいな役
,サーバ管理者,CAにサーバが発行する証明書を署名して欲しい役
!鍵ペアと証明書要求(CSR)作成(サーバ管理者)
判りやすさを最優先にする意味で、以下のようなディレクトリを作成しました。
</p>
<pre>/etc/ssl/www.hoge.com
</pre>
<p>鍵ペアと証明書要求(CSR)ファイルを作成します。
</p>
<pre>openssl req -new -keyout /etc/ssl/www.hoge.com/hoge_key.pem -out /etc/ssl/www.hoge.com/hoge_csr.pem
</pre>
<p>証明書情報が聞かれます。
</p>
<pre>Country Name: JP
State or Province Name: Kanagawa
Locality Name: hogehoge
Organization Name: foo bar
Organizational Unit Name: (なんかあれば)
Common Name: (CA局のFQDN/www.hoge.comとか)
Email Address: (あれば)
A challenge password: (パスワード)
</pre>
<p>作成が終わると以下のファイルができあがります。
</p>
<pre>/etc/ssl/www.hoge.com/hoge_csr.pem&nbsp;: サーバ証明書要求(CSR)
/etc/ssl/www.hoge.com/hoge_key.pem&nbsp;: サーバ秘密鍵
</pre>
<h3> <span class="mw-headline" id=".E8.87.AA.E5.B7.B1.E8.AA.8D.E8.A8.BCCA.E5.B1.80.E3.81.A7.E7.BD.B2.E5.90.8D.28CA.E7.AE.A1.E7.90.86.E8.80.85.29"> 自己認証CA局で署名(CA管理者) </span></h3>
<p>では、サーバ証明書要求(CSR)を先ほど作成した自己認証CA局で署名しましょう。
</p>
<pre>openssl ca -out /etc/ssl/www.hoge.com/hoge_cert.pem -infiles /etc/ssl/www.hoge.com/hoge_csr.pem
</pre>
<p>を実行すると、CA局は「本当に署名していいの?」と確認します。迷わず[y]を選んでください。
</p>
<pre>Enter PEM pass phrase:(CA局パスフレーズ)
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName          &nbsp;:PRINTABLE:(サーバ証明書情報)
stateOrProvinceName  &nbsp;:PRINTABLE:(サーバ証明書情報)
localityName         &nbsp;:PRINTABLE:(サーバ証明書情報)
organizationName     &nbsp;:PRINTABLE:(サーバ証明書情報)
commonName           &nbsp;:PRINTABLE:(サーバ証明書情報)
emailAddress         &nbsp;:IA5STRING:(サーバ証明書情報)
Certificate is to be certified until 時間 GMT (365 days)
</pre>
<p>その後、自己認証CA局で管理する?(みたいな事)を聞かれるので[y]を選んでください。
これをしないと、あとからバージョンアップが出来ない!?
</p>
<pre>1 out of 1 certificate requests certified, commit? [y/n]
</pre>
<p>証明書が正しく出来たかを確認するには、以下のコマンドを発行します。
</p>
<pre>openssl x509 -in /etc/ssl/www.hoge.com/hoge_cert.pem -text
</pre>
<p>また、現在出来上がったファイルはこんな感じとなります。
</p>
<pre>/etc/ssl/www.hoge.com/hoge_csr.pem&nbsp;: サーバ証明書要求(CSR) ←もういらない!?
/etc/ssl/www.hoge.com/hoge_key.pem&nbsp;: サーバ秘密鍵
/etc/ssl/www.hoge.com/hoge_cert.pem&nbsp;: サーバ証明書(署名済み)
</pre>
<h3> <span class="mw-headline" id=".E8.A8.BC.E6.98.8E.E6.9B.B8.E3.81.A8.E7.A7.98.E5.AF.86.E9.8D.B5.E3.82.92.E3.82.B5.E3.83.BC.E3.83.90.E3.81.AB.E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF.E3.81.BE.E3.81.99"> 証明書と秘密鍵をサーバに組み込みます </span></h3>
<p>Apache+mod_sslでもApache-SSLでも、こんな感じで登録すればオッケーです。
</p>
<pre>SSLCertificateFile /etc/ssl/www.hoge.com/hoge_cert.pem
SSLCertificateKeyFile /etc/ssl/www.hoge.com/hoge_key.pem
</pre>
<h3> <span class="mw-headline" id=".E3.83.88.E3.83.94.E3.83.83.E3.82.AF.E3.82.B9"> トピックス </span></h3>
<ul><li> Apache+mod_ssl/Apache-SSLの起動時パスフレーズを削除する方法です。
</li></ul>
<p>サーバ再起動時にいちいちパスフレーズを入力する必要が無くなります。
パスフレーズは、サーバ秘密鍵に書かれているのでこんな感じでRSAキーを書き込みます。
</p>
<pre>openssl rsa -in /etc/ssl/www.hoge.com/hoge_key.pem -out /etc/ssl/www.hoge.com/hoge_key.pem.nopass
</pre>
<p>Apache+mod_ssl/Apache-SSLの設定を、このファイル名に変更してください。
</p>
<pre>SSLCertificateKeyFile /etc/ssl/www.hoge.com/hoge_key.pem.nopass
</pre>
<ul><li> 発行後、期限切れのサーバ証明書を更新するには
</li></ul>
<p>同一サイトに対するサーバ証明書を発行するには、一度古くなったサーバ証明書を、CAから削除する必要があります。
</p>
<pre>openssl ca -revoke /etc/ssl/www.hoge.com/hoge_cert.pem
</pre>
<p>その後、www.hoge.com 以下のファイル群を待避させる。
</p>
<pre>mkdir /etc/ssl/www.hoge.com/2004bk/
mv /etc/ssl/www.hoge.com/* 2004bk
</pre>
<p>最後に、"作業手順(サーバ認証編)"を最初から行えば、サーバ証明書の更新が行えます。
</p>
<ul><li> 自己認証CA局でより汎用的に署名するには
</li></ul>
<p>デフォルト設定だと、国名・地域・会社名が署名してもらいたい証明書と同一でないと弾くポリシーになっています。
このポリシーを変更するには /etc/ssl/openssl.conf を以下のようにします。
</p>
<pre># For the CA policy
[ policy_match ]
countryName             = supplied
stateOrProvinceName     = supplied
organizationName        = supplied
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
</pre>
<ul><li> 参考サイト
<ul><li> <a href="http://ash.jp/sec/openssl_ca.html" class="external text" rel="nofollow">OpenSSLコマンドの使い方</a>
</li><li> <a href="http://www.fc-lab.com/network/server/pki/openssl.html" class="external text" rel="nofollow">OpenSSLを使ったCAの構築</a>
</li><li> <a href="http://moca.wide.ad.jp/notes/ca_doc/openssl.html" class="external text" rel="nofollow">CA 構築のための OpenSSL の設定</a>
</li></ul>