首页 文章

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

提问于
浏览
2

我想让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 .

提前致谢

3 回答

  • 0

    我刚刚完成了这项工作并使其正常运行 .

    我注意到的第一件事是你还没有

    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;
    

    ...

    看看这是否适合你 .

  • 1
  • 1

    我写了一个关于设置Nginx和Letsencrypt的完整指南:Automating SSL Certificates using Nginx & Letsencrypt - Without the Catch-22 . 它解决了你在@ Ghoti的回复中提到的确切问题

    这是对你很重要的片段 . 请记住,我使用了letsencrypt.sh客户端而不是官方客户端,原因有很多,我在帖子中谈到了这个原因 .


    我们将把Nginx配置拆分为2个单独的配置文件,一个用于监听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 endpoints ,并启动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 endpoints ,这是所有标准流量被重定向到的地方 .

    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应用程序 . 剩下要做的唯一事情是自动化证书续订 .

相关问题