개인 루트 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 설정 등으로 인해 일부 로컬 문제입니다.