Safari는 개인 루트 CA 인증서를 사용하지 않습니다.

Safari는 개인 루트 CA 인증서를 사용하지 않습니다.

개인 루트 CA를 만들고 일부 https 웹사이트에 대해 일부 SSL 인증서를 발급했습니다.

(이것을 자체 서명된 인증서라고 불러야 할지 잘 모르겠습니다. 제 경우에는 루트 CA 인증서가 자체 서명되어 있지만 루트 CA에서 발급된 웹 사이트의 SSL 인증서는 자체 서명되지 않습니다. 이로 인해 어떻게 해야 할지 혼란스럽습니다. Google 검색 키워드를 선택하세요).

이러한 https 웹사이트는 Chrome, Firefox에서는 잘 작동하지만 Safari에서는 잘 작동하지 않습니다. (물론 Chrome과 Firefox에서는 보안 경고가 표시되지만 계속해서 볼 수 있는 기회가 제공되지만 Safari에서는 보안 경고가 완전히 표시되지 않습니다.)

요점은 내 웹사이트가 인증서 체인 파일을 제공한다는 것입니다.

The website certificate... +
The root CA certificate...

, Chrome과 Firefox는 인증서 체인 파일에서 루트 CA를 지능적으로 찾을 수 있지만 Safari는 그렇지 않습니다..

Safari에서 오류가 보고되었습니다.

Safari에서 페이지를 열 수 없음 – Safari가 'servername' 서버와 보안 연결을 설정할 수 없기 때문에 Safari에서 페이지를 열 수 없습니다.

  • 물론 루트 CA 인증서를 Mac의 키체인으로 미리 가져올 수 있으며 Safari는 경고 메시지 없이도 잘 작동할 것입니다. 하지만 그건 내가 원하는 것이 아니기 때문에 사용자에게 그런 수동적인 작업을 요구할 수는 없습니다.

  • 실제 자체 서명 SSL 인증서(상위 CA 없이)를 생성하면 Safari에서 사이트를 볼 수 있는 기회를 제공합니다. 그러나 여러 https 웹 사이트를 호출하는 일부 Java 애플리케이션이 있고 인증서 확인을 무시해서는 안 되므로 이는 내가 원하는 것도 아닙니다. 모든 관련 https 웹 사이트에 대해 Java cacerts 키 저장소에 공통 루트 CA 인증서를 등록하고 싶습니다. 자동으로 신뢰받게 됩니다.

누구든지 이 문제를 해결하는 방법을 말해 줄 수 있나요? 내 말은루트 CA를 미리 수동으로 가져올 필요가 없지만 사용자에게 웹 사이트를 볼 수 있는 기회는 제공됩니다.. Chrome과 Firefox는 정상적으로 실행됩니다.

루트 CA 인증서를 찾을 수 있는 위치를 브라우저에 알려주기 위해 몇 가지 인증서 확장을 지정하겠습니다. 다른 더 좋은 방법이 있는지는 확실하지 않습니다.

느낌표:

  • "체인에서든 다른 방식으로든" 새 CA 인증서를 보내면 브라우저가 이를 "현명하게" 수락한다는 뜻이 아닙니다. 브라우저에서 "수락"하도록 한다는 뜻이 아니라 체인을 통해 확인하라는 의미입니다. 사용자에게 알 수 없는 루트 CA의 위험을 허용하는지 물어보세요.

  • "체인 파일은 CA가 아닙니다"에 관하여: 체인 파일에는 루트 CA 인증서도 포함되어 있지 않으며 브라우저에는 사전 설치된 루트 CA에서와 같이 루트 CA 인증서를 찾을 수 있는 방법이 있다는 것을 많이 알고 있습니다. 또는 "권위 있는 정보 액세스" 인증서 필드를 통해 루트 CA를 가리키는 URL이 있을 수 있습니다. 이는 잘 알려지지 않은 영역이며 브라우저 구현에 따라 달라집니다. 브라우저가 웹 사이트의 루트 CA를 어떻게 가져오는가? 인증서 자체(신뢰하거나 수락한다는 의미는 아닙니다).

  • 나는 Apple의 지침을 따랐습니다.https://support.apple.com/en-us/HT210176

