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

Letsencrypt with Phusion Passenger (Nginx) results in aborted SSL handshake

我正在尝试让 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

这创建了 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 应用程序。剩下要做的唯一一件事就是自动更新证书。

这个指南解决了我所有的问题:)

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04