如何使用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 的证书。

提交者:http: [[“%3Ca|//jesin.tk/]] [[“%3C/a|”>杰辛A]]