Lets Encypt, Firefox, el emisor del certificado de pares no es reconocido

Lets Encypt, Firefox, el emisor del certificado de pares no es reconocido

Recientemente moví mi terminación TLS a mi proxy inverso desde el servidor backend y me encontré con este problema muy específico.

Al conectarme a mi sitio nextcloud, Firefox dice SEC_ERROR_UNKNOWN_ISSUER.

Más información sobre el error (información del certificado en la parte inferior):

https://nextcloud.domain.com/

Peer’s Certificate issuer is not recognized.


HTTP Strict Transport Security: false

HTTP Public Key Pinning: false

Lo extraño es que este problema no ocurre en ningún otro navegador, solo Firefox (Firefox 95, Ubuntu 20.04, Windows 10 y Android 12; sin extensiones). Solo ocurre después de navegar inicialmente al sitio, luego cerrar Firefox, luego volver a abrirlo y navegar a cualquier URL en nextcloud y se produce el error. Desafortunadamente, no es exacto que el error ocurra en la segunda navegación, pero sucederá ya sea que sea la segunda, tercera o cuarta vez que navega después de reiniciar Firefox. Puedo resolver el error reiniciando nginx en mi proxy inverso.

Para ser claros, parece que el reinicio de Firefox lo activa; cerrar la pestaña y volver a abrirla no produce el error. También intenté borrar los datos del sitio de Firefox y reiniciarlo, pero el error persiste.

La parte más extraña es que tengo un par de sitios más en el mismo proxy inverso que utilizan permite cifrar certificados (subdominio diferente) y no puedo replicar el error allí. Parece estar limitado a Firefox+nextcloud+nginx. Aunque reiniciar el backend nginx/server no lo afecta. Entonces supongo que debería haber una configuración específica que me falta en mi proxy inverso.

Estoy perdido aquí, lo único que ha cambiado es dónde se termina el TLS y un nuevo certificado de Lets Encrypt. Ojalá me esté perdiendo algo obvio y esto no sea un problema mayor.

Configuración completa de nginx (menos otros subdominios y tipos mime):

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

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;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        ##
        # Gzip Settings
        ##

        gzip on;

        # 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/sites-enabled/*;

        ##
        # Hardening
        ##
 
        add_header Allow "GET, POST, HEAD" always;
        add_header X-XSS-Protection "1; mode=block";
}


# configuration file /etc/nginx/snippets/ssl-params.conf:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Download-Options "noopen" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

# configuration file /etc/nginx/sites-enabled/nextcloud.domain.com:
server {
        listen 443 ssl http2;
        ssl_certificate /etc/letsencrypt/live/nextcloud.domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/nextcloud.domain.com/privkey.pem;
        include snippets/ssl-params.conf;
        server_name nextcloud.domain.com;
        location / {
                proxy_pass https://BACKENDIP;
                proxy_set_header X-Real-IP $remote_addr;
        }
}

# configuration file /etc/nginx/sites-enabled/reverseproxy.conf:
server {
        listen 80;
        server_name _;
        return 301 https://$host$request_uri;
}

Alguna información del certificado del servidor a través de Firefox:

Subject Name
Common Name nextcloud.domain.com

Issuer Name
Country US
Organization Let's Encrypt
Common Name R3

Validity
Not Before Fri, 10 Dec 2021 19:29:21 GMT
Not After Thu, 10 Mar 2022 19:29:20 GMT

Certificado intermedio:

Subject Name
Country US
Organization Let's Encrypt
Common Name R3

Issuer Name
Country US
Organization Internet Security Research Group
Common Name ISRG Root X1

Validity
Not Before Fri, 04 Sep 2020 00:00:00 GMT
Not After Mon, 15 Sep 2025 16:00:00 GMT

Certificado raíz:

Subject Name
Country US
Organization Internet Security Research Group
Common Name ISRG Root X1

Issuer Name
Organization Digital Signature Trust Co.
Common Name DST Root CA X3

Validity
Not Before Wed, 20 Jan 2021 19:14:03 GMT
Not After Mon, 30 Sep 2024 18:14:03 GMT

No hay errores en el proxy o servidor asociados con nada. La solicitud HTTP aparece como código 200.

Aquí hay una comparación entre dos certificados en dos de mis servidores que fueron emitidos a través de Lets Encrypt Certbot con minutos de diferencia:

Este es el certificado con el que Firefox tiene un problema: Certificado incorrecto

Este es el certificado que acepta Firefox: Buen certificado

Un problema un poco preocupante es que cuando navego a un sitio en el que Firefox no confía, en Chrome obtengo un certificado raíz que NO es emitido por la misma organización.

información relacionada