序章

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

提出者:http: //jesin.tk/