SSLの設定
戻る
SSLの簡単な概要
SSL(Secure Sockets Layer)はTCP通信を暗号化するためのプロトコルです。esehttpdではOpenSSLを利用してSSLで暗号化されたHTTP通信に対応しています。SSLには大きく分けて3種類の機能があります。
- 通信経路の暗号化
- クライアントとサーバの間の通信を暗号化し、通信経路の中間にあるホストでの盗聴を防止します。通信を暗号化すれば、その内容は通信の端点であるクライアントとサーバ以外のホストからは(暗号を解読しない限り)見ることができなくなります。
- サーバ認証
- クライアントの接続相手であるサーバが本物であるかを確認することができます。具体的には、認証局(Certificate Authority)がサーバの設置者に対しデジタル署名した証明書(Certificate)を発行し、それをSSL接続時にサーバがクライアントに送ります。クライアントにはあらかじめいくつかの認証局の証明書が組み込まれていて、サーバから送られてきたサーバ証明書が認証局がデジタル署名したものであるかを確認します。
- クライアント認証
- サーバ認証とは逆に、認証局がデジタル署名したユーザ個人の証明書を用意しておき、サーバには認証局の証明書を用意しておきます。サーバがクライアント認証を要求したときには、クライアントがその証明書を提示し、サーバはそれが認証局が署名したものであるかを確認します。
この3種類の機能のうち、経路の暗号化とサーバ認証はSSL接続では常時おこなわれます。一方クライアント認証は、サーバが要求したときに限っておこなわれます。クライアント認証のための設定については、SSLクライアント認証の設定を参照して下さい。
暗号化しないHTTPの標準ポートは80ですが、SSLを使ったHTTP接続はふつうポート443でおこないます。https://hostname/ という形のURIがSSL化したHTTP接続をあらわします。
サーバの秘密鍵の作成
SSL対応のHTTPサーバを立てるのに必ず用意しなければならないのは、サーバの秘密鍵とサーバ証明書の2つです。秘密鍵は次のようにして作成できます。
$ openssl genrsa -out server.key 1024
このようにして得られるserver.keyファイルを適当な位置に置き、esehttpdの設定ファイルのSSLCertificateKeyFile
ディレクティブに指定します。なお秘密鍵は誰にも見られないように注意して管理して下さい。
サーバの証明書を得る方法はいくつかありますが、ここでは自己署名した証明書を作る方法を説明します。クライアントから見た場合、自己署名した証明書は第三者による署名のような信憑性はありませんが、SSLを通信経路の暗号化のためだけに使いたい場合や、サーバの同一性を証明したい場合にはこれで十分です。自己署名証明書は次のようにして発行できます。
$ openssl req -new -x509 -key server.key -out server.crt
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Hokkaido
Locality Name (eg, city) []:Sapporo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ESE Web
Organizational Unit Name (eg, section) []:ESE Web Admin
Common Name (eg, YOUR name) []:ghost.math.sci.hokudai.ac.jp
Email Address []:a-higuti@math.sci.hokudai.ac.jp
ここでserver.keyは先に作成したサーバの秘密鍵です。上の入力例は筆者のサーバのテストのための証明書を作ったときのものです。重要なのは、「Common Name」の項目にサーバのホスト名を入力することです。終了したらserver.crtという証明書ができているはずですので、このファイルを適当な位置に置き、esehttpdの設定ファイルのSSLCertificateFile
ディレクティブに指定します。
Esehttpdの設定
esehttpdの設定ファイルに次のような設定を加えて下さい。
SSLPort 443
SSLCertificateFile /usr/local/lib/esehttpd/conf/server.crt
SSLCertificateKeyFile /usr/local/lib/esehttpd/conf/server.key
これを記述できるのは全てのセクションの外側か、あるいは<VirtualHost>
セクションかのいずれかです。ネームバーチャルホストではSSLを利用できませんので注意して下さい。SSLのみ接続を受け付けて通常のHTTPは受け付けないようにするには、
Port 80
の行を設定ファイルから消します。esehttpdを一旦終了し、再び起動すれば設定が有効になります。Webブラウザから「https://foobar.org/」のようなURIを開いてみて下さい。たとえ同一のホストから接続する場合でも、証明書のCommon Nameの欄に書かれたホスト名へアクセスしないと、ホスト名が異なる旨の警告が出ます。また、先に作成した証明書はブラウザが知っている認証局が署名したものではありませんから、証明書を受け付けるか否かを問い合わせるダイアログが出るはずです。証明書を受け付けるとページが表示されます。

