Lighttpdを使用して1つのIPに複数のSSL証明書を設定する方法
序章
Server Name Indication(SNI)は、TLSプロトコルの機能であり、単一のIPアドレスに複数のSSL証明書を設定できます。
Lighttpdはすでにセットアップされ、実行されている必要があります。 これらの記事を読んで理解してください。
設定
このチュートリアルでは、2つのドメインを使用します。 どちらも自己署名SSL証明書を使用します。
ドメイン1: example.com 一般名: *.example.com
ドメイン2: digitalocean.com 一般名: www.digitalocean.com
SSLセットアップには、デフォルトの仮想ホストと同じようにデフォルトの証明書が必要です。 これには、最初のドメインの証明書を使用します。
秘密鍵を作成する
/etc/lighttpd
内にディレクトリを作成して、キーと証明書を配置します。
mkdir /etc/lighttpd/certs
秘密鍵を作成し、パスフレーズを入力します。 2番目のコマンドは、パスフレーズを削除するためのものです。
cd /etc/lighttpd/certs openssl genrsa -des3 -out example.com.key 2048 openssl rsa -in example.com.key -out example.com.key
2番目のドメインについても同じようにします。
openssl genrsa -des3 -out digitalocean.com.key 2048 openssl rsa -in digitalocean.com.key -out digitalocean.com.key
パスフレーズが削除されていない場合、Lighttpdは起動または再起動するたびにパスフレーズの入力を求めます。
証明書署名要求を作成する
両方のドメイン名のCSRを作成します。
cd /etc/lighttpd/certs openssl req -new -key digitalocean.com.key -out digitalocean.com.csr openssl req -new -key example.com.key -out example.com.csr
フィールドを空白のままにする場合は、詳細を入力し、ドット.
を入力します。
----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:NYC Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:www.digitalocean.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
example.com
の共通名フィールドに入力するときは、必ず*.example.com
と入力してください。
----- Country Name (2 letter code) [AU]:IN State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:Chennai Organization Name (eg, company) [Internet Widgits Pty Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:*.example.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
どの証明書が提示されているかを簡単に区別できるように、このCSRのために別の国と都市に参入しました。
SSL証明書に署名する
ここでも、両方の証明書に異なる有効期間(-days
引数)を設定して、それらを簡単に区別できるようにします。
cd /etc/lighttpd/certs openssl x509 -req -days 100 -in example.com.csr -signkey example.com.key -out example.com.crt openssl x509 -req -days 200 -in digitalocean.com.csr -signkey digitalocean.com.key -out digitalocean.com.crt
証明書とその秘密鍵から.pem
ファイルを作成します。
cat example.com.{key,crt}> example.com.pem cat digitalocean.com.{key,crt}> digitalocean.com.pem
rootユーザーにこれらのファイルの読み取りのみを許可することにより、このディレクトリ内のファイルを保護します。
chmod -R 400 /etc/lighttpd/certs/
Lighttpdデーモンはwww-dataに到達する前にroot権限で起動するため、これは問題にはなりません。
SSL用にLighttpdを設定する
/etc/lighttpd/lighttpd.conf
ファイルを編集し、最後に次の行を追加します。
$SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/example.com.pem" $HTTP["host"] =~ "(^|www\.)digitalocean.com" { ssl.pemfile = "/etc/lighttpd/certs/digitalocean.com.pem" } }
example.com
の証明書がデフォルトであるため、ホスト条件内に配置しません。
Lighttpdデーモンを再起動します。
service lighttpd force-reload
証明書パスにエラーがない場合、または.pem
ファイルを作成するときに、サービスは正常に再起動するはずです。
HTTPSのテスト
hosts ファイルを編集せずにこれをテストする簡単な方法は、curl
を使用することです。
このコマンドには、ドメインをIPアドレスにマップする--resolve
引数があります。 1.1.1.1をドロップレットのIPアドレスに置き換えます。
curl -k -o /dev/null --resolve "www.digitalocean.com:443:1.1.1.1" -s -v https://www.digitalocean.com
これにより、詳細な出力が得られます。 -o
は、必要がないため、すべてのHTML出力をリダイレクトします。 これは私たちが興味を持っているスニペットです。
* SSL connection using AES256-SHA * Server certificate: * subject: C=US; L=NYC; O=DigitalOcean Inc; CN=www.digitalocean.com; [email protected] * start date: 2014-03-26 18:39:25 GMT * expire date: 2014-10-12 18:39:25 GMT * common name: www.digitalocean.com (matched) * issuer: C=US; L=NYC; O=DigitalOcean Inc; CN=www.digitalocean.com; [email protected] * SSL certificate verify result: self signed certificate (18), continuing anyway.
次のドメインを調べます。
curl -k -o /dev/null --resolve "www.example.com:443:1.1.1.1" -s -v https://www.example.com
出力からの証明書の詳細:
* SSL connection using AES256-SHA * Server certificate: * subject: C=IN; L=Chennai; CN=*.example.com; [email protected] * start date: 2014-03-26 18:39:20 GMT * expire date: 2014-07-04 18:39:20 GMT * common name: *.example.com (matched) * issuer: C=IN; L=Chennai; CN=*.example.com; [email protected] * SSL certificate verify result: self signed certificate (18), continuing anyway.
subject:フィールドと expire date:フィールドの両方の証明書の違いに注意してください。
IPアドレスに直接アクセスしてみてください。
user@droplet~$ curl -k -o /dev/null -s -v https://1.1.1.1 * SSL connection using AES256-SHA * Server certificate: * subject: C=IN; L=Chennai; CN=*.example.com; [email protected] * start date: 2014-03-26 18:39:20 GMT * expire date: 2014-07-04 18:39:20 GMT * common name: *.example.com (does not match '128.199.206.19') * issuer: C=IN; L=Chennai; CN=*.example.com; [email protected] * SSL certificate verify result: self signed certificate (18), continuing anyway.
これにより、example.comの証明書が返されます。