OpenSSLで認証局(CA)構築とApache+mod_sslでサーバ認証

前に書いた続き。実際に認証局を構築してApacheサーバから発行した証明書に署名してインストールをやってみた。環境はCentOS5.3

流れは

  1. 自前の認証局(CA)で証明書(CACERT)を作成(3のときに実行しても良いけど、認証局がサーバより先にあるというのが一般的なので)
  2. Apacheサーバで秘密鍵(Key)証明書署名要求(CSR)を作成
  3. 自前の認証局で証明書署名要求(CSR)に署名し証明書(CERT, certificate)を作成
  4. 証明書(CERT)と秘密鍵(Key)をApacheサーバにインストール
  5. クライアントのブラウザに自前の認証局の証明書(CACERT)をインストールして信頼させる

という感じ。ここのサイトなどを参考に。
ベリサインなどのWebTrust認証局にサーバ証明書を発行してもらったときは2と4の作業だけで済む(1と5は既に終わっていて、3は申請するだけ)。

 


1.自前の認証局(CA)で証明書(CACERT)を作成

証明書(CACERT)を作る便利なシェルスクリプトがあるので、それを利用する。これを利用すると秘密鍵(CAKEY)の作成から一括でできる。

$ cd /etc/pki/tls/misc/
$ ./CA –newca

Verifying - Enter PEM pass phrase:(CA用パスフレーズ)
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Aichi
Locality Name (eg, city) [Newbury]:Nagoya
Organization Name (eg, company) [My Company Ltd]:Hoge
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:www.hoge.com
Email Address []:info@hoge.jp

A challenge password []:(未入力でOK)
An optional company name []:(未入力でOK)

Enter pass phrase for ../../CA/private/./cakey.pem:(CA用パスフレーズ)

これで
CA証明書(CACERT): /etc/pki/CA/cacert.pem
CA秘密鍵(CAKEY): /etc/pki/CA/private/cakey.pem
ができた。つまり、サーバからの署名要求に応えることができる認証局(CA)の準備ができた。

やり直す場合はCAフォルダごと削除する
$ rm –rf ../../CA

lampp環境の場合は下記を参照

$ cd /opt/lampp/bin

opensslがインストールされている状態で実行すると別のcnfファイルを参照するのでCAを編集する。

$ vi ./CA

$REQ="./openssl req $SSLEAY_CONFIG";
$CA="./openssl ca $SSLEAY_CONFIG";
$VERIFY="./openssl verify";
$X509="./openssl x509";
$PKCS12="./openssl pkcs12";

$ cd /opt/lampp/bin
$ ./CA –newca

入力する情報は上に同じ

CA証明書(CACERT): /opt/lampp/bin/demoCA/cacert.pem
CA秘密鍵(CAKEY): /opt/lampp/bin/demoCA/private/cakey.pem

 


2.Apacheサーバで秘密鍵(Key)証明書署名要求(CSR)を作成

今度は、サーバから認証局(CA)に署名してもらうための書類を生成。ベリサインやグローバルサインのページでもこの編は詳しくやり方が載っている。
まずはapacheでOpenSSLを使えるようにするモジュールmod_sslをインストール
$ yum install mod_ssl
サーバ側の作業は別ディレクトリで行う
$ cd /etc/httpd
$ mkdir ssl
$ cd ssl

秘密鍵(Key)の作成
$ openssl genrsa -des3 -out ./key.pem 1024
証明書署名要求(CSR)の作成
$ openssl req -new -key ./key.pem -out ./csr.pem 

image

Lamppで作業することも多いので、Lamppの場合は下記を参照

$ cd /opt/lampp/bin
秘密鍵(Key)の作成と証明書署名要求(CSR)
$ ./CA –newreq

Enter PEM pass phrase:(サーバー用パスフレーズ)

Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Aichi
Locality Name (eg, city) [Newbury]:Nagoya
Organization Name (eg, company) [My Company Ltd]:Hoge
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:suganuma
Email Address []:

A challenge password []:(未入力でOK)
An optional company name []:(未入力でOK)

 


3.自前の認証局で証明書署名要求(CSR)に署名し証明書(CERT, certificate)を作成

今度はサーバの署名要求(CSR)を認証局(CA)に提出し、実際に署名してもらう。
認証局(CA)で作業するのでディレクトリ移動
$ cd /etc/pki/tls/misc
$ openssl ca -out /etc/pki/CA/certs/cert.pem -infiles /etc/httpd/ssl/csr.pem
ここで

The organizationName field needed to be the same in the
CA certificate (dksg) and the request (Hoge)

と怒られた。organizationNameが一致してないと駄目らしい。この辺はopenssl.confに記述してあるので([policy_match])、openssl.confを変更するかCSRを一致させるように作り直して再実行。
私の場合はopenssl.confのorganizationName=optionalにした。
 image
署名完了。署名済み証明書(CERT)ができた。

lamppの場合は下記を参照

$ cd /opt/lampp/bin
$ ./CA –sign

署名済み証明書newcert.pemが作成される。

 


4.証明書(CERT)と秘密鍵(Key)をApacheサーバにインストール

できた証明書をコピー
$ cp /etc/pki/CA/certs/cert.pem /etc/httpd/ssl/
apacheに教えてあげる
$ cd /etc/httpd/conf.d/
$ vi ssl.conf

SSLCertificateFile /etc/httpd/ssl/cert.pem
SSLCertificateKeyFile /etc/httpd/ssl/key.pem

でapacheを再起動
$ service httpd restart

lamppの場合は下記を参照

できた証明書をコピー
$ cd /opt/lampp/bin
$ cp newreq.pem ../etc/ssl.key/
$ cp newcert.pem ../etc/ssl.crt/

これでlamppを再起動してみる。

$ /etc/rc.d/init.d/lampp restart

起動時にパスフレーズの入力を求めてくるので、サーバー用パスフレーズを入力する。毎回これだとめんどくさいので次のコマンドで入力を省略するキーファイルを作成する。

$ ./openssl rsa -in ../etc/ssl.key/key.pem -out ../etc/ssl.key/key-nopass.pem

apacheのconfファイルに設定

SSLCertificateKeyFile /etc/httpd/ssl/key-nopass.pem

もう一回再起動して確認。

$ /etc/rc.d/init.d/lampp restart

 


5.クライアントのブラウザに自前の認証局の証明書(CACERT)をインストールして信頼させる

ブラウザにインポートできる形式に変換(lamppの場合)

$ ./openssl x509 -inform pem -in demoCA/cacert.pem -outform der -out demoCA/ca.der

これをクライアントにダウンロードしてca.cerとかに名前を変更する。そのあと、IEのインターネットオプション→コンテンツ→証明書でインポートすればインストール完了。署名したURLでサーバにアクセスすると安全な通信ができているように表示されるはず。

・・・firefoxではうまくいったけど、IEでは相変わらず証明書エラー画面が出てしまう。なんでだろう。

ちなみにpkcs12オプションを使うとPKCS#12規格のファイルを作成できる。

$ cd /opt/lampp/bin
$ ./CA –pkcs12

使い方はよく分からない・・・。

最後に注意点

  • 443のポートを空けるのを忘れずに
  • lamppの場合はsslを有効にして起動するのを忘れずに
    # /etc/rc.d/init.d/lampp startssl

 

<参考>

lampp用のCAプログラムの引数は次のページが参考に