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の証明書が返されます。