我尝试在将网站从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
知道我在这里失踪的是什么吗?
答案 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!