66import redis
77from redis .exceptions import ConnectionError , RedisError
88
9- from .conftest import skip_if_cryptography , skip_if_nocryptography
10- from .ssl_utils import CertificateType , get_tls_certificates
9+ from .conftest import (
10+ skip_if_cryptography ,
11+ skip_if_nocryptography ,
12+ skip_if_server_version_lt ,
13+ )
14+ from .ssl_utils import CertificateType , get_tls_certificates , CN_USERNAME
1115
1216
1317@pytest .mark .ssl
@@ -20,10 +24,10 @@ class TestSSL:
2024
2125 @pytest .fixture (autouse = True )
2226 def _set_ssl_certs (self , request ):
23- tls_cert_subdir = request .session .config .REDIS_INFO ["tls_cert_subdir" ]
24- self .client_certs = get_tls_certificates (tls_cert_subdir )
27+ self . tls_cert_subdir = request .session .config .REDIS_INFO ["tls_cert_subdir" ]
28+ self .client_certs = get_tls_certificates (self . tls_cert_subdir )
2529 self .server_certs = get_tls_certificates (
26- tls_cert_subdir , cert_type = CertificateType .server
30+ self . tls_cert_subdir , cert_type = CertificateType .server
2731 )
2832
2933 def test_ssl_with_invalid_cert (self , request ):
@@ -425,3 +429,40 @@ def capture_context_wrap_socket(context_self, sock, **_kwargs):
425429
426430 finally :
427431 r .close ()
432+
433+ @skip_if_server_version_lt ("8.5.0" )
434+ def test_ssl_authenticate_with_client_cert (self , request , r ):
435+ """Test that when client certificate is used for authentication,
436+ the connection is created successfully"""
437+
438+ try :
439+ # Non SSL client, to setup ACL
440+ assert r .acl_setuser (
441+ CN_USERNAME ,
442+ enabled = True ,
443+ reset = True ,
444+ passwords = ["+clientpass" ],
445+ keys = ["*" ],
446+ commands = ["+acl" ],
447+ )
448+ finally :
449+ r .close ()
450+
451+ ssl_url = request .config .option .redis_ssl_url
452+ p = urlparse (ssl_url )[1 ].split (":" )
453+ client_cn_cert , client_cn_key , ca_cert = get_tls_certificates (
454+ self .tls_cert_subdir , CertificateType .client_cn
455+ )
456+ r = redis .Redis (
457+ host = p [0 ],
458+ port = p [1 ],
459+ ssl = True ,
460+ ssl_certfile = client_cn_cert ,
461+ ssl_keyfile = client_cn_key ,
462+ ssl_cert_reqs = "required" ,
463+ ssl_ca_certs = ca_cert ,
464+ )
465+ try :
466+ assert r .acl_whoami () == CN_USERNAME
467+ finally :
468+ r .close ()
0 commit comments