@@ -3009,11 +3009,19 @@ def run(self):
30093009 cert = self .sslconn .getpeercert ()
30103010 self .write (repr (cert ).encode ("us-ascii" ) + b"\n " )
30113011 elif stripped == b'VERIFIEDCHAIN' :
3012- certs = self .sslconn ._sslobj .get_verified_chain ()
3013- self .write (len (certs ).to_bytes (1 , "big" ) + b"\n " )
3012+ try :
3013+ certs = self .sslconn .get_verified_chain ()
3014+ except Exception as e :
3015+ self .write (repr (e ).encode ("us-ascii" ) + b"\n " )
3016+ else :
3017+ self .write (len (certs ).to_bytes (1 , "big" ) + b"\n " )
30143018 elif stripped == b'UNVERIFIEDCHAIN' :
3015- certs = self .sslconn ._sslobj .get_unverified_chain ()
3016- self .write (len (certs ).to_bytes (1 , "big" ) + b"\n " )
3019+ try :
3020+ certs = self .sslconn .get_unverified_chain ()
3021+ except Exception as e :
3022+ self .write (repr (e ).encode ("us-ascii" ) + b"\n " )
3023+ else :
3024+ self .write (len (certs ).to_bytes (1 , "big" ) + b"\n " )
30173025 else :
30183026 if (support .verbose and
30193027 self .server .connectionchatty ):
@@ -5691,6 +5699,66 @@ def test_internal_chain_server(self):
56915699 res = s .recv (1024 )
56925700 self .assertEqual (res , b'\x02 \n ' )
56935701
5702+ def test_internal_chain_server_resumed_session (self ):
5703+ # A session resumed from a ticket stores the client's certificate
5704+ # but not the chain it was sent with.
5705+ for version in ssl .TLSVersion .TLSv1_2 , ssl .TLSVersion .TLSv1_3 :
5706+ if not has_tls_version (version ):
5707+ continue
5708+ with self .subTest (version = version .name ):
5709+ self .check_chain_server_resumed_session (version )
5710+
5711+ def check_chain_server_resumed_session (self , version ):
5712+ client_context , server_context , hostname = testing_context ()
5713+ client_context .load_cert_chain (SIGNED_CERTFILE )
5714+ server_context .verify_mode = ssl .CERT_REQUIRED
5715+ client_context .minimum_version = version
5716+ client_context .maximum_version = version
5717+
5718+ server = ThreadedEchoServer (context = server_context , chatty = False )
5719+ with server :
5720+ with client_context .wrap_socket (
5721+ socket .socket (),
5722+ server_hostname = hostname
5723+ ) as s :
5724+ s .connect ((HOST , server .port ))
5725+ s .write (b'UNVERIFIEDCHAIN\n ' )
5726+ res = s .recv (1024 )
5727+ self .assertEqual (res , b'\x02 \n ' )
5728+ # TLS 1.3 sends the ticket after the handshake, so only
5729+ # get the session once data was received.
5730+ session = s .session
5731+ self .assertTrue (session .has_ticket )
5732+ with client_context .wrap_socket (
5733+ socket .socket (),
5734+ server_hostname = hostname ,
5735+ session = session
5736+ ) as s :
5737+ s .connect ((HOST , server .port ))
5738+ self .assertTrue (s .session_reused )
5739+ s .write (b'UNVERIFIEDCHAIN\n ' )
5740+ res = s .recv (1024 )
5741+ self .assertEqual (res , b'\x01 \n ' )
5742+ # The verified chain is not stored with the session at all.
5743+ s .write (b'VERIFIEDCHAIN\n ' )
5744+ res = s .recv (1024 )
5745+ self .assertEqual (res , b'\x00 \n ' )
5746+
5747+ def test_internal_chain_server_no_client_cert (self ):
5748+ client_context , server_context , hostname = testing_context ()
5749+ server_context .verify_mode = ssl .CERT_OPTIONAL
5750+
5751+ server = ThreadedEchoServer (context = server_context , chatty = False )
5752+ with server :
5753+ with client_context .wrap_socket (
5754+ socket .socket (),
5755+ server_hostname = hostname
5756+ ) as s :
5757+ s .connect ((HOST , server .port ))
5758+ s .write (b'UNVERIFIEDCHAIN\n ' )
5759+ res = s .recv (1024 )
5760+ self .assertEqual (res , b'\x00 \n ' )
5761+
56945762
56955763class TestSSLDebug (unittest .TestCase ):
56965764
0 commit comments