使用 Phusion Passenger (Nginx) 的 Letsencrypt 导致 SSL 握手中止
Letsencrypt with Phusion Passenger (Nginx) results in aborted SSL handshake
我正在尝试让 Letsencrypt 在 Ubuntu 15.10 服务器上与 Phusion Passenger (Nginx) 一起工作。
我采取的步骤:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
sudo service nginx stop
cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone -d example.com -d www.example.com
这创建了 cert、chain、fullchain 和 privkey pem 文件。
然后我用以下内容编辑了我的 /etc/nginx/sites-available/example.conf:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
root /home/myuser/example/public;
passenger_enabled on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# File upload size:
client_max_body_size 7M;
location ~ ^/(assets)/ {
expires max;
add_header Cache-Control public;
gzip_static on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
然后我重新启动了nginx。当我现在 运行 curl -iv https://example.com
我收到以下回复:
* Rebuilt URL to: https://example.com/
* Trying xxx.xx.xx.xx...
* Connected to example.com (xxx.xx.xx.xx) port 443 (#0)
* Server aborted the SSL handshake
* Closing connection 0
curl: (35) Server aborted the SSL handshake
端口 80 和 443 已打开:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN`
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
我是不是做错了什么?我现在基本上已经让我的服务器无法访问了。非常感谢任何帮助。如果有帮助,我正在使用 Passenger 版本 5.0.23。
提前致谢
我刚刚完成并开始工作。
我注意到的第一件事是你还没有
ssl on;
我做的另一件事是按照 https://adambard.com/blog/using-letsencrypt-with-nginx/
中的说明进行操作
他的配置远不如你,例如
server {
listen 0.0.0.0:443 ssl; # was 80, added ssl
server_name example.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
...
看看这是否适合你。
我写了一份关于设置 Nginx 和 Letsencrypt 的完整指南:
Automating SSL Certificates using Nginx & Letsencrypt - Without the Catch-22 。它解决了您在@Ghoti 的回复中提到的确切问题
这是对您重要的片段。请记住,我使用的是 letsencrypt.sh 客户端而不是官方客户端,原因有很多,我在 post 中谈到过。
我们将把 Nginx 配置分成 2 个独立的配置文件,一个用于 letsencrypt 侦听的 HTTP 服务器,一个用于 HTTPS 服务器 运行 实际的 Web 应用程序。
然后我们会将它们都放在 sites-available
文件夹中,而不是标准的 sites-enabled
文件夹中。默认情况下,sites-enabled
文件夹中的任何配置文件都会在 Nginx 重新启动时自动解析,但是我们想要控制它,我们将通过创建符号链接来实现。
HTTP Nginx 配置文件位于:/etc/nginx/sites-available/http.example.conf
,看起来像:
# HTTP server
server {
listen 80;
server_name www.example.com;
access_log /var/log/nginx/http.example.com.log;
location '/.well-known/acme-challenge' {
default_type "text/plain";
alias /var/www/letsencrypt;
}
location / {
return 301 https://$server_name$request_uri;
}
}
HTTPS Nginx 配置文件将位于 /etc/nginx/sites-available/https.example.conf
,如下所示:
# HTTPS
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate /srv/letsencrypt/certs/www.example.com/fullchain.pem;
ssl_certificate_key /srv/letsencrypt/certs/www.example.com/privkey.pem;
#Include actual web application configuration here.
}
控制 Nginx
在我们做任何事情之前,我们需要先停止 运行 Nginx 服务。
service nginx stop
然后我们需要通过创建从 sites-available
文件到 sites-enabled
文件夹的符号链接来启用 http 端点,并启动 Nginx 服务
echo "Enable the http endpoint"
ln -s /etc/nginx/sites-available/http.example.conf /etc/nginx/sites-enabled/http.example.conf
echo "Starting nginx service..."
service nginx start
此时我们有一个工作的 HTTP 服务器,它将正确地提供 acme-challenge
文件夹中的任何文件。让我们生成一些证书。
echo "Generate Letsencrypt SSL certificates"
/srv/letsencrypt/letsencrypt.sh --cron
Letsencrypt.sh 成功生成证书后,我们必须启用我们的 HTTPS 端点,这是所有标准流量被重定向到的地方。
echo "Enable the https endpoint"
ln -s /etc/nginx/sites-available/https.example.conf /etc/nginx/sites-enabled/https.example.conf
最后,我们需要告诉 Nginx 加载 HTTPS 服务器配置,但我们希望在不停机的情况下执行此操作。值得庆幸的是,Nginx 开发人员为我们提供了一种方法来做到这一点。
echo "Reload nginx service..."
service nginx reload
现在我们有一个可用的启用 HTTPS 的 Web 应用程序。剩下要做的唯一一件事就是自动更新证书。
这个指南解决了我所有的问题:)
我正在尝试让 Letsencrypt 在 Ubuntu 15.10 服务器上与 Phusion Passenger (Nginx) 一起工作。
我采取的步骤:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
sudo service nginx stop
cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone -d example.com -d www.example.com
这创建了 cert、chain、fullchain 和 privkey pem 文件。 然后我用以下内容编辑了我的 /etc/nginx/sites-available/example.conf:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
root /home/myuser/example/public;
passenger_enabled on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# File upload size:
client_max_body_size 7M;
location ~ ^/(assets)/ {
expires max;
add_header Cache-Control public;
gzip_static on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
然后我重新启动了nginx。当我现在 运行 curl -iv https://example.com
我收到以下回复:
* Rebuilt URL to: https://example.com/
* Trying xxx.xx.xx.xx...
* Connected to example.com (xxx.xx.xx.xx) port 443 (#0)
* Server aborted the SSL handshake
* Closing connection 0
curl: (35) Server aborted the SSL handshake
端口 80 和 443 已打开:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN`
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
我是不是做错了什么?我现在基本上已经让我的服务器无法访问了。非常感谢任何帮助。如果有帮助,我正在使用 Passenger 版本 5.0.23。
提前致谢
我刚刚完成并开始工作。
我注意到的第一件事是你还没有
ssl on;
我做的另一件事是按照 https://adambard.com/blog/using-letsencrypt-with-nginx/
中的说明进行操作他的配置远不如你,例如
server {
listen 0.0.0.0:443 ssl; # was 80, added ssl
server_name example.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
...
看看这是否适合你。
我写了一份关于设置 Nginx 和 Letsencrypt 的完整指南: Automating SSL Certificates using Nginx & Letsencrypt - Without the Catch-22 。它解决了您在@Ghoti 的回复中提到的确切问题
这是对您重要的片段。请记住,我使用的是 letsencrypt.sh 客户端而不是官方客户端,原因有很多,我在 post 中谈到过。
我们将把 Nginx 配置分成 2 个独立的配置文件,一个用于 letsencrypt 侦听的 HTTP 服务器,一个用于 HTTPS 服务器 运行 实际的 Web 应用程序。
然后我们会将它们都放在 sites-available
文件夹中,而不是标准的 sites-enabled
文件夹中。默认情况下,sites-enabled
文件夹中的任何配置文件都会在 Nginx 重新启动时自动解析,但是我们想要控制它,我们将通过创建符号链接来实现。
HTTP Nginx 配置文件位于:/etc/nginx/sites-available/http.example.conf
,看起来像:
# HTTP server
server {
listen 80;
server_name www.example.com;
access_log /var/log/nginx/http.example.com.log;
location '/.well-known/acme-challenge' {
default_type "text/plain";
alias /var/www/letsencrypt;
}
location / {
return 301 https://$server_name$request_uri;
}
}
HTTPS Nginx 配置文件将位于 /etc/nginx/sites-available/https.example.conf
,如下所示:
# HTTPS
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate /srv/letsencrypt/certs/www.example.com/fullchain.pem;
ssl_certificate_key /srv/letsencrypt/certs/www.example.com/privkey.pem;
#Include actual web application configuration here.
}
控制 Nginx
在我们做任何事情之前,我们需要先停止 运行 Nginx 服务。
service nginx stop
然后我们需要通过创建从 sites-available
文件到 sites-enabled
文件夹的符号链接来启用 http 端点,并启动 Nginx 服务
echo "Enable the http endpoint"
ln -s /etc/nginx/sites-available/http.example.conf /etc/nginx/sites-enabled/http.example.conf
echo "Starting nginx service..."
service nginx start
此时我们有一个工作的 HTTP 服务器,它将正确地提供 acme-challenge
文件夹中的任何文件。让我们生成一些证书。
echo "Generate Letsencrypt SSL certificates"
/srv/letsencrypt/letsencrypt.sh --cron
Letsencrypt.sh 成功生成证书后,我们必须启用我们的 HTTPS 端点,这是所有标准流量被重定向到的地方。
echo "Enable the https endpoint"
ln -s /etc/nginx/sites-available/https.example.conf /etc/nginx/sites-enabled/https.example.conf
最后,我们需要告诉 Nginx 加载 HTTPS 服务器配置,但我们希望在不停机的情况下执行此操作。值得庆幸的是,Nginx 开发人员为我们提供了一种方法来做到这一点。
echo "Reload nginx service..."
service nginx reload
现在我们有一个可用的启用 HTTPS 的 Web 应用程序。剩下要做的唯一一件事就是自动更新证书。
这个指南解决了我所有的问题:)