2021/02/12 편집: Safari에서 상황이 점점 흥미로워지고 있습니다.

  • https://ip_address가 유효합니다. (물론 안전 경고도 함께)
  • https://dns_name이 작동하지 않습니다(보안 경고도 표시되지 않음).
  • https://dns_name은 비공개 브라우징 모드에서 작동합니다(물론 보안 경고 포함).

몇 가지 기술적인 세부 사항을 첨부하겠습니다. 웹 사이트에서 반환된 인증서 체인은 다음과 같습니다. (일부 민감한 이름을 my-host와 같은 단어로 바꿨습니다...)

$ echo Q | openssl s_client -showcerts -verify 5 -connect my-host.my-domain:443
verify depth is 5
CONNECTED(00000005)
depth=1 CN = My Root CA Name
verify error:num=19:self signed certificate in certificate chain
verify return:1
depth=1 CN = My Root CA Name
verify return:1
depth=0 CN = my-host.my-domain
verify return:1
---
Certificate chain
 0 s:CN = my-host.my-domain
   i:CN = My Root CA Name
-----BEGIN CERTIFICATE-----
MIIDqjCCApKgAwIBAgIJAIh7Dn2n363zMA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV
BAMMD1RyaWRlbnQgUm9vdCBDQTAeFw0yMTAyMDkwNDU4MzZaFw0yMjAzMTMwNDU4
......
+bnUvHgMmMukXgMLo3e6tnF/Za9z/BCv0KESoFEIg7uWo+IUZv8wXYI8YQEaeeGt
s2et3Js1eBqN1zle8ejoFuInQNS5wkalx0D+zTcCcXVvnUJm2womcKBxFAHJeZDg
vvbsua6FH0JTVjeprdmx1mKkj+MP4N664vP8kAj6
-----END CERTIFICATE-----
 1 s:CN = My Root CA Name
   i:CN = My Root CA Name
-----BEGIN CERTIFICATE-----
MIIDFzCCAf+gAwIBAgIJAIafS0ZYzGA4MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV
BAMMD1RyaWRlbnQgUm9vdCBDQTAeFw0yMTAyMDkwNDU0MTdaFw0zMTAyMDcwNDU0
......
+b4lJl9fUHd01xqGbBGmp/BL8EI+IveSRTKr/Boi+klqvlgOi5TgUF/0R9gmwPRO
OXIL5hdA7CTsgaURWJ897p5JVYsPtofjnL10
-----END CERTIFICATE-----
---
Server certificate
subject=CN = my-host.my-domain

