Security」カテゴリーアーカイブ

SSL証明書

いつからか、さくらのレンタルサーバでも名前ベースのバーチャルホストで SSL が使えるようになっていた (SNI) ので、このサイトにも導入してみた。

“無料のSSL証明書StartSSLを活用する” を参考に、StartSSL の SLL 証明書を取得、さくらのサーバに証明書を設置した。

これでいけるかと思ったら、エラーが出て接続できない。

www.uconst.org への接続中にエラーが発生しました。
The OCSP server has no status for the certificate. 
(エラーコード: sec_error_ocsp_unknown_cert) 

接続できないのは Firefox からで、IE8 からだと接続できる。でも IE8 だと単に OCSP を見に行ってないだけかもしれない。

ググったら こんなツイート を見つけた。CA への登録が完了してないっぽい。しょせん無料だし気長に待つか。

(追記 15:20)
今つながった。つながるまで3時間半くらいかかったかな。

OpenSSL での証明書更新

先日のエントリとは異なり、OpenSSL で運用している認証局で証明書を更新する手順のまとめ。

NetBSD 上で Dovecot によるメールサーバを運用していて、SSL を使うのに証明書が必要となっている。以前の証明書は何らかの理由(期限切れなど)で使えなくなっているため、新たに証明書を発行してもらう必要がある、という状況を想定している。

まず最初に、メールサーバ上で証明書要求と新しい秘密鍵を作成する。

$ sh /etc/openssl/CA.sh -newreq
Generating a 1024 bit RSA private key
...........................++++++
..........++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase: (秘密鍵の暗号化に使うパスフレーズを入力)
Verifying - Enter PEM pass phrase: (もう一度)

Dovecot で使う SSL 証明書に Windows Server 2003 の証明書サービスを使ってみた

Windows Server 2003 の証明書サービスを使ってみた。認証局 (CA) は Windows Server 2003、証明書の発行対象は NetBSD 上のメールサーバ (Dovecot2)。

まずは、秘密鍵と証明書要求を作成する。OpenSSL の必要最小限の設定は済んでおり、CA.sh などは /usr/share/example/openssl に置いてあるものを /etc/openssl にコピーしていている。

$ sh /etc/openssl/CA.sh -newreq
Generating a 1024 bit RSA private key
...............++++++
............................++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase: (パスフレーズを入力)
Verifying - Enter PEM pass phrase: (もう一度同じパスフレーズを入力)

OCSP

前回からの続きで、OCSP を試したメモ。

OpenSSL 1.0.0a の ocsp では、なぜか ::1 にしかバインドされないので、Apache のリバースプロキシを使って IPv4 アドレスにきたリクエストを ocsp に転送するようにした。

FireFox 3.6.3 の場合

OCSP によるサーバ証明書の検証は最初に行われる。オレオレ認証局による証明書の場合、最初に認証局が信頼できないというエラーが出る。そこで、証明書を受け入れるように指示すると、それ以上の検証は行われない。OCSPによる検証も行われない。

したがって、OCSPによる検証を有効にするには、サーバ証明書が信頼された認証局が発行したものでなければならない。つまり、オレオレ認証局の場合、あらかじめ認証局証明書をインストールしておく必要がある。

安全な接続ができませんでした

www.uconst.org への接続中にエラーが発生しました。
Peer’s Certificate has been revoked.
(エラーコード: sec_error_revoked_certificate)

* 受信したデータの真正性を検証できなかったため、このページは表示できませんでした。
* この問題を Web サイトの管理者に連絡してください。あるいは [ヘルプ] メニューの [不具合のあるサイトを報告] でこのサイトについて報告してください。

InternetExplorer 8 の場合

認証局証明書をインストールしても検証している気配なし。どこかでやり方を間違えているのかも。

結果まとめ

  • OpenSSL 1.0.0a を使えば OCSP による失効リストの確認は可能。
  • ただし、ポートを転送する必要がある。
  • 間違ったリクエストが届くと ocsp が終了するので、OpenSSL の ocsp を OCSP サーバとして使うのは実用的ではない
  • FireFox で OCSP が機能するためには、あらかじめ認証局が信頼されている必要がある。オレオレ認証局では機能しない。

失効リスト (CRL)

失効リスト (CRL) が機能するためには、証明書に CRL Distribution Points が記載されていなければならないらしい。これは、失効リストの配布元を示す情報で、OpenSSL では openssl.cnf に crlDistributionPoints の設定をすることで、発行される証明書に CRL Distribution Points の情報が埋め込まれる。

問題はどこに記述するかだが……。とりあえず、[usr_cert] セクションにでも書いておくことにしよう。

(略)
[ user_cert ]
(略)
crlDistributionPoints = URI:http://www.uconst.org/CA/uconst-ca.crl
(略)

URI: の後に、crl のファイルを配布する URL を記述する。結果は次の通り。

$ ./CA.sh -sign
$ openssl x509 -noout -text -in newcert.pem
Certificate:
(略)
X509v3 extensions:
(略)
X509v3 CRL Distribution Points:
Full Name:
URI:http://www.uconst.org/CA/uconst-ca.crl
(略)

