Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ad248d6

Browse files
authoredMar 19, 2020
make verify_ssl=False turn off certificate verification too (#129)
1 parent 02f5626 commit ad248d6

File tree

5 files changed

+73
-13
lines changed

5 files changed

+73
-13
lines changed
 

‎ldclient/util.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -98,24 +98,21 @@ def status(self):
9898
def create_http_pool_manager(num_pools=1, verify_ssl=False, target_base_uri=None, force_proxy=None):
9999
proxy_url = force_proxy or _get_proxy_url(target_base_uri)
100100

101-
if not verify_ssl:
102-
if proxy_url is None:
103-
return urllib3.PoolManager(num_pools=num_pools)
104-
else:
105-
return urllib3.ProxyManager(proxy_url, num_pools=num_pools)
106-
101+
cert_reqs = 'CERT_REQUIRED' if verify_ssl else 'CERT_NONE'
102+
ca_certs = certifi.where() if verify_ssl else None
103+
107104
if proxy_url is None:
108105
return urllib3.PoolManager(
109106
num_pools=num_pools,
110-
cert_reqs='CERT_REQUIRED',
111-
ca_certs=certifi.where()
107+
cert_reqs=cert_reqs,
108+
ca_certs=ca_certs
112109
)
113110
else:
114111
return urllib3.ProxyManager(
115112
proxy_url,
116113
num_pools=num_pools,
117-
cert_reqs='CERT_REQUIRED',
118-
ca_certs=certifi.where()
114+
cert_reqs=cert_reqs,
115+
ca_certs = ca_certs
119116
)
120117

121118
def _get_proxy_url(target_base_uri):

‎testing/http_util.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from six import iteritems
33
from six.moves import BaseHTTPServer, queue
44
import socket
5+
import ssl
56
from threading import Thread
67

78
def get_available_port():
@@ -12,16 +13,28 @@ def get_available_port():
1213
return port
1314

1415
def start_server():
15-
sw = MockServerWrapper(get_available_port())
16+
sw = MockServerWrapper(get_available_port(), False)
17+
sw.start()
18+
return sw
19+
20+
def start_secure_server():
21+
sw = MockServerWrapper(get_available_port(), True)
1622
sw.start()
1723
return sw
1824

1925
class MockServerWrapper(Thread):
20-
def __init__(self, port):
26+
def __init__(self, port, secure):
2127
Thread.__init__(self)
2228
self.port = port
23-
self.uri = 'http://localhost:%d' % port
29+
self.uri = '%s://localhost:%d' % ('https' if secure else 'http', port)
2430
self.server = BaseHTTPServer.HTTPServer(('localhost', port), MockServerRequestHandler)
31+
if secure:
32+
self.server.socket = ssl.wrap_socket(
33+
self.server.socket,
34+
certfile='./testing/selfsigned.pem', # this is a pre-generated self-signed cert that is valid for 100 years
35+
keyfile='./testing/selfsigned.key',
36+
server_side=True
37+
)
2538
self.server.server_wrapper = self
2639
self.matchers = {}
2740
self.requests = queue.Queue()

‎testing/selfsigned.key

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIIWkym77UXCR7NludcOuJyUc+KwjcWhNstarQewjH/4ZoAoGCCqGSM49
3+
AwEHoUQDQgAELb4Nb3GZRIOgsiFCRPxEFXYYb9JIR/ViYM76/EKNII7nl5cLQaNG
4+
5BGo7ZVF47nePRerqzluEXHRTMt3oul2yw==
5+
-----END EC PRIVATE KEY-----

‎testing/selfsigned.pem

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBZzCCAQ6gAwIBAgIRAJL5RmnJTnoxpf27KVMMnecwCgYIKoZIzj0EAwIwDzEN
3+
MAsGA1UEChMEVGVzdDAgFw0yMDAzMTgyMTEyNDVaGA8yMTIwMDIyMzIxMTI0NVow
4+
DzENMAsGA1UEChMEVGVzdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABC2+DW9x
5+
mUSDoLIhQkT8RBV2GG/SSEf1YmDO+vxCjSCO55eXC0GjRuQRqO2VReO53j0Xq6s5
6+
bhFx0UzLd6LpdsujSTBHMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEF
7+
BQcDATAPBgNVHRMBAf8EBTADAQH/MA8GA1UdEQQIMAaHBH8AAAEwCgYIKoZIzj0E
8+
AwIDRwAwRAIgXUpCMZGxpjXrWS9Z6K0fHzOAnMmjp78n8ZPMdRKb2eYCIBEmP6MK
9+
O3TJdhTVnB5O3CnC9X/lCGViUR+njcH+sU3z
10+
-----END CERTIFICATE-----

‎testing/test_ldclient_tls.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from ldclient.client import LDClient, Config
2+
from testing.http_util import start_secure_server
3+
import pytest
4+
import sys
5+
6+
# These tests are skipped in Python 3.3 because the embedded HTTPS server does not work correctly, causing a
7+
# TLS handshake failure on the client side. It's unclear whether this is a problem with the self-signed
8+
# certificate we are using or with some other server settings, but it does not appear to be a client-side
9+
# problem.
10+
11+
@pytest.mark.skipif(sys.version_info.major == 3 and sys.version_info.minor == 3, reason = "test is skipped in Python 3.3")
12+
def test_cannot_connect_with_selfsigned_cert_if_ssl_verify_is_true():
13+
with start_secure_server() as server:
14+
server.setup_json_response('/sdk/latest-all', { 'flags': {}, 'segments': {} })
15+
config = Config(
16+
sdk_key = 'sdk_key',
17+
base_uri = server.uri,
18+
stream = False
19+
)
20+
with LDClient(config = config, start_wait = 1.5) as client:
21+
assert not client.is_initialized()
22+
23+
@pytest.mark.skipif(sys.version_info.major == 3 and sys.version_info.minor == 3, reason = "test is skipped in Python 3.3")
24+
def test_can_connect_with_selfsigned_cert_if_ssl_verify_is_false():
25+
with start_secure_server() as server:
26+
server.setup_json_response('/sdk/latest-all', { 'flags': {}, 'segments': {} })
27+
config = Config(
28+
sdk_key = 'sdk_key',
29+
base_uri = server.uri,
30+
stream = False,
31+
send_events = False,
32+
verify_ssl = False
33+
)
34+
with LDClient(config = config) as client:
35+
assert client.is_initialized()

0 commit comments

Comments
 (0)
Please sign in to comment.