Назад | Перейти на главную страницу

Chrome err_spdy_protocol_error и Firefox используют spdy без соответствующих заголовков

В Chrome при вызове моей веб-страницы я получаю страницу err_spdy_protocol_error. Кроме того, возникает ошибка подтверждения nginx ssl. Это заставило меня задуматься, почему Chrome использует SPDY для вызова моей страницы и почему он не работает? Кроме того, я заметил, что, хотя страница полностью работает в Firefox, она будет отправлять X-Firefox-Spdy с ответом со значением h2. Я не знаю, почему он использует протокол SPDY и, кроме того, почему он вызывает ошибку в Chrome и Safari.
Вот моя текущая конфигурация nginx, которая служит прокси для экземпляра nginx в контейнере докера:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name MYDOMAIN;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/MYDOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/MYDOMAIN/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_dhparam /etc/letsencrypt/live/MYDOMAIN/dh.pem;
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=86400;" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/MYDOMAIN/chain.pem;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header x-xss-protection "1; mode=block" always;
    location / {
            proxy_pass http://laradock;
    }
}

SSL-сертификат и конфигурация, которые я использую, без проблем работают на нескольких других поддоменах.
Я использую следующий прокси вверх по течению:

proxy_http_version 1.1;
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;
proxy_set_header X-Scheme $scheme;
proxy_set_header Proxy "";
proxy_ssl_trusted_certificate /etc/letsencrypt/live/MYDOMAIN/cert.pem;
proxy_redirect http:// https://;
add_header Front-End-Https on;
upstream laradock {
     server 127.0.0.1:8089 fail_timeout=0;
}
proxy_read_timeout 1800;
proxy_ignore_client_abort on;
proxy_busy_buffers_size 16k;
proxy_headers_hash_max_size 512;
proxy_buffering on;
proxy_cache_bypass $http_pragma $http_authorization $cookie_nocache;
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
client_max_body_size 500M;
client_body_buffer_size 128;
types_hash_max_size 4096;

Эта конфигурация прокси хранится в /etc/nginx/snippets/proxy.conf, который я вручную включил в /etc/nginx/nginx.conf. Моя конфигурация laradock nginx (экземпляр nginx, мой nginx в моей основной системе проксирует все запросы) для обслуживания моих файлов php на этом поддомене:

server {
    listen 80;
    listen [::]:80;
    server_name MYDOMAIN;
    root /var/www/MYDOMAIN/public;
    index index.php;
    location / {
    try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
            try_files $uri $uri/ =404;
            fastcgi_pass php-upstream;
            fastcgi_index index.php;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            #fixes timeouts
            fastcgi_read_timeout 600;
            include fastcgi_params;
    }
    location ~ /\.ht {
            deny all;
    }
    location /.well-known/acme-challenge/ {
            root /var/www/letsencrypt/;
            log_not_found off;
    }
    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

Заметьте, я обслуживаю не laravel, а только обычные файлы php. При вызове страницы через Chrome в моей первой конфигурации nginx (той, которая служит прокси) регистрируется следующая ошибка:

 [crit] 15700#15700: *41339 SSL_do_handshake() failed (SSL: error:1417D18C:SSL routines:tls_process_client_hello:version too low) while SSL handshaking, client: X, server: X

с последующим:

[crit] 15700#15700: *41437 SSL_do_handshake() failed (SSL: error:1417D102:SSL routines:tls_process_client_hello:unsupported protocol) while SSL handshaking, client: X, server: X

В своих файлах php я добавляю к ответу следующие заголовки:

header_remove();
header("Cache-Control: max-age=0,no-cache,must-revalidate");
header('Access-Control-Allow-Origin: https://MYOTHERDOMAIN');
header("Connection: keep-alive");
header('Content-Type: application/json');
header('charset=UTF-8');

Как я могу избавиться от этих ошибок подтверждения ssl и ошибки протокола SPDY в Chrome (или просто полностью отключить SPDY?).
Я знаю, что уже есть много вопросов о возможных причинах ошибок SPDY, но ни один из них мне не помог.