使用Phusion Passenger(Nginx)的Letsencrypt导致中止的SSL握手

我试图让Letsencrypt在Ubuntu 15.10服务器上与Phusion Passenger(Nginx)一起工作。

我已经采取的步骤:

  1. sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
  2. sudo service nginx stop
  3. cd /opt/letsencrypt
  4. ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com

这创build了证书,链,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: 使用Nginx和Letsencrypt自动化SSL证书 – 没有Catch-22 。 它解决了你在@ Ghoti的回复中提到的确切问题

这是对你很重要的片段。 请记住,我使用letsencrypt.sh客户端,而不是正式的,由于我在我的帖子中谈到的一些原因。


我们打算把Nginx配置分解成两个独立的配置文件,一个用于letsencrypt监听的HTTP服务器,一个用于运行实际web应用的HTTPS服务器。

然后,我们将它们放在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应用程序。 剩下的唯一事情就是自动化证书更新。