我正在尝试let's encrypt
实现并certbot
使用lighttpd
CentOS 6
这是我的主机的完整配置文件
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/letsencrypt/live/mysite.com/web.pem"
ssl.ca-file = "/etc/letsencrypt/live/mysite.com/chain.pem"
server.name = "mysite.com"
server.document-root = "/home/mysite/public_html"
server.errorlog = "/var/log/lighttpd/mysite.com_error.log"
accesslog.filename = "/var/log/lighttpd/mysite.com_access.log"
ssl.cipher-list = "ECDHE-RSA-CHACHA20-POLY1305 ECDHE-ECDSA-CHACHA20-POLY1305 AES128+EECDH:AES128+EDH:!aNULL:!eNULL"
ssl.honor-cipher-order = "enable"
ssl.disable-client-renegotiation = "enable"
ssl.use-sslv2= "disable"
ssl.use-sslv3 = "disable"
}
$HTTP["scheme"] == "http" {
$HTTP["host"] =~ "^(www.)?mysite.com$" {
server_name = "mysite.com"
server.document-root = "/home/mysite/public_html"
accesslog.filename = "/home/mysite/logs/access.log"
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/var/run/lighttpd/php-fpm.socket.mysite"
)
)
)
url.rewrite-once = (
# Exclude some directories from rewriting
"^/(\.well-known|wp-admin|wp-includes|wp-content|phpmyadmin)/(.*)" => "$0",
# Exclude .php files at root from rewriting
"^/(.*.php)" => "$0",
# Handle search correctly
"^/(.*)?(?s=)(.*)$" => "/search/$3",
# Handle permalinks and feeds
"^/(.*)$" => "/index.php/$1",
"^/?$" => "/index.php",
)
alias.url = ("/phpmyadmin" => "/usr/share/phpmyadmin/")
}
}
所以我遇到的第一个问题是,当我尝试访问时,https:// mysite.com
我得到的内容没有图像和样式,所以这是一个 URL 重写问题,但我没有看到 https 已启用。浏览器仍然会警告我网站不安全。
第二个问题是当我添加时url.redirect = (".*" => "https://%0$0")
出现太多重定向错误。
所以我很困惑。我认为问题可能出在重写上,但奇怪的是我甚至没有启用 https。
PS 是的,我在certbot
这一切之前就收到了成功的消息。
解决方案就是安装 WP 插件,它会将我所有的 http 链接转换为图像,并将样式转换为 https,现在它可以正常工作了。@mrkoopie 的回答帮助我以这种方式思考解决方案,所以我接受了它。
答案1
好消息是,如果您通过 HTTPS 访问网站时没有出现证书错误,则您的服务器配置正确。坏消息是,您的网站配置不正确。
实际情况是 HTML 内容通过 HTTPS 加载。到目前为止,一切都很好,也很安全。但问题在于,HTML 内容所引用的对象(例如图像、css 和 js)是通过 HTTP 而不是 HTTPS 引用的。这很糟糕,因为当 HTML 代码通过 HTTPS 加载时,浏览器不会下载任何未加密的文件。
要解决此问题,请确保您的网站引用每个文件时都使用 HTTPS。在 WordPress 中,这可以轻松完成,但是您没有提供您使用的是什么系统,并且每个系统的情况都不同。
那么,当 HTML 代码通过 HTTPS 加载时,为什么通过 HTTP 加载对象是不好的呢?事实上,您使用 HTTPS 意味着您希望安全地加载内容。主要目的是确保没有人能够更改或查看内容。如果您通过 HTTP 加载任何对象,它很容易受到恶意注入的攻击,任何人都可以看到正在加载的内容(假设他们可以获得您的流量)。由于这会大大降低安全性,因此当 HTML 内容通过 HTTPS 加载时,浏览器会忽略 HTTP 引用的任何对象。配置您的服务器以将 http 流量重定向到 https 是行不通的,因为浏览器无论如何都不会尝试加载对象。
希望这可以帮助。
答案2
笔记:
CentOS 7 和 8 的 lighttpd 使用不同的 lighttpd 配置文件结构(
conf.d
目录和modules.conf
)。CentOS 6 具有旧版 OpenSSL,由于 OpenSSL 安全漏洞,该版本无法正常工作。您可能需要将服务器升级到 CentOS7/8 并使用最新的 OpenSSL 来支持 TLS 1.3 版本。
确保您已经在 CentOS 7/8 Linux 服务器上安装了 lighttpd 和 certbot,并且最新版本如下所列(截至 2021 年 1 月)。
lighttpd/1.4.55 (ssl) OpenSSL 1.1.1g FIPS 21 Apr 2020 certbot 1.11.0
以下是与 lighttpd、Wordpress 和 certbot 配合良好的更新详细信息:
在你的 Linux 中,运行:
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
启用/添加
mod_openssl
并mod_setenv
server.modules
/etc/lighttpd/modules.conf
跑步
certbot certonly --webroot -w /home/website -d domain.com
(将 domain.com 替换为您的域名)
输出:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/domain.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/domain.com/privkey.pem Your cert will expire on 2021-01-16. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run certbot renew
添加
certbot renew
到 cronjob 并每月运行一次。
lighttpd.conf
SSL指令$HTTP["host"] =~ "domain\.com$" { server.document-root = "/home/website" url.rewrite = ( "^/(.*)\.(.+)$" => "$0", "^/(phpMyAdmin)/?(.*)" => "$0", "^/(.+)/?$" => "/index.php/$1" ) url.access-deny = ( "~", "xmlrpc.php") server.error-handler-404 = "/index.php" dir-listing.activate = "disable" } $SERVER["socket"] == ":80" { $HTTP["host"] =~ "(.*)" { url.redirect = ( "^/(.*)" => "https://%1/$1" ) } } $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" ssl.disable-client-renegotiation = "enable" ssl.privkey = "/etc/letsencrypt/live/domain.com/privkey.pem" ssl.pemfile = "/etc/letsencrypt/live/domain.com/fullchain.pem" $HTTP["host"] =~ "domain\.com$" { ssl.privkey = "/etc/letsencrypt/live/domain.com/privkey.pem" ssl.pemfile = "/etc/letsencrypt/live/domain.com/fullchain.pem" } ssl.dh-file = "/etc/ssl/certs/dhparam.pem" # ECDH/ECDHE ciphers curve strength ssl.ec-curve = "secp384r1" ssl.use-compression = "disable" # Environment flag for HTTPS enabled setenv.add-environment = ( "HTTPS" => "on" ) ssl.use-sslv2 = "disable" ssl.use-sslv3 = "disable" ssl.openssl.ssl-conf-cmd = ("Protocol" => "-TLSv1.1, -TLSv1, -SSLv3") ssl.honor-cipher-order = "disable" ssl.cipher-list = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 :ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384" # HSTS(15768000 seconds = 6 months) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; ") } $HTTP["host"] =~ "domain\.com$" { url.rewrite = ( "^/(.*)\.(.+)$" => "$0", "^/(phpMyAdmin)/?(.*)" => "$0", "^/(.+)/?$" => "/index.php/$1" ) url.access-deny = ( "~", "xmlrpc.php") server.error-handler-404 = "/index.php" dir-listing.activate = "disable" } } ## end zone - $SERVER["socket"] == "0.0.0.0:443"
然后重新启动你的lighttpd服务器。
SSL 服务器测试 https://www.ssllabs.com/ssltest/index.html 并输入您的域名。上面的 SSL 指令将使您的网站在 SSL 测试中获得 A+ 分数。