我正在尝试从头开始在 lighttpd 上设置 letsencrypt。我目前在 16.10 xenial 上运行 lighttpd,并希望将现有网站从 http 移至 https。我知道 Apache 和 ngnix 有一个自动设置过程,但我不愿意将所有内容移至 https。我有六个主机名,分布在一对使用虚拟主机托管的域上,每个主机都有单独的块。
我该如何做呢?
答案1
大多数工具都支持“哑网络服务器”模式,在该模式中,它们在目录中提供需要由网络服务器提供的文件/.well-known/acme-challenge/
。
也可以使用某些动态语言(lua、php、...:连接请求文件名'.'
和公钥哈希)来生成该内容
答案2
这需要一些反复试验,并将来自多个来源的信息整合在一起。
你可能希望根据自己的需要做一些不同的事情。在这种情况下,我没有完成了一些人们包括的事情,还有一些事情是可选的。
我从这个开始指导并且分歧很大
如果你想生成自己的 ssl.dh 文件现在做。这是可选的,需要一段时间
cd /etc/ssl/certs
然后
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
速度很慢,有点多余
openssl dhparam -dsaparam -out etc/ssl/certs/dhparam.pem
快很多
接下来,按照以下说明安装 letsencrypt 的 certbot指示
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
生成证书。我选择为“example.com”域中的所有主机都生成一个证书,并为“example.org”生成一个单独的证书。
certbot 使用你的 Web 服务器端口,因此关闭首先是你的 lighttpd 实例
生成证书只需运行
certbot certonly --standalone -d example.org
用于一个域名和
certbot certonly --standalone -d example.com -d chat.example.com
证书中的多个域名(最多 20 个)。
lighttpd 需要一个 pem 文件,而 letsencrypt 需要一对(最初!),因此您需要合并它们。转到cd /etc/letsencrypt/live/
每个文件夹并运行cat privkey.pem cert.pem > ssl.pem
为了我们的目的,我们假设您在“/etc/letsencrypt/live/chat.example.com/”和“/etc/letsencrypt/live/example.org/”中有文件
为了测试目的,我们假设您希望将其中一个证书作为默认证书,并且您希望保持端口 80 可用以进行测试,以查看服务器是否以您的更改启动。
添加区块阅读
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/letsencrypt/live/chat.example.com/ssl.pem"
ssl.ca-file = "/etc/letsencrypt/live/chat.example.com/fullchain.pem"
}
您可以稍后替换它,这是最低限度,可让您与 http 一起运行 https。
任何没有明确设置连接到 https 的主机都将使用这些证书。这是一组可行且最小的测试设置。
启动lighttpd并测试。
现在,如果你严肃的您可能需要更多设置,例如使用我们讨论过的 ssl.dh 设置,并且您花了两个小时在开始时生成一个 dhparam.pem 文件。您可以用类似这样的内容替换刚刚添加的块 - 这作为整个服务器的默认设置。
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/letsencrypt/live/chat.example.com/ssl.pem"
ssl.ca-file = "/etc/letsencrypt/live/chat.example.com/fullchain.pem"
ssl.dh-file = "/etc/ssl/certs/jmg2dhparam.pem"
ssl.ec-curve = "secp384r1"
ssl.honor-cipher-order = "enable"
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
ssl.use-compression = "disable"
}
$HTTP["scheme"] == "http" {
# capture vhost name with regex conditiona -> %0 in redirect pattern
# must be the most inner block to the redirect rule
$HTTP["host"] =~ ".*" {
url.redirect = (".*" => "https://%0$0")
}
}
它使用更全面的设置(根据个人喜好进行调整)来实现 HTTPS,并将任何 HTTP 连接重定向到 HTTPS。
如果您想要具有不同密钥集的域,您可以在主机块中覆盖这些设置。
$HTTP["host"] =~ "(^|\.)example\.org$" {
server.document-root = "/var/www/example"
server.errorlog = "/var/log/lighttpd/example/error.log"
accesslog.filename = "/var/log/lighttpd/example/access.log"
server.error-handler-404 = "/e404.php"
ssl.pemfile = "/etc/letsencrypt/live/example.org/ssl.pem"
ssl.ca-file = "/etc/letsencrypt/live/example.org/fullchain.pem"
}
重新启动服务器,进行测试以确保端口 80 不可连接,并且 https 可以连接,这样就没问题了。