为什么没有nginx和自签名SSL证书的Rails工作?

时间:2016-05-02 17:03:56

标签: ruby-on-rails ssl nginx self-signed

我尝试在将网站从Heroku迁移到(数字海洋)VPS之前测试我的SSL设置,因此我按照these instructions使用自签名证书。< / p>

我使用以下命令创建证书,它们出现在相应的目录中:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

以下是我的nginx.conf上server块的相关行:

server {
  listen 80 default_server;
  listen 443 ssl;
  server_name migration.my_domain.com;
  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

此外,在production.rb中,我使用了以下行:

config.force_ssl = true

my_domain(不是实际的域名)及其子域migration都在我的DNS中设置,并正确指向我服务器的IP地址。目前,当我通过http://migration.my_domain.com页面访问时,会提供服务。但是当我通过https://migration.my_domain.com访问时,我在Chrome中收到错误:

This site can’t be reached

migration.my_domain.com refused to connect.
Try:
Reloading the page
Checking the connection
Checking the proxy and the firewall
ERR_CONNECTION_REFUSED

知道我在这里失踪的是什么吗?

1 个答案:

答案 0 :(得分:1)

想出来。首先,我通过Capistrano进行部署,我错误地认为这是在部署后重新启动nginx。事实证明它没有。所以我需要手动完成。所以在server块的开头部署了这个:

server {
  listen 443 ssl default_server deferred;
  server_name migration.my_domain.com;
  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

部署了这个,但是在重新启动nginx之后,首先得到了Chrome关于自签名证书的警告,并且该网站不可信任(这很好并且是预期的)。在移动过去之后,收到了关于重定向太多的消息。在我的production.rb文件中显示上面的行:

config.force_ssl = true

造成了问题。看到this从我所知道的意思是nginx发送到puma的内容不包含它是否是ssl,所以puma重定向所有,甚至是https请求,因为它只是没有'知道它得到了什么。所以,现在我有两个近似重复的server块。处理http请求的第一个请求具有以下相关陈述:

server {
  listen 80;
  server_name migration.my_domain.com;

  # ...bunch of non-relevant config...

  location @puma {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://puma;
  }
}

由于config.force_ssl = true中的production.rb,这会处理所有80个请求,因为server { listen 443 ssl; server_name migration.my_domain.com; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # ...bunch of non-relevant config... location @puma { proxy_set_header X-Forwarded-Proto https; # IMPORTANT!! I believe this tells puma that everything sent through via this block is https. Thus, puma no longer redirects. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://puma; } } ,puma会将所有请求重定向到ssl(我相信)。然后,Nginx将收到相同URL的https请求,该请求将由此块处理:

<svg width="100" height="100">

  <circle cx="50" cy="50" r="45" fill="white" stroke="red" stroke-width="10" />

  <circle cx="50" cy="50" r="30" stroke="red" stroke-width="10" fill="blue" />

  <!-- <polygon points="50,25 30,80 75,40 25,40 70,70" style="fill:white;"/> -->
  <path fill="#fff" d="m50,25 5,17h18l-14,11 5,17-15-10-15,10 5-17-14-11h18z" />
</svg>

这似乎可以正常工作,尽管在接收自签名证书时应该在浏览器中获得所有适当的警告。我有信心,一旦我切换到我的实际证书,我现在将有一个正常运行的ssl设置。

再次感谢@doon!