issuer=CN = My Root CA Name

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2449 bytes and written 432 bytes
Verification error: self signed certificate in certificate chain
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: F6FF34026A5B10EE149D442FA4035916330AE09AC2B771369EA0B94754501892
    Session-ID-ctx:
    Master-Key: BF444224C15CEDC3309F01E4C5DE8F8331AF9B82F0613601FE5D1B677F6526DD3FF97BB00DB3DC5BB0E35EA489861FF6
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - d6 5f 48 e0 90 10 48 22-46 83 7f 82 d1 a4 17 da   ._H...H"F.......
    0010 - 17 10 e8 1e e1 dc 17 58-9c 36 e8 d1 36 f5 d7 f6   .......X.6..6...
    ......
    00d0 - 85 63 2a 3c 0e 6c 18 f3-27 fb 21 7d bd 3d 8b 33   .c*<.l..'.!}.=.3
    00e0 - bf 3c 60 da 06 2e 23 3b-a0 f2 f6 88 5e 0c 2b f2   .<`...#;....^.+.

    Start Time: 1612937133
    Timeout   : 7200 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
    Extended master secret: yes
---
DONE

apache2(2.4.29 우분투) 구성:

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        SSLEngine On
        SSLCertificateFile    /etc/apache2/certs/web_cert.pem
        SSLCertificateKeyFile /etc/apache2/certs/web_key.pem
        DocumentRoot /var/www
        LimitRequestFieldSize 32768
    </VirtualHost>
</IfModule>

/etc/apache2/certs/web_cert.pem은 실제로 웹사이트 인증서와 루트 CA 인증서, 즉 인증서 체인 파일을 연결한 파일입니다.

기타 정보:

루트 CA 인증서:

# openssl x509 -text -noout < /etc/apache2/certs/root_ca_cert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            86:9f:4b:46:58:cc:60:38
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = My Root CA Name
        Validity
            Not Before: Feb  9 04:54:17 2021 GMT
            Not After : Feb  7 04:54:17 2031 GMT
        Subject: CN = My Root CA Name
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ......
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Key Identifier:
                EE:BF:15:0D:35:BC:4C:92:88:4F:9B:21:FC:B6:C4:29:C4:35:9E:D3
            X509v3 Authority Key Identifier:
                keyid:EE:BF:15:0D:35:BC:4C:92:88:4F:9B:21:FC:B6:C4:29:C4:35:9E:D3

            X509v3 Key Usage:
                Certificate Sign, CRL Sign
    Signature Algorithm: sha256WithRSAEncryption
         ......

루트 CA 키

# openssl rsa -text -noout < /etc/apache2/certs/root_ca_key.pem
Private-Key: (2048 bit)
modulus:
    ......
publicExponent: 65537 (0x10001)
privateExponent:
    ......
prime1:
    ......
prime2:
    ......
exponent1:
    ......
exponent2:
    ......
coefficient:
    ......

웹사이트 인증서:

# openssl x509 -text -noout < /etc/apache2/certs/web_cert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            88:7b:0e:7d:a7:df:ad:f3
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = My Root CA Name
        Validity
            Not Before: Feb  9 04:58:36 2021 GMT
            Not After : Mar 13 04:58:36 2022 GMT
        Subject: CN = my-host.my-domain
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ......
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                E2:83:31:54:D3:49:D1:5E:78:6C:29:84:15:C9:80:48:26:AF:7A:EF
            X509v3 Authority Key Identifier:
                keyid:EE:BF:15:0D:35:BC:4C:92:88:4F:9B:21:FC:B6:C4:29:C4:35:9E:D3
                DirName:/CN=My Root CA Name
                serial:86:9F:4B:46:58:CC:60:38

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: critical
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:my-host.my-domain, IP Address:100.100.100.100
    Signature Algorithm: sha256WithRSAEncryption
         ......

웹사이트의 인증서 키:

# openssl rsa -text -noout < /etc/apache2/certs/web_key.pem
Private-Key: (2048 bit)
modulus:
    ......
publicExponent: 65537 (0x10001)
privateExponent:
    ......
prime1:
    ......
prime2:
    ......
exponent1:
    ......
exponent2:
    ......
coefficient:
    ......

키체인 확인 결과:

s# openssl verify -CAfile /etc/apache2/certs/root_ca_cert.pem < /etc/apache2/certs/web_cert.pem
stdin: OK

답변1

귀찮게 해서 죄송합니다. 어떤 부분이 최종적으로 작동하게 되었는지 확실하지 않습니다. HSTS plist와 브라우저 기록을 지우고 다시 시작한 후에는 이제 작동합니다. 또한 동일한 MacOS 버전을 사용하는 두 사용자 모두 잘 작동하고 있으며 내 Macbook과 다른 동료의 Macbook에만 문제가 있음을 확인했습니다. 이음매는 동일한 이름으로 다른 루트 CA를 수동으로 등록했기 때문입니다.

요약: 문제가 발생하면 https over IP가 작동하고 비공개 브라우징 모드가 dnsname과 ip 모두에 작동하고 일부 사용자에게 작동합니다. 이제 제 것도 작동합니다. 물론 모두 보안 경고가 표시됩니다. 문제는 다음과 같습니다. "Apple은 사용 중인 CA 인증서가 있고 신뢰 저장소에 없는 경우 이 옵션을 제공하지 않기로 의식적으로 결정했습니다." 그러나 이는 결국 브라우저 캐시나 HSTS 설정 등으로 인해 일부 로컬 문제입니다.

관련 정보