diff --git a/pymodbus/server/server.py b/pymodbus/server/server.py index 004e06f60..d2cd1d2ae 100644 --- a/pymodbus/server/server.py +++ b/pymodbus/server/server.py @@ -117,6 +117,10 @@ def __init__( :param trace_connect: Called when connected/disconnected :param custom_pdu: list of ModbusPDU custom classes """ + if not sslctx: + raise TypeError( + "Cannot start server without a certificate, please add sslctx=" + ) self.tls_setup = CommParams( comm_type=CommType.TLS, comm_name="server_listener", diff --git a/test/server/test_server_asyncio.py b/test/server/test_server_asyncio.py index 5b577b1a8..21083c76a 100755 --- a/test/server/test_server_asyncio.py +++ b/test/server/test_server_asyncio.py @@ -10,6 +10,7 @@ import pytest +from examples.helper import generate_ssl, get_certificate from pymodbus import FramerType, ModbusDeviceIdentification from pymodbus.exceptions import NoSuchIdException from pymodbus.server import ( @@ -162,6 +163,11 @@ async def start_server( framer=FramerType.TLS, identity=self.identity, address=serv_addr, + sslctx=generate_ssl( + False, + certfile=get_certificate("crt"), + keyfile=get_certificate("key"), + ), ) elif do_udp: self.server = ModbusUdpServer( diff --git a/test/server/test_startstop.py b/test/server/test_startstop.py index 485b09c6c..ecf4da528 100755 --- a/test/server/test_startstop.py +++ b/test/server/test_startstop.py @@ -6,6 +6,7 @@ import pytest +from examples.helper import generate_ssl, get_certificate from pymodbus.datastore import ModbusDeviceContext, ModbusServerContext from pymodbus.server import ( ModbusBaseServer, @@ -59,9 +60,23 @@ async def test_StartAsyncTlsServer(self, mock_method): """Test StartAsyncTlsServer.""" mock_method.return_value = True await StartAsyncTlsServer( - ModbusServerContext(devices=ModbusDeviceContext(), single=True) + ModbusServerContext(devices=ModbusDeviceContext(), single=True), + sslctx=generate_ssl( + False, + certfile=get_certificate("crt"), + keyfile=get_certificate("key"), + ), ) + @mock.patch("pymodbus.server.ModbusBaseServer.serve_forever") + async def test_tls_no_cert(self, mock_method): + """Test StartAsyncTlsServer.""" + mock_method.return_value = True + with pytest.raises(TypeError): + await StartAsyncTlsServer( + ModbusServerContext(devices=ModbusDeviceContext(), single=True), + ) + @mock.patch("pymodbus.server.ModbusBaseServer.serve_forever") async def test_StartAsyncUdpServer(self, mock_method): """Test StartAsyncUdpServer.""" @@ -104,7 +119,14 @@ def test_StartTcpServer(self, mock_method): def test_StartTlsServer(self, mock_method): """Test StartTlsServer.""" mock_method.return_value = True - StartTlsServer(ModbusServerContext(devices=ModbusDeviceContext(), single=True)) + StartTlsServer( + ModbusServerContext(devices=ModbusDeviceContext(), single=True), + sslctx=generate_ssl( + False, + certfile=get_certificate("crt"), + keyfile=get_certificate("key"), + ), + ) @mock.patch("pymodbus.server.ModbusBaseServer.serve_forever") def test_StartUdpServer(self, mock_method):