41
41
import ssl
42
42
import os
43
43
import json
44
-
44
+ import sys
45
+ import subprocess
45
46
46
47
def data_file (name ):
47
48
return os .path .join (os .path .dirname (__file__ ), "ssldata" , name )
@@ -50,7 +51,38 @@ def data_file(name):
50
51
class StringWrapper (str ):
51
52
pass
52
53
53
-
54
+ def check_handshake (server_context , client_context , err = None ):
55
+ hostname = 'localhost'
56
+ c_in = ssl .MemoryBIO ()
57
+ c_out = ssl .MemoryBIO ()
58
+ s_in = ssl .MemoryBIO ()
59
+ s_out = ssl .MemoryBIO ()
60
+ client = client_context .wrap_bio (c_in , c_out , server_hostname = hostname )
61
+ server = server_context .wrap_bio (s_in , s_out , server_side = True )
62
+
63
+ try :
64
+ for _ in range (5 ):
65
+ try :
66
+ client .do_handshake ()
67
+ except ssl .SSLWantReadError :
68
+ pass
69
+ if c_out .pending :
70
+ s_in .write (c_out .read ())
71
+ try :
72
+ server .do_handshake ()
73
+ except ssl .SSLWantReadError :
74
+ pass
75
+ if s_out .pending :
76
+ c_in .write (s_out .read ())
77
+ except Exception as e :
78
+ if err is None :
79
+ assert False
80
+ else :
81
+ assert isinstance (e , err )
82
+ else :
83
+ if err is not None :
84
+ assert False
85
+
54
86
class CertTests (unittest .TestCase ):
55
87
56
88
ctx = ssl .SSLContext (ssl .PROTOCOL_TLS_CLIENT )
@@ -64,7 +96,7 @@ def check_load_cert_chain_error(self, certfile, keyfile=None, errno=-1, strerror
64
96
except err as e :
65
97
if errno != - 1 :
66
98
self .assertEqual (e .errno , errno )
67
- if strerror is not None :
99
+ if strerror is not None :
68
100
self .assertIn (strerror , e .strerror )
69
101
self .assertIsInstance (type (e ), type (err ))
70
102
else :
@@ -92,8 +124,7 @@ def check_load_verify_locations_error(self, cafile=None, capath=None, cadata=Non
92
124
assert False
93
125
94
126
def check_load_verify_locations_cadata_bytes_error (self , cadata , errno = - 1 , strerror = None , err = ssl .SSLError ):
95
- try :
96
-
127
+ try :
97
128
cadata = open (data_file (cadata )).read ()
98
129
cadata .replace ("" )
99
130
self .ctx .load_verify_locations (cafile , capath , cadata )
@@ -214,41 +245,33 @@ def test_load_default_verify_paths(self):
214
245
assert False
215
246
finally :
216
247
if certFile is not None :
217
- os .environ ["SSL_CERT_FILE" ] = certFile
218
- if certDir is not None :
219
- os .environ ["SSL_CERT_DIR" ] = certDir
220
-
221
- def check_handshake (self , server_context , client_context , err = None ):
222
- hostname = 'localhost'
223
- c_in = ssl .MemoryBIO ()
224
- c_out = ssl .MemoryBIO ()
225
- s_in = ssl .MemoryBIO ()
226
- s_out = ssl .MemoryBIO ()
227
- client = client_context .wrap_bio (c_in , c_out , server_hostname = hostname )
228
- server = server_context .wrap_bio (s_in , s_out , server_side = True )
229
-
230
- try :
231
- for _ in range (5 ):
232
- try :
233
- client .do_handshake ()
234
- except ssl .SSLWantReadError :
235
- pass
236
- if c_out .pending :
237
- s_in .write (c_out .read ())
238
- try :
239
- server .do_handshake ()
240
- except ssl .SSLWantReadError :
241
- pass
242
- if s_out .pending :
243
- c_in .write (s_out .read ())
244
- except Exception as e :
245
- if err is None :
246
- assert False
248
+ env ["SSL_CERT_FILE" ] = certFile
249
+ else :
250
+ del env ["SSL_CERT_FILE" ]
251
+ if certDir is not None :
252
+ env ["SSL_CERT_DIR" ] = certDir
247
253
else :
248
- assert isinstance (e , err )
249
- else :
250
- if err is not None :
251
- assert False
254
+ del env ["SSL_CERT_DIR" ]
255
+
256
+ @unittest .skipIf (sys .implementation .name == 'cpython' , "graalpython specific" )
257
+ def test_load_default_verify_keystore (self ):
258
+ # execute with javax.net.ssl.trustStore=tests/ssldata/signing_keystore.jks
259
+ # the JKS keystore:
260
+ # - contains one trusted certificate, the same as in tests/ssldata/signing_ca.pem
261
+ # - password is testssl
262
+ curdir = os .path .abspath (os .path .dirname (__file__ ))
263
+ src = "import ssl, sys, os\n " \
264
+ "sys.path.append('" + curdir + "')\n " \
265
+ "from test_ssl import data_file, check_handshake\n " \
266
+ "server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n " \
267
+ "server_context.load_cert_chain(data_file('signed_cert.pem'))\n " \
268
+ "client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n " \
269
+ "check_handshake(server_context, client_context, ssl.SSLCertVerificationError)\n " \
270
+ "client_context.load_default_certs()\n " \
271
+ "check_handshake(server_context, client_context)\n "
272
+ env = os .environ .copy ()
273
+ env ['JAVA_TOOL_OPTIONS' ] = "-Djavax.net.ssl.trustStore=" + curdir + "/ssldata/signing_keystore.jks"
274
+ subprocess .run ([sys .executable , '-c' , src ], env = env )
252
275
253
276
def test_verify_mode (self ):
254
277
signed_cert = data_file ("signed_cert.pem" )
@@ -269,47 +292,47 @@ def test_verify_mode(self):
269
292
# no cert chain on server
270
293
# openssl SSLError: [SSL: NO_SHARED_CIPHER] / jdk javax.net.ssl.SSLHandshakeException: No available authentication scheme
271
294
client_context .verify_mode = ssl .CERT_NONE
272
- self . check_handshake (server_context , client_context , ssl .SSLError )
295
+ check_handshake (server_context , client_context , ssl .SSLError )
273
296
client_context .verify_mode = ssl .CERT_REQUIRED
274
- self . check_handshake (server_context , client_context , ssl .SSLError )
297
+ check_handshake (server_context , client_context , ssl .SSLError )
275
298
client_context .verify_mode = ssl .CERT_OPTIONAL
276
- self . check_handshake (server_context , client_context , ssl .SSLError )
299
+ check_handshake (server_context , client_context , ssl .SSLError )
277
300
278
301
# server provides cert, but client has noverify locations
279
302
server_context .load_cert_chain (signed_cert )
280
303
281
304
client_context .verify_mode = ssl .CERT_NONE
282
- self . check_handshake (server_context , client_context )
305
+ check_handshake (server_context , client_context )
283
306
client_context .verify_mode = ssl .CERT_REQUIRED
284
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
307
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
285
308
client_context .verify_mode = ssl .CERT_OPTIONAL
286
309
# CERT_OPTIONAL in client mode has the same meaning as CERT_REQUIRED
287
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
310
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
288
311
289
312
client_context .check_hostname = True
290
313
291
314
with self .assertRaisesRegex (ValueError , "Cannot set verify_mode to CERT_NONE when check_hostname is enabled" ):
292
315
client_context .verify_mode = ssl .CERT_NONE
293
316
294
317
client_context .verify_mode = ssl .CERT_REQUIRED
295
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
318
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
296
319
297
320
client_context .verify_mode = ssl .CERT_OPTIONAL
298
321
# CERT_OPTIONAL in client mode has the same meaning as CERT_REQUIRED
299
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
322
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
300
323
301
324
# client provides cert, server verifies
302
325
client_context .load_verify_locations (signing_ca )
303
326
304
327
client_context .verify_mode = ssl .CERT_REQUIRED
305
- self . check_handshake (server_context , client_context )
328
+ check_handshake (server_context , client_context )
306
329
client_context .verify_mode = ssl .CERT_OPTIONAL
307
- self . check_handshake (server_context , client_context )
330
+ check_handshake (server_context , client_context )
308
331
309
332
# server provides wrong cert for CERT_OPTIONAL client
310
333
server_context = ssl .SSLContext (ssl .PROTOCOL_TLS_SERVER )
311
334
server_context .load_cert_chain (signed_cert2 )
312
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
335
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
313
336
314
337
########################################################################
315
338
# verify_mode - server
@@ -324,46 +347,46 @@ def test_verify_mode(self):
324
347
# no cert chain on server and client
325
348
# openssl SSLError: [SSL: NO_SHARED_CIPHER] / jdk javax.net.ssl.SSLHandshakeException: No available authentication scheme
326
349
server_context .verify_mode = ssl .CERT_NONE
327
- self . check_handshake (server_context , client_context , ssl .SSLError )
350
+ check_handshake (server_context , client_context , ssl .SSLError )
328
351
server_context .verify_mode = ssl .CERT_REQUIRED
329
- self . check_handshake (server_context , client_context , ssl .SSLError )
352
+ check_handshake (server_context , client_context , ssl .SSLError )
330
353
server_context .verify_mode = ssl .CERT_OPTIONAL
331
- self . check_handshake (server_context , client_context , ssl .SSLError )
354
+ check_handshake (server_context , client_context , ssl .SSLError )
332
355
333
356
# no cert from client
334
357
server_context .load_cert_chain (signed_cert )
335
358
336
359
server_context .verify_mode = ssl .CERT_NONE
337
- self . check_handshake (server_context , client_context )
360
+ check_handshake (server_context , client_context )
338
361
server_context .verify_mode = ssl .CERT_REQUIRED
339
- self . check_handshake (server_context , client_context , ssl .SSLError )
362
+ check_handshake (server_context , client_context , ssl .SSLError )
340
363
server_context .verify_mode = ssl .CERT_OPTIONAL
341
- self . check_handshake (server_context , client_context )
364
+ check_handshake (server_context , client_context )
342
365
343
366
# client provides cert, but server has nothing to verify with
344
367
client_context .load_cert_chain (signed_cert )
345
368
346
369
server_context .verify_mode = ssl .CERT_NONE
347
- self . check_handshake (server_context , client_context )
370
+ check_handshake (server_context , client_context )
348
371
server_context .verify_mode = ssl .CERT_REQUIRED
349
- self . check_handshake (server_context , client_context , ssl .SSLError )
372
+ check_handshake (server_context , client_context , ssl .SSLError )
350
373
server_context .verify_mode = ssl .CERT_OPTIONAL
351
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
374
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
352
375
353
376
# client provides cert, server verifies
354
377
server_context .load_verify_locations (signing_ca )
355
378
356
379
server_context .verify_mode = ssl .CERT_NONE
357
- self . check_handshake (server_context , client_context )
380
+ check_handshake (server_context , client_context )
358
381
server_context .verify_mode = ssl .CERT_REQUIRED
359
- self . check_handshake (server_context , client_context )
382
+ check_handshake (server_context , client_context )
360
383
server_context .verify_mode = ssl .CERT_OPTIONAL
361
- self . check_handshake (server_context , client_context )
384
+ check_handshake (server_context , client_context )
362
385
363
386
# client provides wrong cert for CERT_OPTIONAL server
364
387
client_context = ssl .SSLContext (ssl .PROTOCOL_TLS_CLIENT )
365
388
client_context .load_cert_chain (signed_cert2 )
366
- self . check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
389
+ check_handshake (server_context , client_context , ssl .SSLCertVerificationError )
367
390
368
391
def get_cipher_list (cipher_string ):
369
392
context = ssl .SSLContext ()
0 commit comments