这几天一直困扰着我,我似乎不知道发生了什么。我设置了一台新服务器(使用灶神星,使用 nginx)。他们有一个内置工具来使用LetsEncrypt,据说这已经奏效了:
...然后是正在编辑的域:
这配置文件文件中的设置如下(并且这些文件确实存在):
ssl_certificate /home/admin/conf/web/ssl.steampj.com.pem;
ssl_certificate_key /home/admin/conf/web/ssl.steampj.com.key;
我在定义位时也遇到了这个问题server {
:
server {
listen 443 ssl;
listen [::]:443 ssl;
重启/重新加载 nginx 时没有出现任何错误。但当你到这里时,你会看到一个错误:https://steampj.com/
我很困惑为什么它不起作用
server {}
以下是该域的完整条件:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name steampj.com www.steampj.com;
root /home/admin/web/steampj.com/public_html;
index index.php index.html index.htm;
access_log /var/log/nginx/domains/steampj.com.log combined;
access_log /var/log/nginx/domains/steampj.com.bytes bytes;
error_log /var/log/nginx/domains/steampj.com.error.log error;
ssl_certificate /home/admin/conf/web/ssl.steampj.com.pem;
ssl_certificate_key /home/admin/conf/web/ssl.steampj.com.key;
location / {
location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
expires max;
}
location ~ [^/]\.php(/|$) {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass 127.0.0.1:9005;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
error_page 403 /error/404.html;
error_page 404 /error/404.html;
error_page 500 502 503 504 /error/50x.html;
location /error/ {
alias /home/admin/web/steampj.com/document_errors/;
}
location ~* "/\.(htaccess|htpasswd)$" {
deny all;
return 404;
}
location /vstats/ {
alias /home/admin/web/steampj.com/stats/;
include /home/admin/web/steampj.com/stats/auth.conf*;
}
include /etc/nginx/conf.d/phpmyadmin.inc*;
include /etc/nginx/conf.d/phppgadmin.inc*;
include /etc/nginx/conf.d/webmail.inc*;
include /home/admin/conf/web/snginx.steampj.com.conf*;
}
我确实想知道是否是防火墙阻止了,但它似乎被设置为打开ufw
:
root@com:~# ufw status
Status: active
To Action From
-- ------ ----
8181 ALLOW Anywhere
443 ALLOW Anywhere
8181 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
进而:
root@com:~# lsof -OnP | grep LISTEN
nginx 2382 root 22u IPv4 95181 0t0 TCP 213.219.38.44:443 (LISTEN)
nginx 2382 root 45u IPv6 264609 0t0 TCP *:443 (LISTEN)
nginx 2637 www-data 22u IPv4 95181 0t0 TCP 213.219.38.44:443 (LISTEN)
nginx 2637 www-data 45u IPv6 264609 0t0 TCP *:443 (LISTEN)
nginx 2638 www-data 22u IPv4 95181 0t0 TCP 213.219.38.44:443 (LISTEN)
nginx 2638 www-data 45u IPv6 264609 0t0 TCP *:443 (LISTEN)
更新2:我设法让 ipv6 的东西与 http 一起运行。它ufw
出于某种原因阻止了端口(禁用它,然后一切正常……这没问题,因为我们有 iptables 和 fail2ban)
但是我仍然无法让它在 ipv4 上与 openssl 或 curl 连接 :/
root@steamdev2:~# curl -Iv4 https://steampj.com/
* Hostname was NOT found in DNS cache
* Trying 213.219.38.44...
* Connected to steampj.com (213.219.38.44) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS Unknown, Unknown (22):
* SSLv3, TLS handshake, Client hello (1):
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Closing connection 0
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
root@steamdev2:~# openssl s_client -connect steampj.com:443
CONNECTED(00000003)
139846633119256:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 315 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
更新 3:我不确定这是否是问题所在,但我注意到我的另一台服务器(几周前设置的)正在使用 nginx1.10.0,而这个新的正在使用1.11.13... 也许有一个错误?
答案1
您的证书似乎运行良好,即使在具有严格策略的 Android 上也是如此。
根据评论:
- 现在几乎所有人都认为该证书没有问题。
- 您仍然会遇到错误。
- LetsEncypt 仍然无法验证它。
我检查了你的SOA
序列号,是2017040741
昨天的,还有你的TTL
设置为 24 小时。问题很可能是你的 DNS 缓存中有错误的 IP 地址递归 DNS 服务器以及 LetsEncrypt 使用的那个。(任何帮助你的人之前都没有缓存过它。)
明天再试。从这里开始,也可以使用更短的时间TTL
,例如21600
6 小时。
更新:昨天证书似乎没有问题,但现在我已经ERR_SSL_PROTOCOL_ERROR
。
通过详细模式curl
我可以看到实际的问题:
curl -v -ipv4 https://steampj.com/
* About to connect() to steampj.com port 443 (#0)
* Trying 213.219.38.44...
* connected
* Connected to steampj.com (213.219.38.44) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
* Closing connection #0
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
通常,当有其他程序在监听 443 端口时,就会出现SSL23_GET_SERVER_HELLO
这种情况。大多数情况下,这种情况发生在 HTTPD 在没有 SSL 的情况下监听 443 端口时,但这次情况并非如此,因为您会得到ERR_INVALID_HTTP_RESPONSE
从http://steampj.com:443/,并且正如 netcat 所示:
nc -v steampj.com 443
DNS fwd/rev mismatch: steampj.com != li1097-44.members.linode.com
steampj.com [213.219.38.44] 443 (https) open
GET / HTTP/1.1
▒▒▒PuTTY
由于您nginx
正在监听端口 443,因此lsof -OnP | grep LISTEN
问题很可能出在 Nginx 配置上。
检查是否有其他
server {}
不必要的部分listen 443
并将其删除。此外,我CApath: /etc/ssl/certs
配置的替代部分也/home/admin/conf/web/
建议了相同的操作。检查你确实有
ipv6only=on
。你有:server { listen 443 ssl; listen [::]:443 ssl;
根据 Nginx ngx_http_core_module 文档指示
listen
:ipv6only=开|关
此参数 (0.7.42) 确定(通过
IPV6_V6ONLY
套接字选项)监听通配符地址的 IPv6 套接字[::]
是否只接受 IPv6 连接或同时接受 IPv6 和 IPv4 连接。此参数默认打开。启动时只能设置一次。尽管默认情况下此选项应为
on
,但您应该查看它是否off
在配置的某处设置,并更新您的两个server {
部分以具有:server { listen 443 ssl; listen [::]:443 ipv6only=on ssl;
on
由于此参数只能在启动时设置一次,因此在配置中将其设置为该参数至关重要,default_server
因为它也会影响所有后续server
设置。
答案2
好吧,这实际上不是一个“答案”,但我已经设法让它发挥作用。
我从头开始,然后重新安装灶神星从头开始:
curl -O http://vestacp.com/pub/vst-install.sh
bash vst-install.sh --nginx yes --apache yes --phpfpm no --named no --remi yes --vsftpd yes --proftpd no --iptables yes --fail2ban yes --quota no --exim yes --dovecot yes --spamassassin yes --clamav yes --mysql yes --postgresql no --hostname com.mysite.com --email [email protected] --password xxx
然后我编辑了 /usr/local/vesta/data/templates/web/nginx/default.tpl,因此它还具有:
listen [%ip%]:%proxy_port% ssl;
(由于某种原因,那里只有 IPv4,不确定为什么)。
然后我进入并设置域名,瞧——它成功了!