NGINX BoringSSl HTTP3 ERR_CONNECTION_REFUSED

NGINX BoringSSl HTTP3 ERR_CONNECTION_REFUSED

EinERR_CONNECTION_REFUSEDFehler tritt in Google Chrome v.120 auf, wenn versucht wird, HTTP/3 über Nginx 1.25.3 + BoringSSL zu nutzen. Es werden keine Fehler oder Debugmeldungen in den Protokollen gefunden, während nginx-debug eingeschaltet ist, http2 funktioniert gut mit dieser Konfiguration undhttps://cloudflare-quic.com/sagt, dass HTTP/3 vom Browser verwendet werden kann.

/etc/nginx/nginx.conf:

user  www-data;
worker_processes  1;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    types_hash_max_size 2048;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    

    ##
    # Access/Error Log Settings
    ##

    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;
    error_log /var/log/nginx/error.log;

    ##
    # SSL Configuration
    ##

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


    ##
    # FastCGI Cache Settings
    ##

    fastcgi_cache_path /etc/nginx-cache levels=1:2 keys_zone=phpcache:100m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_ignore_headers Cache-Control Expires;

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

/etc/nginx/sites-enabled/website.conf:

server {
  server_name website.site;

  root /var/www/website/public_html/develop;
  index index.html;

  listen 443 quic reuseport;
  listen 443 ssl;

  http2 on;
  http3 on;

  quic_retry on;
  ssl_early_data on;

  add_header alt-svc 'h3=":443"; quic=":443"; ma=2592000;';

  ssl_protocols TLSv1.3;  

  ssl_certificate /etc/ssl/website.site.pem;
  ssl_certificate_key /etc/ssl/website.site-key.pem;
}

Aktualisierung:Ein weiteres interessantes Verhalten, das mir aufgefallen ist, ist, dass die Verbindung zu einem anderen verfügbaren Nginx-Vhost umgeleitet wird (es sieht so aus, als ob das Abhören ignoriert wird, wenn der Quiche-Dienst verwendet wird).

Meine Lösung:Das Problem bestand darin, dass Google Chrome nicht zum HTTP/3-Protokoll wechselte, wenn das Zertifikat nicht öffentlich vertrauenswürdig war (die Lösung wurde gefundenHier). Die hier beschriebenen möglichen Ursachen helfen jedoch bei der Behebung anderer Fehler

Antwort1

Ihr Webbrowser stellt zunächst eine http/1- oder eine http/2-Verbindung her. Sie müssen also zwei Listen-Anweisungen beibehalten. Sie sollten die Kommentare entfernen:

    # listen 443 ssl http2;

und ersetzen durch:

    listen 443 ssl;
    http2 on;

da http2 in der Listen-Direktive nicht mehr akzeptiert wird. Es handelt sich um eine neue Direktive, die standardmäßig deaktiviert ist, siehehttps://nginx.org/en/docs/http/ngx_http_v2_module.html#http2

Syntax: http2 on | off;
Default:    
http2 off;
Context:    http, server
This directive appeared in version 1.25.1.

Undhttps://nginx.org/en/docs/http/ngx_http_core_module.html#listen

"The parameter is deprecated, the http2 directive should be used instead."

Siehe auch dieses funktionierende Beispiel unterhttps://nginx.org/en/docs/quic.html#example

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

    access_log logs/access.log quic;

    server {
        # for better compatibility it's recommended
        # to use the same port for quic and https
        listen 8443 quic reuseport;
        listen 8443 ssl;

        ssl_certificate     certs/example.com.crt;
        ssl_certificate_key certs/example.com.key;

        location / {
            # required for browsers to direct them to quic port
            add_header Alt-Svc 'h3=":8443"; ma=86400';
        }
    }
}

Antwort2

Ich habe eine Beispielkonfiguration gefunden und Sie benötigen noch einige weitere Dinge im vhost

server{
    listen 443 http3 quic reuseport;
    listen 443 ssl http2;

    quic_retry on;
    ssl_early_data on;

    http3_max_field_size 5000;
    http3_max_table_capacity 50;
    http3_max_blocked_streams 30;
    http3_max_concurrent_pushes 30;
    http3_push 10;
    http3_push_preload on;

    add_header alt-svc '$quic=":443"; ma=3600';
index index.html index.nginx-debian.html;
    server_name yourdomain.com www.yourdomain.com

    root /var/www/yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
}
server{
    if ($host = http3.codefaq.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;

    server_name yourdomain.com;
    return 404; # managed by Certbot


}

Siehe hierhttps://codefaq.org/server/wie-installiere-http-3-quic-auf-nginx-server-für-ubuntu/#adding-boringssl-und-http3

verwandte Informationen