Skip to content

Commit be17f46

Browse files
author
Rohit Saluja
committed
Update gnmi.py
1. Remove duplicate insecure_channel call 2. Add new parameter in connection called skip_verify 3. Fetch key form device and use
1 parent 328caec commit be17f46

File tree

1 file changed

+27
-1
lines changed
  • connector/src/yang/connector

1 file changed

+27
-1
lines changed

connector/src/yang/connector/gnmi.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
from google.protobuf import json_format
77
import grpc
88
from . import proto
9+
import ssl
10+
from cryptography import x509
11+
from cryptography.hazmat.backends import default_backend
912

1013

1114
try:
@@ -228,6 +231,7 @@ def __init__(self, *args, **kwargs):
228231
super().__init__(*args, **kwargs)
229232
self.device = kwargs.get('device')
230233
self.dev_args = self.connection_info
234+
self.skip_verify = kwargs.get('skip_verify')
231235
if self.dev_args.get('protocol', '') != 'gnmi':
232236
msg = 'Invalid protocol {0}'.format(self.dev_args.get('protocol', ''))
233237
raise TypeError(msg)
@@ -266,6 +270,7 @@ def connect(self):
266270
dev_args = self.dev_args
267271
username = dev_args.get('username', '')
268272
password = dev_args.get('password', '')
273+
skip_verify = dev_args.get('skip_verify')
269274

270275
if dev_args.get('custom_log', ''):
271276
self.log = dev_args.get('custom_log')
@@ -331,6 +336,28 @@ def connect(self):
331336
if private_key and os.path.isfile(private_key):
332337
private_key = open(private_key, 'rb').read()
333338

339+
if skip_verify and not root:
340+
try:
341+
ssl_cert = ssl.get_server_certificate((str(host), port)).encode("utf-8")
342+
except Exception as e:
343+
self.log.error(f'The SSH certificate cannot be retrieved from {target}')
344+
raise gNMIException(f'The SSH certificate cannot be retrieved from {target}', e)
345+
346+
ssl_cert_deserialized = x509.load_pem_x509_certificate(
347+
ssl_cert, default_backend()
348+
)
349+
350+
try:
351+
ssl_cert_common_name = ssl_cert_deserialized.subject.get_attributes_for_oid(
352+
(x509.oid.NameOID.COMMON_NAME)
353+
)[0].value
354+
options.append(
355+
('grpc.ssl_target_name_override', ssl_cert_common_name),
356+
)
357+
root = ssl_cert
358+
except BaseException as err:
359+
self.log.warning(f'Unable to get common name: {err}')
360+
334361
if any((root, chain, private_key)):
335362
override_name = dev_args.get('ssl_name_override', '')
336363
if override_name:
@@ -359,7 +386,6 @@ def connect(self):
359386
target, channel_creds, options
360387
)
361388
else:
362-
self.channel = grpc.insecure_channel(target)
363389
self.channel = grpc.insecure_channel(target, options)
364390
self.metadata = [
365391
("username", username),

0 commit comments

Comments
 (0)