在本教程中,你将学习如何在 Lighttpd 上安装 SSL 证书。本指南涵盖当前的配置方式(使用 mod_openssl 模块分别配置证书和私钥)、适用于旧版本的传统合并 PEM 方法,以及重启前的快速配置测试。
我们还录制了一段视频,详细讲解了整个过程。如果你更喜欢文字版说明,请继续阅读下文。
在 Lighttpd 上生成 CSR 代码
我们先从 CSR(证书签名请求)的生成开始。CSR 是一段编码文本,你需要将其发送给证书颁发机构以申请 SSL 证书。你有两种选择:
- 使用我们的CSR 生成器自动生成 CSR。
- 按照我们的分步教程了解如何在 Lighttpd 上生成 CSR。
用任意文本编辑器打开 CSR 文件,复制其全部内容(包括 BEGIN CERTIFICATE REQUEST 和 END CERTIFICATE REQUEST 这两行),粘贴到 SSL 订购流程中对应的框内。将 CSR 提交给证书颁发机构,等待验证。CA 签发 SSL 证书后,继续按照下方步骤进行安装。
在 Lighttpd 上安装 SSL 证书
第一步:准备证书文件
验证通过后,证书颁发机构会通过邮件把证书文件发给你。下载压缩包并解压。你应该会得到以下文件:
- yourdomain.crt,你的主 SSL 证书。
- yourdomain.ca-bundle,中间证书(即CA 证书包)。
- yourdomain.key,生成 CSR 时创建的私钥。
Lighttpd 建议 ssl.pemfile 所指向的文件应包含完整的证书链:先是你的证书,然后是中间证书。创建该合并的证书链文件,然后将其与私钥一起移动到 Lighttpd 可读取的目录中(例如 /etc/lighttpd/ssl/):
cat yourdomain.crt yourdomain.ca-bundle > yourdomain.fullchain.pem
sudo mkdir -p /etc/lighttpd/ssl
sudo cp yourdomain.fullchain.pem yourdomain.key /etc/lighttpd/ssl/
限制私钥的访问权限,使其仅可由 root 读取:
sudo chmod 600 /etc/lighttpd/ssl/yourdomain.key
第二步:启用 mod_openssl
自 1.4.56 版本起,Lighttpd 的 TLS 支持功能位于一个名为 mod_openssl 的可加载模块中(此外还存在 mod_mbedtls、mod_wolfssl、mod_gnutls 和 mod_nss 等其他后端)。在 SSL 套接字块之前,在主配置文件中加载该模块:
server.modules += ( "mod_openssl" )
注意:在 1.4.55 及更早版本的 Lighttpd 中,TLS 是内置编译的,而不是作为模块加载的,因此在这些版本中可以跳过此行。可通过 lighttpd -v 检查你的版本。
第三步:编辑 lighttpd.conf
用你喜欢的编辑器打开主配置文件(路径通常为 /etc/lighttpd/lighttpd.conf):
sudo nano /etc/lighttpd/lighttpd.conf
为 443 端口添加一个套接字块。在当前版本的 Lighttpd(1.4.56 及以上)中,证书链和私钥应保存在各自独立的文件中:将 ssl.pemfile 指向完整证书链文件,将 ssl.privkey 指向私钥文件。这也是大多数证书颁发机构提供文件的格式,也是 Lighttpd 推荐的配置方式。
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/yourdomain.fullchain.pem"
ssl.privkey = "/etc/lighttpd/ssl/yourdomain.key"
# Minimum TLS version (ssl-conf-cmd needs lighttpd 1.4.48+; TLS 1.2 is already the default on 1.4.56+)
ssl.openssl.ssl-conf-cmd = ( "MinProtocol" => "TLSv1.2" )
}
- ssl.engine 用于为此套接字启用 TLS。
- ssl.pemfile 包含你的证书,后接中间证书链。
- ssl.privkey 包含私钥。自 1.4.53 版本起,只要私钥不在 pemfile 内,就必须使用该项。
为了将普通 HTTP 请求重定向到 HTTPS,确保访客始终访问安全版本网站,请为 80 端口添加重定向规则(这需要 mod_redirect 模块,大多数发行版默认已加载该模块):
$SERVER["socket"] == ":80" {
url.redirect = ( "^/(.*)" => "https://yourdomain.com/$1" )
}
保存并关闭文件。
传统方法:合并 PEM 文件与 ssl.ca-file
较旧的 Lighttpd 1.4.x 版本(1.4.53 之前)使用的是单一的合并 PEM 文件,其中证书和私钥拼接在一起,中间证书链则通过 ssl.ca-file 单独提供。如果你正在维护此类旧系统,可以像下面这样创建合并文件:
cat yourdomain.crt yourdomain.key > /etc/lighttpd/ssl/yourdomain.pem
然后在套接字块中引用该文件:
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/yourdomain.pem"
ssl.ca-file = "/etc/lighttpd/ssl/yourdomain.ca-bundle"
}
在当前版本的 Lighttpd 中,建议使用第三步中所述的独立 ssl.pemfile 和 ssl.privkey 形式,并将完整证书链保存在 pemfile 中。ssl.ca-file 指令在 1.4.60 版本中已重命名为 ssl.verifyclient.ca-file,因为它的真正用途是验证客户端证书,而不是提供服务器端的证书链。
第四步:测试配置
在重启之前,务必检查语法,因为错误可能会导致服务器无法启动。运行:
sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf
你应该会看到语法正确的提示消息。如需进行更深入的检查(同时加载并初始化模块),可使用 sudo lighttpd -tt -f /etc/lighttpd/lighttpd.conf。在继续之前,请修复所有报告的错误。
第五步:重启 Lighttpd
使更改生效。在使用 systemd 的现代系统上,重启服务:
sudo systemctl restart lighttpd
在使用 SysV init 的旧系统上,请使用初始化脚本:
sudo /etc/init.d/lighttpd restart
恭喜,你的 SSL 证书现已成功安装在 Lighttpd 上。如需确认安装结果并获取即时状态报告,请使用我们的SSL Checker,或浏览我们完整的SSL 工具集。如需了解高级选项,请参阅官方的Lighttpd SSL 文档。
常见问题
当前版本的 Lighttpd(1.4.56 及以上)建议使用分离的文件:证书及其中间证书链保存在 ssl.pemfile 指定的文件中,私钥保存在 ssl.privkey 中。旧版将证书和私钥拼接到同一个 ssl.pemfile 的合并方式依然可用,但分离形式更符合大多数证书颁发机构提供文件的方式,也是官方文档推荐的做法。
不需要。目前推荐的做法是直接将中间证书包含在 ssl.pemfile 文件中,紧跟在你的证书之后。ssl.ca-file 指令是过去用来在 pemfile 只包含叶证书时补全证书链的一种方式,在 1.4.60 版本中已被重命名为 ssl.verifyclient.ca-file,因为它的真正作用是验证客户端证书。
运行 sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf 来测试语法,或使用 sudo lighttpd -tt -f /etc/lighttpd/lighttpd.conf 进行更深入的测试(同时会加载模块)。在重启之前修复所有报告的错误,以避免因拼写错误导致服务器无法启动。
这通常意味着你的 ssl.pemfile 中缺少中间证书。请将你的证书与 CA 证书包合并到同一个文件中(证书在前),并将 ssl.pemfile 指向该文件。然后测试配置并重启。你可以使用我们的SSL Checker确认证书链是否完整。
使用 OpenSSL 连接你的网站并读取其提供的证书:echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -issuer -dates
如果证书已安装,此命令会打印出证书的颁发者和有效期。你也可以在浏览器中打开你的网站,检查地址栏的锁形图标。


