使用自签名证书设置简单的SSL配置¶
使用 lighttpd 设置简单的 SSL 配置非常容易。但是,使用此方法应谨慎,因为此设置仅提供适当的加密,而非身份验证!用户将会收到一个询问是否接受证书的提示!
首先,进入您的 SSL 证书目录并执行
cd /etc/lighttpd/certs openssl req -new -x509 -keyout lighttpd.pem -out lighttpd.pem -days 365 -nodes chmod 400 lighttpd.pem
如果 lighttpd 以 root 身份启动(许多服务配置的默认设置),那么证书可以由 root 用户拥有,权限设置为 0400,因为 lighttpd 在将权限降级到 www-data(或其他账户,取决于发行版配置)之前会读取证书。
然后编辑 /etc/lighttpd/lighttpd.conf 并添加
$SERVER["socket"] == ":443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/lighttpd.pem" }
重启 Web 服务器后,您应该能够通过 https 访问您的 Web 服务器。
为曲线 SECP384R1 创建椭圆曲线 (EC) 证书openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 -keyout lighttpd.pem -out lighttpd.pem -days 365 -nodes
Let's Encrypt 的新根证书和中间证书¶
2020 年 12 月 / 2021 年 1 月:如果您开始遇到 Let's Encrypt 证书问题,请阅读以下链接。
https://letsencrypt.openssl.ac.cn/2020/09/17/new-root-and-intermediates.html
https://letsencrypt.openssl.ac.cn/2020/11/06/own-two-feet.html
https://letsencrypt.openssl.ac.cn/2020/12/21/extending-android-compatibility.html
在 lighttpd.conf
中使用 Let's Encrypt 的 fullchain.pem
和 privkey.pem
ssl.pemfile = "/path/to/fullchain.pem" ssl.privkey = "/path/to/privkey.pem"
使用 TLS-ALPN-01 验证挑战和 dehydrated 引导 Let's Encrypt(适用于 lighttpd 1.4.53)¶
创建初始自签名证书,以便能够为 lighttpd 配置 SSL,包括 dehydrated 所需的 subjectAltName。
前提条件:必须配置 DNS,使 $hostname 指向将从运行 lighttpd 的机器提供内容的地址。
将下面的 hostname=www.example.com
替换为适当的主机名。
#!/bin/bash certdir=/etc/lighttpd/certs hostname=www.example.com mkdir -p $certdir/$hostname && openssl req -new -x509 -extensions req_ext -keyout $certdir/$hostname/privkey.pem -out $certdir/$hostname/cert.pem -days 365 -nodes -config <(cat <<-EOF [ req ] distinguished_name = dn prompt = no [ dn ] CN = $hostname [ req_ext ] subjectAltName = @san [ san ] DNS = $hostname EOF ) && cp $certdir/$hostname/cert.pem $certdir/$hostname/chain.pem
配置 /etc/lighttpd/lighttpd.conf。请注意,Let's Encrypt TLS-ALPN-01 验证挑战要求主机在端口 443 上接收并响应挑战。
server.modules += ("mod_openssl") $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" ssl.privkey= "/etc/lighttpd/certs/www.example.com/privkey.pem" ssl.pemfile= "/etc/lighttpd/certs/www.example.com/fullchain.pem" ssl.acme-tls-1 = "/etc/lighttpd/dehydrated/tls-alpn-01" #ssl.openssl.ssl-conf-cmd = ("MinProtocol" => "TLSv1.2") # (lighttpd 1.4.56 default; recommended to accept only TLSv1.2 and TLSv1.3) #ssl.ca-file= "/etc/lighttpd/certs/www.example.com/chain.pem" # (needed in $SERVER["socket"] before lighttpd 1.4.56 if ssl.pemfile in $HTTP["host"]) }
启动 lighttpd
systemctl start lighttpd
下载 dehydrated 并强制续订证书 (-x)。您应该在运行下载的脚本之前进行审查。
该脚本不需要以 root 身份运行,但需要有权限写入挑战目录和证书目录树。
运行 lighttpd Web 服务器的用户账户需要有权限读取 dehydrated 写入的文件,因此建议 dehydrated 在与 lighttpd Web 服务器相同的用户账户下运行。
(题外话:一位用户发现,在一切正常运行之前,他需要为 lighttpd 用户设置一个登录 shell(例如 "/bin/bash")。请参阅 https://redmine.lighttpd.ac.cn/boards/2/topics/8482)
mkdir -p /etc/lighttpd/dehydrated/tls-alpn-01 cd /tmp && git clone https://github.com/lukas2511/dehydrated && cd dehydrated ./dehydrated --register --accept-terms ./dehydrated -d www.example.com -t tls-alpn-01 --out /etc/lighttpd/certs --alpn /etc/lighttpd/dehydrated/tls-alpn-01 -c --ca letsencrypt
重启 lighttpd 以使用 Let's Encrypt 证书
systemctl restart lighttpd
故障排除:在 lighttpd 1.4.59 之前,由 dehydrated
创建初始证书可能会失败,并显示“Missing acmeValidationV1 extension”。在 lighttpd 1.4.59 之前,初始证书可能需要在 lighttpd 外部提供。然后证书续订似乎可以正常工作。
mod_nss
:使用 dehydrated -a rsa
(lighttpd 的限制,直到 mod_nss
添加对解析 ECC 证书的支持)mod_mbedtls
:不支持 2.23.0 之前的 mbedtls。早期版本的 mod_mbedtls
不识别 id-pe-acmeIdentifier OID,并且不提供可用于处理它的回调。mod_wolfssl
:wolfssl 要求在 ssl.ca-file
中提供 Let's Encrypt 证书链以进行初始证书创建,否则当 Let's Encrypt 在 TLS-ALPN-01 挑战过程中连接到 lighttpd 时,Let's Encrypt 提供的客户端证书的 OCSP 验证将失败。
使用 HTTP-01 验证挑战和 certbot 引导 Let's Encrypt¶
certbot 尚不支持 --preferred-challenges tls-alpn-01
,因此必须与 certbot 一起使用安全性较低的 http-01 验证挑战。
配置 /etc/lighttpd/lighttpd.conf。请注意,Let's Encrypt HTTP-01 验证挑战要求主机在端口 80 上接收并响应挑战。
server.bind = "0.0.0.0" server.port = 80 server.modules += ("mod_alias") alias.url = ("/.well-known/" => "/etc/lighttpd/certbot/.well-known/")
启动 lighttpd
systemctl start lighttpd
安装并运行 certbot
mkdir -p /etc/lighttpd/certbot dnf install certbot certbot register --agree-tos -m "responsible-admin@example.com" certbot certonly --preferred-challenges http-01 --webroot -w /etc/lighttpd/certbot -d www.example.com #certbot certonly --preferred-challenges tls-alpn-01 --webroot -w /etc/lighttpd/certbot -d www.example.com
重新配置 lighttpd.conf 以使用 certbot 检索到的证书
server.modules += ("mod_openssl") $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" ssl.privkey= "/etc/letsencrypt/live/www.example.com/privkey.pem" ssl.pemfile= "/etc/letsencrypt/live/www.example.com/fullchain.pem" ssl.openssl.ssl-conf-cmd = ("MinProtocol" => "TLSv1.2") # (recommended to accept only TLSv1.2 and TLSv1.3) #ssl.ca-file= "/etc/lighttpd/certs/www.example.com/chain.pem" # (needed in $SERVER["socket"] before lighttpd 1.4.56 if ssl.pemfile in $HTTP["host"]) }
重启 lighttpd 以使用 Let's Encrypt 证书
systemctl restart lighttpd
另请参阅¶
========