我最近开始配置自己的网站(之前没有服务器经验,但在 Linux 上工作了几年),我选择了 NGINX 作为我的网络服务器。它在装有 Raspbian 8(本质上是 Debian Jessie)的 Raspberry Pi 2 上运行。我很快就让常规 http 工作起来了,但 https 很麻烦。我遵循了本教程,除了关于 Let's Encrypt 的部分,因为我使用带有 webroot 的 certbot 来获取我的证书。现在,当我尝试使用其域名或外部 IP 从 Web 浏览器连接到服务器时,我得到了以下信息:
(我用 mywebsite.com 替换了我的实际域名)
铬:
This site can’t provide a secure connection
mywebsite.com uses an unsupported protocol.
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
火狐浏览器:
Unable to Connect Securely
Firefox cannot guarantee the safety of your data on mywebsite.com because
it uses SSLv3, a broken security protocol.
这两个错误都让我相信 NGINX 正在使用 SSLv3,尽管它没有在任何配置文件中指定。我没有修改/etc/nginx/nginx.conf
。根据配置,配置中没有语法错误nginx -t
。
/etc/nginx/sites-enabled/default
:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name mywebsite.com www.mywebsite.com;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
server {
listen 80;
listen [::]:80;
server_name mywebsite.com www.mywebsite.com;
return 301 https://$host$request_uri;
}
有趣的是,当我通过本地地址 192.168.1.64 连接到服务器时,index.html 确实会加载,但(可以理解)浏览器会抱怨证书仅对 mywebsite.com 和 www.mywebsite.com 有效,而不对 192.168.1.64 有效。在我的 DNS 服务器上,我为 mywebsite.com 和 *.mywebsite.com 指定了 A 记录,两者都指向服务器的 IP。我错过了什么?
(这个问题从 Server Fault 移到这里,之前因为偏离主题而被关闭)
答案1
我真傻!我忘了检查我那台老旧的调制解调器上的端口转发设置,所以我访问的是它的控制面板,而不是我的网站。我没有继续浏览浏览器显示的错误,而我应该这样做。不过,他们确实让这变得很困难。
剩下的唯一一个谜团就是 certbot webroot 一开始为什么能工作?我以为它需要打开 443 端口才能工作,但无论如何我还是拿到了 raspi 的钥匙。