對于一個類,我正在查看 .tls 的 TLS 證書鏈google.com。當我在 Chrome 或 Firefox 瀏覽器中單擊時,顯示的根證書GTS Root R1有效期為 2036,自簽名,因此它必須是根證書。
但是,如果我使用以下代碼在 Python 中檢查相同的內容,則會得到一個GTS Root R1有效期為 2028的證書,該證書由 簽名GlobalSign nv-sa,因此這次它不是根證書!
Google.com 是否有可能根據請求的客戶端回傳兩個不同的證書鏈?如果它假設客戶端接受GTS Root R1作為根證書,則回傳此證書,否則回傳由GlobalSign nv-sa?
如果是這樣,為什么?
以下是帶有證書及其摘要/sha256 的鏈。現在,當我在瀏覽器中查看證書鏈時,前兩個具有相同的digest/ sha-256,但第三個具有不同的digest. 所以我絕對認為我會根據客戶獲得不同的鏈條......
Certificate #0
Subject b'CN': b'*.google.com'
notBefore: b'20211101021952Z'
notAfter: b'20220124021951Z'
version:2
sigAlg: b'sha256WithRSAEncryption'
digest: b'E9:7C:86:18:34:DE:F4:11:4D:2D:5E:6F:1A:49:22:A1:04:EE:9E:7C:8D:CB:72:3F:6D:67:58:8F:7E:F3:4B:AB'
issuer: <X509Name object '/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3'>
Certificate #1
Subject b'C': b'US'
Subject b'O': b'Google Trust Services LLC'
Subject b'CN': b'GTS CA 1C3'
notBefore: b'20200813000042Z'
notAfter: b'20270930000042Z'
version:2
sigAlg: b'sha256WithRSAEncryption'
digest: b'23:EC:B0:3E:EC:17:33:8C:4E:33:A6:B4:8A:41:DC:3C:DA:12:28:1B:BC:3F:F8:13:C0:58:9D:6C:C2:38:75:22'
issuer: <X509Name object '/C=US/O=Google Trust Services LLC/CN=GTS Root R1'>
Certificate #2
Subject b'C': b'US'
Subject b'O': b'Google Trust Services LLC'
Subject b'CN': b'GTS Root R1'
notBefore: b'20200619000042Z'
notAfter: b'20280128000042Z'
version:2
sigAlg: b'sha256WithRSAEncryption'
digest: b'3E:E0:27:8D:F7:1F:A3:C1:25:C4:CD:48:7F:01:D7:74:69:4E:6F:C5:7E:0C:D9:4C:24:EF:D7:69:13:39:18:E5'
issuer: <X509Name object '/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA'>
我用來獲取證書的python代碼:
from OpenSSL import SSL, crypto
import socket, certifi
def dump_cert(cert):
for component in cert.get_subject().get_components():
print("Subject %s: %s" % (component))
print("notBefore:", cert.get_notBefore())
print("notAfter:", cert.get_notAfter())
print("version:" str(cert.get_version()))
print("sigAlg:", cert.get_signature_algorithm())
print("digest:", cert.digest('sha256'))
print("issuer:", cert.get_issuer())
print()
def get_connection_chain(host, port = 443):
dst = (str.encode(host), port)
ctx = SSL.Context(SSL.TLSv1_2_METHOD)
s = socket.create_connection(dst)
s = SSL.Connection(ctx, s)
s.set_connect_state()
s.set_tlsext_host_name(dst[0])
s.sendall(b'HEAD / HTTP/1.2\n\n')
s.recv(16)
return (s, s.get_peer_cert_chain())
def dump_chain(chain):
for pos, cert in enumerate(chain):
print("Certificate #" str(pos))
dump_cert(cert)
conn, chain = get_connection_chain("google.ch")
dump_chain(chain)
uj5u.com熱心網友回復:
所以多虧了President James K. Polk我想我更好地了解發生了什么:
- 根據https://pki.goog/repository/,有兩個版本的
GTS Root R1證書具有相同的公鑰:- 根證書
GTS Root R1 - 中間證書
GTS Root R1 Cross,由 簽署GlobalSign nv-sa,是根證書。
- 根證書
因此,瀏覽器會收到問題中給出的證書鏈。然后它從證書鏈的葉節點開始,即Certificate #0. 瀏覽器通過其存盤的根證書串列來驗證葉證書。如果沒有找到,它會轉到下一個條目,Certificate #1。
在 google.com 的例子中,它發現它有一個根證書Certificate #1并使用這個,忽略Certificate #2. 即使我不確定它為什么會這樣做:
- 它希望
GlobalSign在某個時候擺脫證書嗎? - 是為了冗余嗎?如果一個證書被吊銷,另一個仍然有效嗎?
描述這一點的一篇博客文章在這里:https : //scotthelme.co.uk/cross-signing-alternate-trust-paths-how-they-work/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/372273.html
下一篇:javax.net.ssl.SSLException:從ApacheTomcat9.0.54發送請求時,在握手錯誤期間收到close_notify
