Python op c -ua связь с использованием самозаверяющего сертификата и шифрования basic128rsa15 - PullRequest
1 голос
/ 23 марта 2020

Я хочу связаться через библиотеку opcua python с сервером opcua, который использует шифрование Basic128Rsa15.

client.set_security_string("Basic128Rsa15,"
                               "SignAndEncrypt,"
                               "cert.pem,"
                               "key.pem")

Я сделал то же сообщение с сервером Prosys, используя шифрование Basic256Sha256, и все было в порядке. С Basic128Rsa15 (с использованием KEPserver) я получаю следующую ошибку:

In [19]: runfile('opcuaclient.py', wdir='/home/di29394/fue4bfi/python/fuere4bfi')
DEPRECATED! Do not use SecurityPolicyBasic128Rsa15 anymore!
Received an error: MessageAbort(error:StatusCode(BadSecurityChecksFailed), reason:An error occurred verifying security.)
Received an error: MessageAbort(error:StatusCode(BadSecurityChecksFailed), reason:An error occurred verifying security.)
Protocol Error
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/opcua/client/ua_client.py", line 101, in _run
    self._receive()
  File "/usr/local/lib/python3.6/dist-packages/opcua/client/ua_client.py", line 121, in _receive
    self._call_callback(0, ua.UaStatusCodeError(msg.Error.value))
  File "/usr/local/lib/python3.6/dist-packages/opcua/client/ua_client.py", line 131, in _call_callback
    .format(request_id, self._callbackmap.keys())
opcua.ua.uaerrors._base.UaError: No future object found for request: 0, callbacks in list are 
Traceback (most recent call last):

  File "<ipython-input-18-4187edd51b2b>", line 1, in <module>
    runfile('opcuaclient.py', wdir='/home/opcuauser')

  File "/usr/lib/python3/dist-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3/dist-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "opcuaclient.py", line 57, in <module>
    connected = client.connect()

  File "/usr/local/lib/python3.6/dist-packages/opcua/client/client.py", line 259, in connect
    self.open_secure_channel()

  File "/usr/local/lib/python3.6/dist-packages/opcua/client/client.py", line 309, in open_secure_channel
    result = self.uaclient.open_secure_channel(params)

  File "/usr/local/lib/python3.6/dist-packages/opcua/client/ua_client.py", line 265, in open_secure_channel
    return self._uasocket.open_secure_channel(params)

  File "/usr/local/lib/python3.6/dist-packages/opcua/client/ua_client.py", line 199, in open_secure_channel
    response = struct_from_binary(ua.OpenSecureChannelResponse, future.result(self.timeout))

  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 430, in result
    raise CancelledError()

CancelledError

Сертификат был самозаверяющим, используя библиотеку криптографии (фрагмент):

cert = (
        x509.CertificateBuilder()
        .subject_name(name)
        .issuer_name(name)
        .public_key(key.public_key())
        .serial_number(1000)
        .not_valid_before(now)
        .not_valid_after(now + timedelta(days=10*365)) # ggf. auch dynamisch machen
        .add_extension(basic_contraints, False)
        .add_extension(san, False)
        .sign(key, hashes.SHA256(), default_backend())

Нужно ли изменять генерацию сертификата в соответствии с to Basic128Rsa15 или что-то не так?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Я чувствовал себя не очень хорошо с использованием Basic128Rsa15. Но, очевидно, это не было проблемой. Проблема заключалась в том, что я был подключен к KEPServer как минимум два раза с разными сертификатами, но с одним и тем же действительным URI. У сервера были проблемы с этим, поэтому отклонил все входящие соединения (сообщение об ошибке, кажется, не очень полезно). После удаления всех запросов на сервере и повторного подключения все было в порядке (даже с Basic128Rsa15).

0 голосов
/ 23 марта 2020

Сообщение об ошибке на самом деле совершенно ясно!

УСТАРЕЛО! Больше не используйте SecurityPolicyBasic128Rsa15!

Basic128Rsa15 больше не считается безопасным для OP C Foundation и рекомендуется использовать его как устаревшее.

Источник: http://opcfoundation-onlineapplications.org/ProfileReporting/index.htm?ModifyProfile.aspx? ProfileID = a84d5b70-47b2-45ca-a0 cc -e98fe8528f3d

Возможно, есть возможность использовать его с KEPServerEx, но я не буду рекомендовать использовать его для чего-то другого чем тестирование.

Примечание: Basic256 также считается устаревшим для OP C Foundation, минимальная рекомендуемая политика безопасности OP C UA тогда равна Basic256Sha256 .

Некоторые OP C UA-клиент и сервер уже поддерживают новейшие и более безопасные политики безопасности:

  • Aes128Sha256RsaOaep
  • Aes256Sha256RsaPss
...