如何让SSL与Rails,AWS Elastic Beanstalk和Cloudflare一起工作

我有一个托管在使用Ruby on Rails构建的Elastic Beanstalk上的网站。 我设置了Cloudflare来配置DNS并提供CDN。 Cloudflare还提供SSL。

我无法使用SSL与我的应用程序一起工作。

将Cloudflare的SSL设置为“灵活”,我可以加载我的主页面,但是当我尝试登录时,出现这些错误(为简洁起见):

INFO -- :  Started POST "/users/sign_in" for xxx.xxx.146.132 at 2018-03-19 16:45:24 +0000
INFO -- :  Processing by Users::SessionsController#create as HTML
INFO -- :    Parameters: {"utf8"=>"✓", "authenticity_token"=>"f92CTIe5qlp7C624DZzZM2oWdFMcq6PhyfOJI16saV32yugMmJlenL/F3gTeBBsAjaAw92P1vncWBzI+JnK8wA==", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]"}, "commit"=>"Log in"}
WARN -- :  HTTP Origin header (https://[MY_URL].com) didn't match request.base_url (http://[MY_URL].com)
INFO -- :  Completed 401 Unauthorized in 1ms (ActiveRecord: 0.0ms)  
FATAL -- :  ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

如果我将Cloudflare的SSL设置为“完整”,则会在Cloudflare生成的页面中看到502错误(请参阅图像)。

在这里输入图像描述

我遇到了这个网站(http://til.obiefernandez.com/posts/875a2a69af-cloudflare-flexible-ssl-mode-breaks-rails-5-csrf),这似乎有完全相同的问题,但设置为“完整”没有帮助我。

我试过在/config/environments/production.rb中设置config.force_ssl = true 。 该设置不允许访问该网站。 只显示Cloudflare中的同一个502错误页面,而我的生产或nginx日志中没有任何内容。

我试过用自定义的nginx配置搞乱,但没有得到任何地方。 这是我最近的nginx配置尝试:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    index   index.html index.htm;

    server {
        listen       80 ;
        listen       [::]:80 ;
        server_name  localhost;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;


        location / {
          proxy_pass        http://localhost;
          proxy_set_header  Host $host;
          proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header  X-Forwarded-Proto $scheme;
          proxy_set_header  X-Forwarded-Ssl on; # Optional
          proxy_set_header  X-Forwarded-Port $server_port;
          proxy_set_header  X-Forwarded-Host $host;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

谁能帮忙? 我确信我在这里错过了一些明显的东西。


502错误 :此错误表示Cloudfare服务器无法读取您的Rails服务器发送的响应,基本上,当您选择Full SSL ,Cloudflare预计响应位于SSL中,但此处Rails应用程序会发送非SSL(HTTP) Cloudflare无法阅读的回复。

我读过你分享的文章,看起来像Rails不允许出于安全考虑使用灵活的SSL。

灵活的SSLflexible SSL您不需要使用SSL证书(HTTPS)来保护您的Rails应用程序,但您的访问者仍然将该网站视为启用了HTTPS。

灵活的SSL:访问者和Cloudflare之间的安全连接,但Cloudflare和您的Web服务器之间没有安全连接。 您不需要在Web服务器上拥有SSL证书,但访问者仍然将该网站视为启用了HTTPS。

完整的SSL
正如文章中提到的,如果您启用了Full SSL ,那么您需要配置rails config.force_ssl = true以使用自签名SSL证书,或者您可以免费获得来自letsencrypt的证书,一旦您确实需要更改Nginx在HTTPS端口443上运行。这应该修复502错误。

这里是关于在Ruby on Rails中使用HTTP的教程

完全SSL:访问者和Cloudflare之间的安全连接,以及Cloudflare和您的Web服务器之间的安全连接(但未经过身份验证)。 您至少需要将您的服务器配置为应答HTTPS连接,并至少使用自签名证书。

图片来源

链接地址: http://www.djcxy.com/p/5567.html

上一篇: How to get SSL working with Rails, AWS Elastic Beanstalk and Cloudflare

下一篇: Nginx + Rails, Default url not working