Подключитесь к политике безопасности OPC Ua Basic256Sha256 с помощью PythonPython

Программы на Python
Anonymous
Подключитесь к политике безопасности OPC Ua Basic256Sha256 с помощью Python

Сообщение Anonymous »

Я пытаюсь подключиться к серверу OPC Ua, чтобы иметь возможность читать переменные с помощью кода Python.
Сервер и клиент находятся на 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()
Как получить cert.pem и key.pem, существует ли простой скрипт Python для их создания? У меня также есть сертификат сервера в формате .der, нужно ли мне что-то с ним делать?
Я попробовал сгенерировать сертификаты с помощью этого скрипта:

Код: Выделить всё

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

Вернуться в «Python»