Lets Encypt, Firefox, Peer's Certificate 발급자가 인식되지 않습니다.

Lets Encypt, Firefox, Peer's Certificate 발급자가 인식되지 않습니다.

최근에 TLS 종료를 백엔드 서버에서 역방향 프록시로 다시 옮겼는데 매우 특정한 문제에 직면했습니다.

내 nextcloud 사이트에 연결할 때 Firefox는 다음과 같이 말합니다 SEC_ERROR_UNKNOWN_ISSUER.

오류에 대한 추가 정보(하단의 인증서 정보):

https://nextcloud.domain.com/

Peer’s Certificate issuer is not recognized.


HTTP Strict Transport Security: false

HTTP Public Key Pinning: false

이상한 부분은 이 문제가 다른 브라우저에서는 발생하지 않고 Firefox(Firefox 95, Ubuntu 20.04, Windows 10 및 Android 12, 확장 없음)에서만 발생한다는 것입니다. 처음에 사이트를 탐색한 다음 Firefox를 닫은 다음 다시 열고 nextcloud의 URL을 탐색한 후에만 발생하며 오류가 발생합니다. 불행히도 두 번째 검색에서 오류가 발생하는 것은 정확하지 않지만 Firefox를 다시 시작한 후 두 번째, 세 번째 또는 네 번째 검색에서 오류가 발생합니다. 역방향 프록시에서 nginx를 다시 시작하면 오류를 해결할 수 있습니다.

명확하게 말하자면, Firefox를 다시 시작하면 이를 트리거하는 것으로 보입니다. 탭을 닫았다가 다시 열면 오류가 발생하지 않습니다. 또한 Firefox에서 사이트 데이터를 지우고 다시 시작해도 오류가 계속 발생합니다.

낯선 부분은 인증서 암호화(다른 하위 도메인)를 사용하여 동일한 역방향 프록시에 몇 개의 다른 사이트가 있고 거기에서 오류를 복제할 수 없다는 것입니다. firefox+nextcloud+nginx에만 국한된 것 같습니다. 백엔드 nginx/server를 다시 시작해도 영향을 받지 않습니다. 따라서 내 리버스 프록시에 누락된 특정 구성이 있어야 한다고 가정합니다.

나는 여기서 헤매고 있습니다. 변경된 유일한 것은 TLS가 종료되는 위치와 새로운 Lets Encrypt 인증서입니다. 다행히도 나는 분명한 것을 놓치고 있으며 이것이 더 큰 문제는 아닙니다.

전체 nginx 구성(다른 하위 도메인 및 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;
}

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

중간 인증서:

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

루트 인증서:

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

어떤 것과 관련된 프록시나 서버에 오류가 없습니다. HTTP 요청이 코드 200으로 표시됩니다.

다음은 Lets Encrypt Certbot을 통해 몇 분 간격으로 발급된 두 서버의 두 인증서를 비교한 것입니다.

Firefox에 문제가 있는 인증서는 다음과 같습니다. 잘못된 인증서

Firefox가 허용하는 인증서는 다음과 같습니다. 좋은 인증서

약간 우려되는 문제는 Firefox가 신뢰하지 않는 사이트를 탐색할 때 Chrome에서 동일한 조직에서 발행하지 않은 루트 인증서를 얻는다는 것입니다.

관련 정보