Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么不是';使用nginx和自签名SSL证书的t Rails是否有效?_Ruby On Rails_Ssl_Nginx_Self Signed - Fatal编程技术网

Ruby on rails 为什么不是';使用nginx和自签名SSL证书的t Rails是否有效?

Ruby on rails 为什么不是';使用nginx和自签名SSL证书的t Rails是否有效?,ruby-on-rails,ssl,nginx,self-signed,Ruby On Rails,Ssl,Nginx,Self Signed,在通过站点从Heroku迁移到(数字海洋)VPS之前,我正在尝试测试我的SSL设置,因此我根据使用自签名证书 我使用以下命令创建证书,它们位于相应的目录中: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt 以下是my nginx.conf上的服务器块中的相关行: server { listen 80

在通过站点从Heroku迁移到(数字海洋)VPS之前,我正在尝试测试我的SSL设置,因此我根据使用自签名证书

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

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
以下是my nginx.conf上的
服务器
块中的相关行:

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
myu域
(不是实际的域名)及其子域
迁移都是在我的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

知道我在这里遗漏了什么吗?

找到了。首先,我正在通过Capistrano进行部署,我错误地认为这是在部署之后重新启动nginx。事实证明不是这样。所以我需要手动操作。因此,在我的
服务器
块的开头就部署了这个:

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
导致了一个问题。从我所知道的情况来看,这意味着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;
  }
}
由于
production.rb
中的
config.force\u ssl=true
,puma将所有的80个请求重定向到ssl(我相信),这将处理所有的80个请求。Nginx随后将收到一个针对相同URL的https请求,该请求将由该块处理:

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;
  }
}
这似乎工作正常,尽管在收到自签名证书时浏览器中会出现所有适当的警告。我相信,一旦我切换到我的实际证书,我现在将有一个正常运行的ssl设置


再次感谢@doon

防火墙规则?服务器正在侦听
netstat-an
ss-a
,具体取决于linux版本。防火墙处于默认状态,接受所有输入、输出和转发。我假设它正在侦听,因为正常的http请求得到了适当的处理。运行该命令以确保它正在侦听端口443。你在运行代理吗?我看不到它在监听端口443。我是新手,所以我不知道我是否在运行代理,但我对此表示怀疑,因为我或多或少是通过Digital Ocean recipe设置的,我还没有看到任何关于这方面的信息。如何让服务器侦听端口443?
listen 443
行不应该这样做吗?尝试将ssl放入另一个服务器块,配置与端口80相同,为ssl行保存一次,然后重新启动ngninx(您正在重新启动文件更改之间的nginx/droplet,对吗?)。这对我来说很有效,在nginx ssl代理后面有一个Sharetribe。-->代理集头X转发协议https;#重要的!!我相信这告诉puma,通过这个区块发送的所有内容都是https。因此,彪马不再重定向。非常感谢。