Сервер и клиент находятся на Windows Server 2022
Этот сервер имеет политику безопасности: Basic256Sha256, режим безопасности сообщений: подпись и анонимную аутентификацию.
Мне удается подключиться и получить значения переменных с помощью Ua Expert
Я уже протестировал несколько библиотек Python, но не могу найти работающий скрипт. Я думаю, это из-за сертификатов, но я не все понимаю в сертификатах.
в примере ниже:
Код: Выделить всё
from opcua import Client, ua
url = "opc.tcp://srvbeathcs01:44683/ABB/800xA/OPC/UA/Server"
client = Client(url)
client.set_security_string("Basic256Sha256,Sign,cert.pem,key.pem")
client.connect()
print(f"Connected to: {url}")
servicelevel_node = client.get_node("ns=2;b=ADwDSDdc1EO/1/EufyBvM8qrOcZ9hX9NnGQgzR8uGN1FbmVyZ2llRWxlYy5Db21wdGV1cjkudWludDI=")
servicelevel_node_value = servicelevel_node.get_value()
print(servicelevel_node_value)
client.disconnect()
Я попробовал сгенерировать сертификаты с помощью этого скрипта:
Код: Выделить всё
from OpenSSL import crypto
def generate_certificates():
# Générer une clé privée
key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
# Générer un certificat auto-signé
cert = crypto.X509()
cert.set_version(2)
cert.set_serial_number(1000)
cert.get_subject().CN = "test.com"
cert.set_issuer(cert.get_subject())
cert.set_notBefore(b'20240101000000Z')
cert.set_notAfter(b'20250101000000Z')
cert.set_pubkey(key)
cert.sign(key, 'sha256')
# Sauvegarder la clé privée et le certificat dans des fichiers
with open("key.pem", "wb") as key_file:
key_file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))
with open("cert.pem", "wb") as cert_file:
cert_file.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
print("Certificats generated!")
if __name__ == "__main__":
generate_certificates()
На стороне сервера я получаю запрос и могу доверять сертификату (test.com) в этот пример.
Но при попытке подключения я получаю сообщение об ошибке:
Код: Выделить всё
Received an error: MessageAbort(error:StatusCode(BadSecurityChecksFailed), reason:Could not verify security on OpenSecureChannel request.)
Received an error: MessageAbort(error:StatusCode(BadSecurityChecksFailed), reason:Could not verify security on OpenSecureChannel request.)
Protocol Error
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 101, in _run
self._receive()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 121, in _receive
self._call_callback(0, ua.UaStatusCodeError(msg.Error.value))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 129, in _call_callback
raise ua.UaError(
opcua.ua.uaerrors._base.UaError: No future object found for request: 0, callbacks in list are dict_keys([1])
exception calling callback for
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures\_base.py", line 340, in _invoke_callbacks
callback(self)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 201, in clb
response = struct_from_binary(ua.OpenSecureChannelResponse, future.result())
^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures\_base.py", line 447, in result
raise CancelledError()
concurrent.futures._base.CancelledError
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Python\Code.py", line 9, in
client.connect()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\client.py", line 275, in connect
self.open_secure_channel()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\client.py", line 335, in open_secure_channel
result = self.uaclient.open_secure_channel(params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 275, in open_secure_channel
return self._uasocket.open_secure_channel(params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\opcua\client\ua_client.py", line 209, in open_secure_channel
response = clb.future.result(self.timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures\_base.py", line 458, in result
raise TimeoutError()
TimeoutError
Подробнее здесь: https://stackoverflow.com/questions/788 ... ith-python