DR

DR

Estou batendo a cabeça tentando descobrir um problema 403 apenas com o Chrome. Eu tenho um aplicativo rodando no Tomcat8 e o paro com o Nginx. A máquina está hospedada com um cliente e suspeito que talvez haja algo no ambiente, mas preciso ter algo para voltar a eles.

Posso fazer login no aplicativo. Eu tenho uma página de pesquisa que faz com que algum jquery ajax me chame de API de descanso com a qual obtenho o 403.

No Firefox e no IE tudo funciona bem. Mas no Chrome e no Safari recebo o 403.

Achei que poderia ser algo do CORS, já que estou fazendo uma ligação do ajax. Desativar a segurança da web no Chrome não adiantou nada. Então não estou convencido de que seja isso..

Aqui está minha configuração

Nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;

default_type application/octet-stream;
    include /etc/nginx/proxy_params;
##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

meu servidor.conf

server {
server_name myapp.mydomain.com;
root /var/www/tomcat8/webapps/myapp/;

location / {
index index.html index.jsp;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/;
}


}
server {


listen 80;
server_name myapp.mydomain.com;
return 404; # managed by Certbot


}

Aqui está a entrada de log do nginx para o 403 na minha chamada de serviço

172.16.1.1 - - [19/Jul/2019:16:30:49 -0400] "POST /myap/services/search/lookupUI? HTTP/1.1" 403 0 "https://myapp.mydomain.com/myapp/gui/findpatients.jsp" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"

A chamada de serviço no log do nginx tem uma opção GET e POST. Posso passar um GET na barra de endereço do navegador e funcionará.

Estou sem saber o que isso pode ser. Esta é uma configuração de proxy nginx bastante simples que uso com outros clientes.

Qualquer ajuda seria muito apreciada.

Responder1

DR

Adicione isto ao bloco do servidor com a diretiva proxy_pass

proxy_set_header Origin "";

Processo

Eu tive exatamente o mesmo problema e encontrei sua postagem enquanto pesquisava no Google. Depois de desistir de encontrar uma solução rápida, fiz o seguinte.

Primeiro verifiquei se as solicitações chegaram ao Tomcat. (Eu uso o docker para o Tomcat, então minha interface é docker0. Use ifconfigpara ajudar a descobrir por qual interface suas solicitações estão passando)

Isso mostrará as solicitações em um formato bastante hostil diretamente no terminal

sudo tcpdump -i docker0 -nnSX port 8080

Isso criará um arquivo "dump.pcap" em seu diretório atual que você pode copiar para uma máquina com o Wireshark e visualizá-lo com isso

sudo tcpdump -i docker0 -w dump.pcap port 8080

Percebi que as solicitações estavam indo bem e foi algo que o Tomcat não gostou que as recusou antes mesmo de chegarem ao meu código Java.

Em seguida, usando ferramentas de desenvolvedor no Firefox e no Chrome (ctrl - shift - i), verifiquei as solicitações reais. Vá para a guia "rede" e encontre as solicitações com falha. Procure por "Solicitar cabeçalhos" e clique em "Cabeçalhos brutos" no Firefox ou "Exibir código-fonte" no Chrome e copie-os no bloco de notas ++ ou em algum outro editor que possa classificar as linhas. (Editar -> Operações de linha -> Classificar linhas lexicograficamente)

Para verificar se realmente a diferença nos cabeçalhos causou esse problema, usei o Postman para testar ambos os conjuntos de cabeçalhos em relação ao URL com falha. Há uma função de edição em massa no Postman para cabeçalhos onde você pode simplesmente colar os cabeçalhos.

Aí foi só uma questão de eliminação para descobrir qual cabeçalho causou o erro. Pensei primeiro em alterar meu código Javascript para de alguma forma fazer com que o Chrome não enviasse o cabeçalho Origin, mas achei que seria mais fácil e confiável fazer com que o Nginx removesse os cabeçalhos. Fiz uma rápida pesquisa no Google sobre como fazer isso e aí está.

Espero que isso tenha sido útil!

Responder2

O que acabou funcionando para mim foi adicionar esta diretiva de proxy proxy_set_header Host $http_host;

Também limpei algumas coisas que não eram necessárias Aqui está a configuração resultante

server {
   server_name myapp.mydomain.com;
   root /var/www/tomcat8/webapps/myapp/;

   location / {
    index index.html index.jsp;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:8080/;
   }
   listen 80;

}

informação relacionada