本教程将向您展示如何在 lighttpd 上生成 CSR,即在运行 lighttpd Web 服务器的同一台服务器上使用 OpenSSL 命令行工具。您将通过一个命令创建两个文件:一个新的私钥和与之匹配的 CSR(证书签名请求),您需要将 CSR 提交给证书颁发机构(CA)。
以下步骤适用于每个附带 lighttpd 软件包的现代 Linux 发行版(Debian、Ubuntu、RHEL、AlmaLinux、Rocky Linux、Fedora、openSUSE、Alpine),因为它们都自带 OpenSSL 1.1.1 或 OpenSSL 3.x。这两个版本默认都使用 SHA-256 对请求进行签名,因此您无需添加摘要标志。同样的命令也适用于 FreeBSD 以及安装了 lighttpd 的 macOS。
第一步:连接到您的 lighttpd 服务器
在 macOS 或 Linux 上打开终端,或在 Windows 上打开 PowerShell 或 Windows Terminal,然后通过 SSH 连接到服务器。请将用户名和主机替换为您自己的:
ssh your-user@your-lighttpd-server
请在将托管该证书的同一台服务器上生成 CSR。私钥会随 CSR 一起创建,并且必须保留在该服务器上,因此如果您在自己的笔记本电脑上运行该命令,再将密钥复制过去,就失去了这样做的意义。您也可以在一个专门的目录中进行操作,以便日后能够方便地找到它,例如:
sudo mkdir -p /etc/lighttpd/ssl
cd /etc/lighttpd/ssl
第二步:生成私钥和 CSR
如果您已经使用其他工具生成了 CSR,请直接跳到在 lighttpd 上安装证书部分。
运行以下 OpenSSL 命令。它会一步创建一个 2048 位的 RSA 密钥和一个 CSR,主体信息和主题备用名称(SAN)都以内联方式提供,因此 OpenSSL 不会停下来提问:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
各部分的作用如下:
- -newkey rsa:2048 生成一个新的 2048 位 RSA 密钥。2048 位是目前公共证书的最低要求;您也可以使用 rsa:4096 生成更大的密钥,或改用 ECDSA(见下文)。
- -nodes 使私钥保持未加密状态,以便 lighttpd 在启动时可以直接读取它,而不会弹出密码提示。
- -keyout 和 -out 分别指定私钥文件和 CSR 文件的名称。
- -subj 提供证书主体信息。请在这里填写您真实的公司名称、州/省和城市,而不是占位符。CN(通用名称)是您的主域名。
- -addext “subjectAltName=…” 列出证书需要覆盖的每一个主机名。公共 CA 会依据 SAN 列表进行验证,因此这里也要包含通用名称。
请在所有位置将 yourdomain.com 替换为您的实际域名。如果需要覆盖额外的主机名,请用逗号分隔,将它们添加到 SAN 列表中,例如 DNS:api.yourdomain.com。对于通配符证书,请同时包含通配符域名和裸域名:DNS:*.yourdomain.com,DNS:yourdomain.com。主体字段中只能使用字母数字字符,C 字段请使用官方的两字母国家代码。
如果您更倾向于使用 ECDSA 密钥(更小更快,且 P-256 得到广泛支持),可以改用如下方式生成密钥和 CSR:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
lighttpd 通过 mod_openssl 同时支持 RSA 和 ECDSA 证书,您可以通过列出两对 ssl.pemfile 和 ssl.privkey 指令,在同一个套接字上同时提供两种证书。
如果您希望逐个字段回答提示,可以运行 openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr,不带 -subj 也不带 -addext。OpenSSL 会依次询问每个字段。届时:
- 国家名称(C):您所在国家的两字母 ISO 代码,例如 US 或 GB。对于商业验证(OV)或扩展验证(EV)证书,这必须是您组织注册所在的官方国家。
- 省/州名称(ST):请填写全称,例如 Tennessee。不要使用缩写。
- 地区名称(L):城市或城镇名称,例如 Nashville。
- 组织名称(O):您公司正式注册的名称,例如 Your Company LLC。对于域名验证(DV)证书,您可以填写 NA。
- 组织单位名称(OU):此字段已被弃用,公共 CA 会忽略它。请直接按 Enter 键留空。
- 通用名称(CN):证书对应的完全限定域名(FQDN),例如 www.yourdomain.com。对于通配符证书,请使用 *.yourdomain.com。
- 电子邮件地址:此项为可选,公共 CA 不会使用它。您可以留空。
- 挑战密码和可选的公司名称:这两项都是已过时的属性,公共 CA 会忽略它们。请留空。
如果不使用 -addext 标志,生成的 CSR 将没有 SAN 条目。公共 CA 会依据 SAN 列表进行验证,对于没有 SAN 的请求,它们会拒绝(或悄悄地覆盖处理),因此建议采用上文中带内联 -subj 加 -addext 的命令。
第三步:定位您的文件
列出当前目录,确认两个文件都已创建:
ls
您应该会看到两个新文件:
- yourdomain.key:您的私钥。请将它保存在服务器上,妥善做好安全备份,切勿发送给任何人,包括证书颁发机构。谁持有这个密钥,就能冒充您的网站。
- yourdomain.csr:您的证书签名请求。这是您要提交给 SSL 提供商的文件。
限制私钥的访问权限,使其只能被文件所有者读取:
chmod 600 yourdomain.key
第四步:验证 CSR(可选,但推荐)
在提交 CSR 之前,请检查它是否包含正确的主体信息和 SAN,并确认其签名有效。以下命令会使用 OpenSSL 在本地解码该请求:
openssl req -noout -text -verify -in yourdomain.csr
请确认 Subject 一行显示的是您的信息,X509v3 Subject Alternative Name 列出了您所期望的每一个主机名,并且签名检查结果显示 verify OK。签名算法应显示为 sha256WithRSAEncryption(如果使用 ECDSA 密钥,则显示为 ecdsa-with-SHA256)。如果您不想使用命令行,也可以将 CSR 粘贴到我们的在线CSR 解码器中,通过浏览器查看相同的字段。
第五步:提交您的 CSR
要复制订单所需的 CSR 内容,请打印其内容:
cat yourdomain.csr
您将看到类似这样的一段文本:
-----BEGIN CERTIFICATE REQUEST-----
MIICyzCCAbMCAQAwTDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQsw...
...(many more lines of base64 characters)...
-----END CERTIFICATE REQUEST-----
请复制整段内容,包括 —–BEGIN CERTIFICATE REQUEST—– 和 —–END CERTIFICATE REQUEST—– 这两行(每个标记两侧各有五个连字符)。这整段内容就是您的 CSR。请在购买时将其粘贴到订单表单中,并将对应的私钥保留在服务器上。
如果您不想使用命令行,也可以使用我们的在线CSR 生成器来创建请求。请注意,它会在您的浏览器中生成私钥,因此请自行保存该密钥并将其转移到服务器上。
在您的 CA 验证完请求后,您将收到证书。根据验证级别的不同,域名验证(DV)通常只需几分钟,而商业验证(OV)和扩展验证(EV)则可能需要长达数个工作日。
第六步:在 lighttpd 上安装证书
当证书送达后,请将颁发的证书及其中间证书链与私钥一起放在服务器上,然后在 TLS 套接字配置块中指向这些文件。在当前版本的 lighttpd 中,TLS 支持位于 mod_openssl 模块中,推荐的格式(自 lighttpd 1.4.53 引入 ssl.privkey 以来)是将证书加证书链放在一个文件中,私钥放在另一个单独的文件中:
server.modules += ( "mod_openssl" )
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/yourdomain.fullchain.pem"
ssl.privkey = "/etc/lighttpd/ssl/yourdomain.key"
}
ssl.pemfile 文件应包含您的证书,后面紧跟中间证书(可以使用 cat yourdomain.crt yourdomain.ca-bundle > yourdomain.fullchain.pem 命令来创建它)。将证书和私钥合并到同一个 ssl.pemfile 文件中的旧式单文件格式,在较老的版本中仍然可用,但分离文件的格式更符合证书颁发机构提供文件的方式,也是官方文档推荐的做法。使用 sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf 测试配置,然后重启 lighttpd 以应用更改。有关完整的操作流程,请参阅我们的在 lighttpd 上安装 SSL 证书指南。


