@@ -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 ):
@@ -5690,6 +5698,66 @@ def test_internal_chain_server(self):
56905698 res = s .recv (1024 )
56915699 self .assertEqual (res , b'\x02 \n ' )
56925700
5701+ def test_internal_chain_server_resumed_session (self ):
5702+ # A session resumed from a ticket stores the client's certificate
5703+ # but not the chain it was sent with.
5704+ for version in ssl .TLSVersion .TLSv1_2 , ssl .TLSVersion .TLSv1_3 :
5705+ if not has_tls_version (version ):
5706+ continue
5707+ with self .subTest (version = version .name ):
5708+ self .check_chain_server_resumed_session (version )
5709+
5710+ def check_chain_server_resumed_session (self , version ):
5711+ client_context , server_context , hostname = testing_context ()
5712+ client_context .load_cert_chain (SIGNED_CERTFILE )
5713+ server_context .verify_mode = ssl .CERT_REQUIRED
5714+ client_context .minimum_version = version
5715+ client_context .maximum_version = version
5716+
5717+ server = ThreadedEchoServer (context = server_context , chatty = False )
5718+ with server :
5719+ with client_context .wrap_socket (
5720+ socket .socket (),
5721+ server_hostname = hostname
5722+ ) as s :
5723+ s .connect ((HOST , server .port ))
5724+ s .write (b'UNVERIFIEDCHAIN\n ' )
5725+ res = s .recv (1024 )
5726+ self .assertEqual (res , b'\x02 \n ' )
5727+ # TLS 1.3 sends the ticket after the handshake, so only
5728+ # get the session once data was received.
5729+ session = s .session
5730+ self .assertTrue (session .has_ticket )
5731+ with client_context .wrap_socket (
5732+ socket .socket (),
5733+ server_hostname = hostname ,
5734+ session = session
5735+ ) as s :
5736+ s .connect ((HOST , server .port ))
5737+ self .assertTrue (s .session_reused )
5738+ s .write (b'UNVERIFIEDCHAIN\n ' )
5739+ res = s .recv (1024 )
5740+ self .assertEqual (res , b'\x01 \n ' )
5741+ # The verified chain is not stored with the session at all.
5742+ s .write (b'VERIFIEDCHAIN\n ' )
5743+ res = s .recv (1024 )
5744+ self .assertEqual (res , b'\x00 \n ' )
5745+
5746+ def test_internal_chain_server_no_client_cert (self ):
5747+ client_context , server_context , hostname = testing_context ()
5748+ server_context .verify_mode = ssl .CERT_OPTIONAL
5749+
5750+ server = ThreadedEchoServer (context = server_context , chatty = False )
5751+ with server :
5752+ with client_context .wrap_socket (
5753+ socket .socket (),
5754+ server_hostname = hostname
5755+ ) as s :
5756+ s .connect ((HOST , server .port ))
5757+ s .write (b'UNVERIFIEDCHAIN\n ' )
5758+ res = s .recv (1024 )
5759+ self .assertEqual (res , b'\x00 \n ' )
5760+
56935761
56945762class TestSSLDebug (unittest .TestCase ):
56955763
0 commit comments