OpenSSL Configuration Manual †目次 †opensslを用いればCA(認証局)や証明書を作ることができる。 手順を大雑把に記録しておく。 HTTPS通信関連はApacheのところに書きます。 Apacheでの証明書認証も書きたいねぇ 項目について †細かく書いていくのは大変だな・・・ がんばります。
コンフィグファイルの作成 †opensslではコンフィグファイルがとても重要である。 ちなみにコンフィグファイルは1つ設定し、使いまわすよりも、 CA・クライアント証明書・サーバ証明書の3種類を用意したほうが便利である。 SSLで使用するファイルを格納するディレクトリを作る mkdir /home/ca デフォルトのopenssl.cnfをコピーする cp /usr/share/ssl/openssl.cnf /home/ca/openssl.conf.ca cp /usr/share/ssl/openssl.cnf /home/ca/openssl.conf.client cp /usr/share/ssl/openssl.cnf /home/ca/openssl.conf.server 内容のサンプルをこのページに添付してある。 ちなみになぜClient証明書とServer証明書のコンフィグファイルを分けたかというと 以下の1点を間違いやすいからである
これは証明書の使用目的のようなものを指定するのであるが、 文字のとおりserverはWebやその他のホスト側で使う証明書であることが明記されている。 一方クライアントは
このように表記され、ゲスト側の認証証明書として使用されることが明記されている。 これを間違って設定すると正しい認証が行われない。 しかーし!IEではこの値は見ないため間逆な設定の証明書でも使えてしまう。 一方NetscapeやMozilla・最近流行のFireFox?などではエラーが表示され認証をキャンセルされてしまうのでご注意を・・・ 私はこのミスを何度か繰り返したため、ClientとServerの証明書を分けることを決意。 頭のいい方なら、その都度修正して使っていただいたほうがいいのかもしれません。 CAの構築 †CA作成の前準備 †/usr/share/ssl/misc/CAに以下の内容を追加 SSLEAY_CONFIG="-sha1 -config /home/ca/openssl.conf.ca" <==追加 REQ="openssl req $SSLEAY_CONFIG" CA="openssl ca $SSLEAY_CONFIG" VERIFY="openssl verify" X509="openssl x509" この一行を追加しなければCAの証明書でsha1を使うことができない。
また、Configファイルを指定することで、指定ミスをなくす。
CADAYS="-days 3650" # 3 years SSLEAY_CONFIG="-config /root/ca/openssl.cnf.ca" REQ="$OPENSSL req $SSLEAY_CONFIG" CA="$OPENSSL ca $SSLEAY_CONFIG" VERIFY="$OPENSSL verify" X509="$OPENSSL x509" PKCS12="openssl pkcs12" 少し飛んで・・・ echo "Making CA certificate ..." $REQ -new -sha512 -keyout ${CATOP}/private/$CAKEY \ -out ${CATOP}/$CAREQ $CA -create_serial -md sha512 -out ${CATOP}/$CACERT $CADAYS -batch \ -keyfile ${CATOP}/private/$CAKEY -selfsign \ -extensions v3_ca \ -infiles ${CATOP}/$CAREQ RET=$? 直接コマンドのところへメッセージダイジェストのパラメータを入れる必要がある。
CAの作成 †cd /home/ca /usr/share/ssl/misc/CA -newca 作成したCAは/home/ca/demoCAディレクトリ以下に格納される クライアント証明書の作成 †リクエストファイルの作成 †第一段階としてCSR(Certificate Signing Request)という証明書署名要求を作成する。 この要求に基づき、CAは証明書に署名する。 openssl req -new -keyout privkey.key -out new.req -config openssl.conf.client このコマンドを実行することでprivkey.keyという秘密キーとnew.reqというリクエストファイルが作成される。 リクエストファイルに対する署名 †クライアントから渡されたリクエストに対し、CAは署名をしてクライアントにキーを返す。 実際には改行しない openssl ca -in new.req -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out new.cer -config openssl.conf.client PEM形式へのエンコード †出力されたファイルはテキスト形式のため、PEM形式へ変換する。 以下のコマンドを実行 openssl x509 -in new.cer -inform PEM -out new.pem これでクライアント証明書ファイルの出来上がり。 作成した証明書の詳細を見るためには以下のコマンドを実行。 openssl x509 -text -in new.pem PKCS12ファイルの作成 †クライアント証明書としてPKCS12ファイルを作っておくと、Windowsではかなり便利。 openssl pkcs12 -export -inkey privkey.key -in new.pem -certfile demoCA/cacert.pem -out new.pfx サーバ証明書の作成 †リクエストファイルの作成 †基本的にはクライアント証明書作成手順と同じ。 コンフィグファイルが違うだけである。 openssl req -new -keyout privkey2.key -out new2.req -config openssl.conf.server リクエストファイルに対する署名 †こちらもクライアント証明書作成と同じ。 実際には改行しない。 openssl ca -in new2.req -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out new2.cer -config openssl.conf.server PEM形式へのエンコード †こちらもPEM形式へ変換する。 openssl x509 -in new2.cer -inform PEM -out new2.pem これでサーバ証明書ファイルの出来上がり。 秘密キーのパスフレーズを埋め込む †本来秘密キーを使う場合には設定したパスフレーズを入力する必要があるが、場合によっては秘密キーを埋め込まなければ認証がうまくいかないケースがある。 そのため、作成した証明書に秘密キーを埋め込んでしまい、使用する際にパスフレーズを入力しないで使えるようにする。 openssl rsa -in privkey2.key -out privkey2.key 基本的にApacheやPOP over SSL/TLS等で使用する際にはパスフレーズを解除しておく必要がある。 設定次第ではパスフレーズを解除しなくてもよい方法もある。適宜判断してパスフレーズをクリアーして欲しい。ちなみに証明書を更新する際には、このパスフレーズを解除し忘れて混乱するケースが多発した。 (^-^;; CRLの作成 †証明書の失効 †秘密鍵が洩れてしまったり、証明書を作り直したい場合などには、現在使われている証明書を失効しなければならない。 openssl ca -gencrl -revoke new.pem -config openssl.conf.ca 有効期限が切れた証明書の失効 †証明書のDBは有効期限が切れていたとしても自動的にその情報が更新されるわけではありません。有効期限が切れた証明書を失効させるためには次のコマンドを実行し証明書データベースを更新(update)する必要があります。 openssl ca -updatedb -config conf/openssl.conf.ca CRLの作成 †openssl ca -gencrl -out crl.pem -config openssl.conf.ca 証明書の更新 †ルート証明書の更新 †openssl req -new -x509 -nodes -sha1 -days 3650 -in privkey.key.pem -key demoCA/private/cakey.pem -out new.req -config openssl.conf.ca クライアント・サーバ証明書の更新 †基本的に古い証明書を失効させ、新しい証明書を作り直せばいい。 参考リンク † |