'The change you wanted was rejected' 安装 SSL 证书后所有 'Devise' 操作出错

'The change you wanted was rejected' error on all 'Devise' actions after installing SSL certificate

我将 nginx 配置为使用 SSL 证书(从 sslforfree.com 获得)但之后发生了奇怪的行为。网站 运行 没问题,但我无法执行任何 Devise 操作,例如如果有人在使用 SSL 之前登录,他们将无法注销,其他人也无法 login/register.

我正在 Digital-Ocean 一键 rails droplet 上配置它。 以下观察可能有所帮助:

Nginx.error.log

1 - 客户端在 SSL 握手时关闭连接

2 - SSL_do_handshake() 失败(SSL:error:1408F10B:SSL routines:ssl3_get_record:wrong 版本号) - 我研究并发现它是由于 SSL 配置问题而发生的,我尝试使用 Mozilla 生成的但没有成功。

Rails 服务器日志

1 - 422 无法处理的实体

2 - ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken)

nginx.conf

upstream puma {
  server unix:///home/rails/apps/calwinkle/shared/tmp/sockets/calwinkle-puma.sock;
}

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name calwinkle.com www.calwinkle.com;

  # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
  return 301 https://$host$request_uri;
}

server {
  # listen   80;
  listen 443 ssl default_server;
  listen [::]:443 ssl default_server;

  server_name calwinkle.com www.calwinkle.com;
  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

  # intermediate configuration. tweak to your needs.
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
  ssl_prefer_server_ciphers on;

  root /home/rails/apps/calwinkle/current/public;
  access_log /home/rails/apps/calwinkle/current/log/nginx.access.log;
  error_log /home/rails/apps/calwinkle/current/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  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;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 10M;
  keepalive_timeout 10;
}

我的想法是,不知何故,我的设计控制器仍在尝试使用 http 进行访问,并且我已将所有 http 请求重定向到https 与 301,这导致真实性令牌过期。

我尝试删除重定向并接受 httphttps 但这导致 nginx 配置错误。

鉴于您的情况,您似乎设置错误headers。所以 cookies/sessions 被保存在 http 上。 您可以尝试在 /etc/nginx/sites-available/*/etc/nginx/sites-enabled/*

中添加以下两行吗
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;

之后 运行:

sudo service nginx restart

此外,清除浏览器中的会话和 cookie。

如果您的站点与用户一起使用(我认为没有 https 就不应该),您可能需要销毁现有的用户会话。

希望对您有所帮助。