Como posso servir apenas https usando o passageiro 2.2.9, nginx 0.7.65 e sinatra 0.94?

3

Estou tentando implantar um site com apenas acesso https, sem acesso http. Tenho certeza de que estou sentindo falta de uma linha simples em um arquivo de configuração.

Como o título diz, é o Sinatra 0.9.4 no nginx 0.7.65 através do passageiro 2.2.9.

O principal arquivo ruby para o serviço Sinatra possui:

require 'ssl_requirement'

def ssl_required?
  true
end

config.ru tem (embora eu não tenho certeza se é relevante):

require 'rubygems'
require 'sinatra'
require 'app.rb'

set :environment, :production
run Sinatra::Application

O arquivo nginx.conf se parece com:

 worker_processes  1;


 events {
   worker_connections  1024;
 }


 http {
   passenger_root /var/lib/gems/1.8/gems/passenger-2.2.9;
   passenger_ruby /usr/bin/ruby1.8;

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


   # HTTPS server
   #
   server {
     listen       80;
     listen       443;
     server_name  an.internal.ip.address;
     root         /my/app/dir/public;
     passenger_enabled on;

     proxy_set_header X_FORWARDED_PROTO https;

     ssl                  on;
     ssl_certificate      /my/app/dir/certificate.pem;
     ssl_certificate_key      /my/app/dir/privkey.pem;

     ssl_session_timeout  5m;

     ssl_protocols  SSLv2 SSLv3 TLSv1;
     ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
     ssl_prefer_server_ciphers   on;

   }

 }

Em vez de redirecionar todas as solicitações de http para https, recebo o erro:

The plain HTTP request was sent to HTTPS port

Como posso consertar isso? Os pedidos de https para o link funcionam bem.

(isso também acontece com nginx-0.6.36, pelo que vale a pena).

Não tenho certeza se isso deve ser marcado com Sinatra, mas ainda não tenho representação suficiente para isso.

    
por mmr 09.02.2010 / 04:52

1 resposta

1

se você digitar o link , o navegador envia uma solicitação de texto sem formatação ao servidor na porta 80. ao passo que, se você digitar link ele enviará uma solicitação criptografada para a porta 443. o que você está fazendo é enviar um texto sem formatação para https, portanto o servidor da Web espera ser criptografado, mas fica simples.

funcionaria se você fizesse link , então o webrowser sabe que precisa criptografar, mas envia para 80. Eu duvido que você possa espere isso dos usuários.

o que você quer é aceitar tráfego não criptografado em 80 e apenas http redirecionar todas as solicitações para 443. em nginx:

server {
  listen server_ip:80;
  server_name server_name;
  location / {
    rewrite ^/(.*) https://server_name permanent;
  }
}
    
por 09.02.2010 / 07:09