@@ -376,9 +376,10 @@ class ModbusTlsServer(ModbusTcpServer):
376376 server context instance.
377377 """
378378
379- def __init__ (self , context , framer = None , identity = None ,
380- address = None , handler = None , allow_reuse_address = False ,
381- sslctx = None , certfile = None , keyfile = None , ** kwargs ):
379+ def __init__ (self , context , framer = None , identity = None , address = None ,
380+ sslctx = None , certfile = None , keyfile = None , password = None ,
381+ reqclicert = False , handler = None , allow_reuse_address = False ,
382+ ** kwargs ):
382383 """ Overloaded initializer for the ModbusTcpServer
383384
384385 If the identify structure is not passed in, the ModbusControlBlock
@@ -388,32 +389,24 @@ def __init__(self, context, framer=None, identity=None,
388389 :param framer: The framer strategy to use
389390 :param identity: An optional identify structure
390391 :param address: An optional (interface, port) to bind to.
391- :param handler: A handler for each client session; default is
392- ModbusConnectedRequestHandler
393- :param allow_reuse_address: Whether the server will allow the
394- reuse of an address.
395392 :param sslctx: The SSLContext to use for TLS (default None and auto
396393 create)
397394 :param certfile: The cert file path for TLS (used if sslctx is None)
398395 :param keyfile: The key file path for TLS (used if sslctx is None)
396+ :param password: The password for for decrypting the private key file
397+ :param reqclicert: Force the sever request client's certificate
398+ :param handler: A handler for each client session; default is
399+ ModbusConnectedRequestHandler
400+ :param allow_reuse_address: Whether the server will allow the
401+ reuse of an address.
399402 :param ignore_missing_slaves: True to not send errors on a request
400403 to a missing slave
401404 :param broadcast_enable: True to treat unit_id 0 as broadcast address,
402405 False to treat 0 as any other unit_id
403406 """
404407 framer = framer or ModbusTlsFramer
405- self .sslctx = sslctx
406- if self .sslctx is None :
407- self .sslctx = ssl .create_default_context ()
408- self .sslctx .load_cert_chain (certfile = certfile , keyfile = keyfile )
409- # According to MODBUS/TCP Security Protocol Specification, it is
410- # TLSv2 at least
411- self .sslctx .options |= ssl .OP_NO_TLSv1_1
412- self .sslctx .options |= ssl .OP_NO_TLSv1
413- self .sslctx .options |= ssl .OP_NO_SSLv3
414- self .sslctx .options |= ssl .OP_NO_SSLv2
415- self .sslctx .verify_mode = ssl .CERT_OPTIONAL
416- self .sslctx .check_hostname = False
408+ self .sslctx = sslctx_provider (sslctx , certfile , keyfile , password ,
409+ reqclicert )
417410
418411 ModbusTcpServer .__init__ (self , context , framer , identity , address ,
419412 handler , allow_reuse_address , ** kwargs )
@@ -627,7 +620,8 @@ def StartTcpServer(context=None, identity=None, address=None,
627620
628621
629622def StartTlsServer (context = None , identity = None , address = None , sslctx = None ,
630- certfile = None , keyfile = None , custom_functions = [], ** kwargs ):
623+ certfile = None , keyfile = None , password = None , reqclicert = False ,
624+ custom_functions = [], ** kwargs ):
631625 """ A factory to start and run a tls modbus server
632626
633627 :param context: The ModbusServerContext datastore
@@ -636,14 +630,16 @@ def StartTlsServer(context=None, identity=None, address=None, sslctx=None,
636630 :param sslctx: The SSLContext to use for TLS (default None and auto create)
637631 :param certfile: The cert file path for TLS (used if sslctx is None)
638632 :param keyfile: The key file path for TLS (used if sslctx is None)
633+ :param password: The password for for decrypting the private key file
634+ :param reqclicert: Force the sever request client's certificate
639635 :param custom_functions: An optional list of custom function classes
640636 supported by server instance.
641637 :param ignore_missing_slaves: True to not send errors on a request to a
642638 missing slave
643639 """
644640 framer = kwargs .pop ("framer" , ModbusTlsFramer )
645- server = ModbusTlsServer (context , framer , identity , address , sslctx = sslctx ,
646- certfile = certfile , keyfile = keyfile , ** kwargs )
641+ server = ModbusTlsServer (context , framer , identity , address , sslctx ,
642+ certfile , keyfile , password , reqclicert , ** kwargs )
647643
648644 for f in custom_functions :
649645 server .decoder .register (f )
0 commit comments