如何使用Lighttpd在一个IP上设置多个SSL证书
介绍
服务器名称指示 (SNI) 是 TLS 协议的一项功能,可以在单个 IP 地址上设置多个 SSL 证书。
Lighttpd 必须已经设置并运行。 阅读这些文章以了解它。
设置
本教程将使用两个域。 两者都将使用自签名 SSL 证书。
域 1: 例子.com 通用名称: *.example.com
领域 2: digitalocean.com 通用名称: www.digitalocean.com
SSL 设置需要默认证书,就像默认虚拟主机一样。 我们将为此使用第一个域的证书。
创建私钥
在 /etc/lighttpd
中创建一个目录来放置密钥和证书。
mkdir /etc/lighttpd/certs
创建私钥并输入密码。 第二个命令用于删除密码。
cd /etc/lighttpd/certs openssl genrsa -des3 -out example.com.key 2048 openssl rsa -in example.com.key -out example.com.key
对第二个域也这样做。
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 []:webmaster@digitalocean.com 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 []:admin@example.com 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 守护进程以 root 权限启动,然后降到 www-data,所以这应该不是问题。
为 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
。
此命令有一个 --resolve
参数,用于将域映射到 IP 地址。 将 1.1.1.1 替换为您的 Droplet 的 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; emailAddress=webmaster@digitalocean.com * 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; emailAddress=webmaster@digitalocean.com * 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; emailAddress=admin@example.com * 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; emailAddress=admin@example.com * 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; emailAddress=admin@example.com * 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; emailAddress=admin@example.com * SSL certificate verify result: self signed certificate (18), continuing anyway.
这应该返回 example.com 的证书。