プライベートルートCAを作成し、いくつかのhttpsウェブサイトに対していくつかのSSL証明書を発行しました。
(これを自己署名証明書と呼ぶ必要があるかどうかはわかりません。私の場合、ルートCA証明書は自己署名されていますが、ルートCAによって発行されたWebサイトのSSL証明書は自己署名されていません。キーワードを選択してください)
これらの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 Webサイトを呼び出すいくつかのJavaアプリケーションがあり、証明書の検証を無視してはいけないので、これは私が望むものではありません。すべての関連https Webサイトに対して、Java cacertsキーストアに共通のルートCA証明書を登録したいと思います。自動的に信頼されます。
誰でもこの問題を解決する方法を教えてもらえますか?私の言葉はルートCAを事前に手動でインポートする必要はありませんが、ユーザーにWebサイトを表示する機会があります。。 ChromeとFirefoxは正常に動作します。
ルートCA証明書が見つかる場所をブラウザに伝えるために、いくつかの証明書拡張を指定します。他のより良い方法があるかどうかはわかりません。
感嘆符:
「チェーンでも別の方法でも」新しいCA証明書を送信することは、ブラウザがそれを「賢明に」受け入れるという意味ではありません。ブラウザで「受け入れる」という意味ではなく、チェーンを通じて確認するという意味です。ユーザーに未知のルートCAのリスクを許可するかどうかを尋ねてください。
「チェーンファイルはCAではありません」について:チェーンファイルにはルートCA証明書も含まれておらず、ブラウザにはプリインストールされているルートCAと同様にルートCA証明書を見つける方法があることがよくわかります。あるいは、「権利情報アクセス」証明書フィールドを介してルートCAを指すURLがあります。これは不明な領域であり、ブラウザの実装によって異なります。ブラウザがWebサイトのルートCAをどのようにインポートするのですか?証明書自体(信頼または受け入れるという意味ではありません)。
私はAppleの指示に従いました。https://support.apple.com/en-us/HT210176
2021/02/12 編集:Safariで状況がますます興味深くなっています。
- https://ip_addressが有効です。 (もちろん安全警告も併せて)
- https://dns_nameが機能しません(セキュリティ警告も表示されません)。
- https://dns_nameはプライベートブラウジングモードで動作します(もちろんセキュリティ警告を含む)。
いくつかの技術的な詳細を添付します。 Webサイトから返された証明書チェーンは次のとおりです。 (いくつかの敏感な名前を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 Ubuntu)設定:
<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は、実際にWebサイト証明書とルート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の設定などによるいくつかのローカル問題です。