Skip to content

Commit c1c7f8f

Browse files
authored
feat: allows users to skip of verifying SSL certificate (#136)
1 parent 11f0c35 commit c1c7f8f

File tree

5 files changed

+146
-7
lines changed

5 files changed

+146
-7
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## 1.10.0 [unreleased]
22

3+
### Features
4+
1. [#136](https://github.com/influxdata/influxdb-client-python/pull/136): Allows users to skip of verifying SSL certificate
5+
36
## 1.9.0 [2020-07-17]
47

58
### Features

influxdb_client/client/influxdb_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class InfluxDBClient(object):
2121
"""InfluxDBClient is client for InfluxDB v2."""
2222

2323
def __init__(self, url, token, debug=None, timeout=10000, enable_gzip=False, org: str = None,
24-
default_tags: dict = None) -> None:
24+
default_tags: dict = None, **kwargs) -> None:
2525
"""
2626
Initialize defaults.
2727
@@ -32,6 +32,7 @@ def __init__(self, url, token, debug=None, timeout=10000, enable_gzip=False, org
3232
:param enable_gzip: Enable Gzip compression for http requests. Currently only the "Write" and "Query" endpoints
3333
supports the Gzip compression.
3434
:param org: organization name (used as a default in query and write API)
35+
:key verify_ssl: Set this to false to skip verifying SSL certificate when calling API from https server.
3536
3637
"""
3738
self.url = url
@@ -48,6 +49,7 @@ def __init__(self, url, token, debug=None, timeout=10000, enable_gzip=False, org
4849
conf.host = self.url
4950
conf.enable_gzip = enable_gzip
5051
conf.debug = debug
52+
conf.verify_ssl = kwargs.get('verify_ssl', True)
5153

5254
auth_token = self.token
5355
auth_header_name = "Authorization"

influxdb_client/client/write_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ def write(self, bucket: str, org: str = None,
204204
the body line-protocol. The precision specified on a Point has precedes
205205
and is use for write.
206206
:param record: Points, line protocol, Pandas DataFrame, RxPY Observable to write
207-
:param data_frame_measurement_name: name of measurement for writing Pandas DataFrame
208-
:param data_frame_tag_columns: list of DataFrame columns which are tags, rest columns will be fields
207+
:key data_frame_measurement_name: name of measurement for writing Pandas DataFrame
208+
:key data_frame_tag_columns: list of DataFrame columns which are tags, rest columns will be fields
209209
"""
210210
if org is None:
211211
org = self._influxdb_client.org

tests/server.pem

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFZjCCA04CCQCMEn5e+4xmLTANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV
3+
UzEQMA4GA1UECAwHTmV3WW9yazEQMA4GA1UEBwwHTmV3WW9yazEdMBsGA1UECgwU
4+
SW5mbHV4REJQeXRob25DbGllbnQxDzANBgNVBAsMBkNsaWVudDESMBAGA1UEAwwJ
5+
bG9jYWxob3N0MB4XDTIwMDcyMDA2MzA0OVoXDTQ3MTIwNjA2MzA0OVowdTELMAkG
6+
A1UEBhMCVVMxEDAOBgNVBAgMB05ld1lvcmsxEDAOBgNVBAcMB05ld1lvcmsxHTAb
7+
BgNVBAoMFEluZmx1eERCUHl0aG9uQ2xpZW50MQ8wDQYDVQQLDAZDbGllbnQxEjAQ
8+
BgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
9+
AMoqURng8JwLYe4IHyIAGlI80utBLq6XbDETY93Pr6ZdHePr2jM+UIfFtdkpqdJw
10+
56ZxnJPtM1kDQJTsGfkf0/ePKZpnunNk+lkz9l5uQPVcujydplhJgJeHEj49s3Yy
11+
mWYetcR1Oejnqxgh+9Ev79r1Napu3s80SACPgvTP45CLp1hOGFySRaW7jcG3i+V4
12+
ljQWVAEse9Vy3e7E1EY2p6z/Zvj2UVOMqdHsivR1XLy5hts5ubIqOqvOCPocJ+0/
13+
m0AjwCXO4QPy7pLAAa7DA9rWDpzx8jpdfe54NOHuj4SVP45+PPsWvvkN2ZOkC/vb
14+
zz4DcYVwIqtqej8mvO2kkPIFLdRSKUc5N3xmdvF5awBGfHhb4l/KIDlhRle+L9kF
15+
LxRgkmBb2FFfL0/GtQlpH0bHHwPij4jPcOY+ueLKmAMgwWdqYae0HS01F7nYeZuP
16+
StDG+YuCjglOH8xugcV9GBXrRTijyjuml4st3Wl4tPpQClmdoZ2LXp5h/6Zq1aoc
17+
QlraKjwuTuzQBBHIFh9KXLZANLtMLpGGepFSMqE6YIWl17gi/2NruP8MGXNk+7GM
18+
ylczKu/Ny67qQ8JCnRLSNUXPg18LjU2voLuzgXWtuTUgRnQBdir6ZB5Bwc2zi0vx
19+
DNl0yzDhGNFdR5Rng5lAcmclA4QWi7Oc4h/OLN0ma0UzAgMBAAEwDQYJKoZIhvcN
20+
AQELBQADggIBADsWOWIMvynE2Iwtpv471kROYdqrj6Zj5P8Ye5/0lqedRxIYWDsc
21+
XDii+ePem+cMhnty8tAqCeHIdBUN86ibP+oqlwySbvdvW121RfedsWpa+TPC+Rnj
22+
8n5w0urVNpnYuep2f8SOpQ1WdXFMLIsKqcnV5KK3/rxOAUY9cNVumA55/terQMOZ
23+
RSGfjtoKVkMSOxNlaj4frLNy+I7nyWYrZ9UmUirvGLce5LJ1nrmo2I46FA0XDwu8
24+
xJqe4mB3GT/t9kFujd3Q/MtgD4J/MjWBfSYV0vlzI+VuoRctikw2SWQckQWNlIhs
25+
LPafo6D+lOxJtH58WksCxdb8C8sBbRl+irv/ZAlvIiOkmcpHcOQ7AbLTtosZs6nX
26+
p0ptWENlTM3lkt/Xma8txWXfe29tlf/9oheqXKdYunRyvFPL/gBjjR/VWzIS5sT5
27+
T6z0Vdk7uW9/wzv45vzjES8a8AAFvEkaRS4JBoTCW69mc8RFR89Vp9axRHY/3ohQ
28+
8pS9K00FLMTObb8qlW31LfKpCUSxHmU00BhGPduMYQF28Xj02zQ5UaeGOnSO5EjU
29+
pG0N7yqaVwGv9jYQfmnnD7M5LYVweEZ3OzCbfZuNJ4+EHNdZKcJiu2TaOsyxK25q
30+
AJvDAFTSr5A9GSjJ3OyIeKoI8Q6xuaQBitpZR90P/Ah/Ymg490rpXavk
31+
-----END CERTIFICATE-----
32+
-----BEGIN PRIVATE KEY-----
33+
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
82+
EyqjJVOYUopmtejzqNMx6o2AA2jSc/oI
83+
-----END PRIVATE KEY-----

tests/test_InfluxDBClient.py

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,64 @@
1+
import http.server
2+
import json
3+
import threading
14
import unittest
25

36
from influxdb_client import InfluxDBClient
47

58

69
class InfluxDBClientTest(unittest.TestCase):
710

11+
def tearDown(self) -> None:
12+
if self.client:
13+
self.client.close()
14+
if hasattr(self, 'httpd'):
15+
self.httpd.shutdown()
16+
if hasattr(self, 'httpd_thread'):
17+
self.httpd_thread.join()
18+
819
def test_TrailingSlashInUrl(self):
9-
client = InfluxDBClient(url="http://localhost:9999", token="my-token", org="my-org")
10-
self.assertEqual('http://localhost:9999', client.api_client.configuration.host)
20+
self.client = InfluxDBClient(url="http://localhost:9999", token="my-token", org="my-org")
21+
self.assertEqual('http://localhost:9999', self.client.api_client.configuration.host)
22+
23+
self.client = InfluxDBClient(url="http://localhost:9999/", token="my-token", org="my-org")
24+
self.assertEqual('http://localhost:9999', self.client.api_client.configuration.host)
25+
26+
def test_ConnectToSelfSignedServer(self):
27+
import http.server
28+
import ssl
29+
import os
30+
31+
# Disable unverified HTTPS requests
32+
import urllib3
33+
urllib3.disable_warnings()
34+
35+
# Configure HTTP server
36+
self.httpd = http.server.HTTPServer(('localhost', 0), ServerWithSelfSingedSSL)
37+
self.httpd.socket = ssl.wrap_socket(self.httpd.socket, certfile=f'{os.path.dirname(__file__)}/server.pem',
38+
server_side=True)
39+
40+
# Start server at background
41+
self.httpd_thread = threading.Thread(target=self.httpd.serve_forever)
42+
self.httpd_thread.start()
43+
44+
self.client = InfluxDBClient(f"https://localhost:{self.httpd.server_address[1]}",
45+
token="my-token", verify_ssl=False)
46+
health = self.client.health()
47+
48+
self.assertEqual(health.message, 'ready for queries and writes')
49+
self.assertEqual(health.status, "pass")
50+
self.assertEqual(health.name, "influxdb")
51+
52+
53+
class ServerWithSelfSingedSSL(http.server.SimpleHTTPRequestHandler):
54+
def _set_headers(self):
55+
self.send_response(200)
56+
self.send_header('Content-type', 'application/json')
57+
self.end_headers()
1158

12-
client = InfluxDBClient(url="http://localhost:9999/", token="my-token", org="my-org")
13-
self.assertEqual('http://localhost:9999', client.api_client.configuration.host)
59+
def do_GET(self):
60+
self._set_headers()
61+
response = json.dumps(
62+
dict(name="influxdb", message="ready for queries and writes", status="pass", checks=[], version="2.0.0",
63+
commit="abcdefgh")).encode('utf-8')
64+
self.wfile.write(response)

0 commit comments

Comments
 (0)