项目

概述

个人资料

操作

使用自签名证书设置简单的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.pemprivkey.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

另请参阅

========

gstrauss大约 2 年 前更新 · 40 次修订