上の図はNetscape Navigatorでの警告ダイアログです。ここで「この証明書を永続的に記憶する」をチェックすると、以後この証明書については警告を出さずに自動的に受け入れるようになります。

上の図はMicrosoft Internet Explorer(MSIE)での警告ダイアログです。「信頼する会社から発行されていません」というのは、その証明書が、ブラウザが信頼すると認めた認証局が発行したのではないということを意味します。信頼する認証局のリストはブラウザにあらかじめ組み込まれていますが、ユーザが追加することもできます。その方法については後述します。MSIEでは信頼する認証局以外が発行する証明書を永続的に受け入れることはできないようです。よってこの警告ダイアログを出さないようにするには、大手の認証局から認証してもらうか、後述する方法で自分が立てた認証局を信頼する認証局のリストに追加する必要があります。
個人や非営利組織などのサイトでは大手の認証局に証明書を発行してもらうのは抵抗があるでしょうから、そういう場合は自分で認証局を立ててしまうと便利です。後で説明するクライアント認証の際にもその認証局を利用できます。
認証局の鍵と証明書を作る
認証局を立てるには、まずその認証局自身の鍵と証明書を作ります。
$ openssl genrsa -out ca.key 1024
$ openssl req -new -x509 key ca.key -out ca.crt
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Hokkaido
Locality Name (eg, city) []:Sapporo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ESE CA
Organizational Unit Name (eg, section) []:ESE CA Admin
Common Name (eg, YOUR name) []:Akira Higuchi
Email Address []:a-higuti@math.sci.hokudai.ac.jp
上の入力例は筆者のサーバのテストのための認証局を作ったときのものです。
認証局の設定ファイルを作る
認証局が証明書を発行するための準備をしますが、それには次のような内容の設定ファイルが必要です。
[ ca ]
default_ca = CA_own
[ CA_own ]
dir = .
certs = $dir
new_certs_dir = $dir/certs
database = $dir/index
serial = $dir/serial
RANDFILE = $dir/rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 365
default_md = md5
preserve = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
このような内容を例えばca.configという名前で作成して下さい。さらに、
$ touch index
$ echo '01' > serial
$ mkdir certs
と実行してください。これら3つのファイル(とディレクトリ)の名前は先の設定ファイルca.configでdatabase, serial, new_certs_dirの項目の名前に合わせて下さい。
サーバの証明書発行のためのリクエストを作成
証明書を認証局に発行してもらうためには、証明してもらいたい内容を記したリクエスト(CSR)を先に作る必要があります。ここではサーバの自己署名証明書を作った時と同じ内容のCSRを作ってみます。
$ openssl req -new -key server.key -out server.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Hokkaido
Locality Name (eg, city) []:Sapporo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ESE Web
Organizational Unit Name (eg, section) []:ESE Web Admin
Common Name (eg, YOUR name) []:ghost.math.sci.hokudai.ac.jp
Email Address []:a-higuti@math.sci.hokudai.ac.jp
自己署名の時との違いは、-x509を付けないことと、出力するファイル名の違いだけです。
証明書を発行
証明書は次のようにして発行します。
$ openssl ca -config ca.config -out server-ca.crt -infiles server.csr
確認プロンプトが出ますので'y'と答えると証明書が発行されます。念のため出来た証明書を確認してみましょう。
$ openssl verify -CAfile ca.crt server-ca.crt
server.crt: OK
以上で、自分で立てた認証局でサーバの証明書を発行することができました。あとはこのserver-ca.crtをSSLCertificateFileディレクティブで指定してやれば完了です。
認証局を「信頼する」ためのMSIEの設定
先述したように、MSIEに自分で立てた認証局が発行した証明書を受け入れてもらうには、クライアントが「信頼する」認証局のリストにその認証局を追加する必要があるようです。ここではその手順について説明します。まず、MSIEに証明書をインポートするには、証明書をDERエンコーディングに変換しなければなりません(今まで使っていたのはPEMエンコーディングというテキスト形式です)。それには次のように実行します。
$ openssl x509 -in ca.crt -out ca.cer -outform DER
このようにして作成されたファイルをMicrosoft Windows上で開くと、次のようなダイアログが現われます。

指示にしたがって進むと、この証明書が「信頼されたルート証明期間」のリストに加えられます。

この「証明書マネージャ」のダイアログは、MSIEのメニューから、ツール→インターネットオプション→コンテンツ→証明書、と辿ればいつでも出すことができます。
戻る
Akira Higuchi