それで、失効リストを公開して、失効した証明書をサーバに設定して Firefox 3.6.3 で接続すると、普段と変りない。 Internet Exploler 6 (IE6) だと、「このサイトのセキュリティ証明書の取り消し情報は、使用できません。続行しますか?」などとでてくる。少なくとも IE6 では途中まではうまく行ってるようだ。

IE6 は、CRL の署名がオレオレ認証局になっているのが気に入らないらしい。オレオレ認証局の証明書をルート証明書のリストに追加してやると、「このサイトのセキュリティ証明書は、取り消されています。このサイトは信頼するべきではありません。」と出てくる。これがまさに期待通りの挙動だ。

とはいえ、オレオレ認証局の証明書をインストールするのは、はばかられるので、IE6 で CRL の動作が確認できたという結論をもって、インストールしたオレオレ認証局証明書をアンインストールした。

Firefox 3.6 では、どうするのだろう? 調べてみると、Online Certificate Status Protocol(OCSP)
というものを使うらしい。openssl ocsp で、OCSP のサーバを動かすことができるようだけれど、ど、実際動かしてみたらエラーが出た。エラーメッセージからはソケットをバインドするのに失敗しているように見えるけど、それがエラーの原因かどうかはよく分からない。

$  openssl ocsp -index index.txt -CA cacert.pem -rsigner cacert.pem -port 8888
Error setting up accept BIO
3148073508:error:02006016:system library:bind:Invalid argument:/u7/NetBSD/src/crypto/dist/openssl/crypto/bio/b_sock.c:759:port='8888'
3148073508:error:20069075:BIO routines:BIO_get_accept_socket:unable to bind socket:/u7/NetBSD/src/crypto/dist/openssl/crypto/bio/b_sock.c:761:
(追記)

どうも NetBSD 5.0.2 付属の OpenSSL (OpenSSL 0.9.9-dev 09 May 2008) のバグらしい。
FreeBSD 8.0 付属の OpenSSL 0.9.8k 25 Mar 2009 だとちゃんと動く。OpenSSL 本家のサイトから
OpenSSL 1.0.0a を持ってきてコンパイルしたら動作した。

(追記2)

動いたと思ったら、IPv6 アドレスの ::1 にしかバインドしてくれない。-url とかでホストを指定しても無視されてるっぽい。

Apache2.2 の SSL

Apache を 2.0 系列から 2.2 系列へ移行した。デフォルトの http.conf が機能別に分割されて、SSL 関連は httpd-ssl.conf で設定されるようになっている。以前の形式でも一部を修正すれば動くのだが、今後のメンテナンスを考慮して、新しい分割された記述に合わせるようにした。

デフォルトの http.conf では SSL 関連の設定を行う httpd-ssl.conf がコメントアウトされているので、コメントを外して有効にする。

# Secure (SSL/TLS) connections
Include etc/httpd/httpd-ssl.conf

http-ssl.conf で、サーバ証明書を SSLCertificate に、鍵を SSLCeritificateKeyFile に設定する。証明書の認証局が中間認証局であったりオレオレ認証局である場合には、認証局の証明書を SSLCertificateChainFile に設定する。

(略)
#   Server Certificate:
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP will prompt again.  Keep
#   in mind that if you have both an RSA and a DSA certificate you
#   can configure both in parallel (to also allow the use of DSA
#   ciphers, etc.)
SSLCertificateFile "/usr/pkg/etc/httpd/server.crt"
#SSLCertificateFile "/usr/pkg/etc/httpd/server-dsa.crt"
#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile "/usr/pkg/etc/httpd/server.key"
#SSLCertificateKeyFile "/usr/pkg/etc/httpd/server-dsa.key"
#   Server Certificate Chain:
#   Point SSLCertificateChainFile at a file containing the
#   concatenation of PEM encoded CA certificates which form the
#   certificate chain for the server certificate. Alternatively
#   the referenced file can be the same as SSLCertificateFile
#   when the CA certificates are directly appended to the server
#   certificate for convinience.
SSLCertificateChainFile "/usr/pkg/etc/httpd/server-ca.crt"
(略)

設定が終わったら普通に再起動すると SSL が有効になる。以前と異なり startssl というものはない。

今回行った SSL 設定のディレクティブのまとめ。紛らわしいものに SSLCACertificateFile というものがある。こちらはクライアント認証を行うときに設定するもの。誤解して設定しても動くところがまた紛らわしい。

SSLCertificateFile
サーバ証明書のファイル名。
SSLCertificateKeyFile
サーバ秘密鍵のファイル名。
SSLCertificateChainFile
サーバ証明書を発行した中間認証局 (CA) の証明書のファイル名。
SSLCACertificateFile
クライアント認証を行う場合の、クライアント証明書を発行した CA の証明書のファイル名。誤解を恐れずにいえば、ブラウザにインストールされているルート証明書のようなもの。サーバ証明書を発行した中間認証局の証明書をここに置いても機能するが、中間証明書は SSLCertificateChainFile に置くのが正しい。Web で見られる事例も混同しているのが多いようだ。歴史的な経緯によるのかな?