Мы разработали печатную плату, объединяющую несколько датчиков и систему на модуле (SoM), используя Torizon (дистрибутив Linux), одну из ролей этой печатной платы предназначен для размещения сервера OPC-UA.
Мы также включили в печатную плату Infineon 9673 TPM 2.0, связанный через I2C с Linux SoM, идея заключалась в том, чтобы выделить криптографические генерация ключей, хранение и криптографические функции (шифрование/дешифрование, подпись и т. д.) для этого модуля TPM.
Сервер OPC-UA запускается в контейнере Docker в SOM, а Архитектура TPM следующая:
- ЦС создан в контейнере (SoM) и отвечает за
проверку сертификатов OPC-UA (клиент и сервер). - В доверенном платформенном модуле создан набор постоянных ключей (открытый и закрытый).
Код: Выделить всё
openssl req -provider tpm2 -provider default -propquery '?provider=tpm2' -new -subj "/C=FR/O=entreprise/CN=Certificat_Server_OPC_UA" -key handle:0xhandle -out server_rsa.csr
Код: Выделить всё
openssl x509 -req in server_opc_ua.csr -CA /path/to/CA/ca.crt -CAkey /path/to/cakey/ca.key -CAcreateserial -out serveur_opc_ua_certificate.crt -days 365 sha256
Код: Выделить всё
openssl x509 -in server_opc_ua_certificate.crt -noout -text
Для клиентов, желающих подключиться к серверу OPC-UA, идея состоит в том, что они отправят свои соответствующие CSR в SoM, который позаботится о создании сертификатов и отправке их обратно.
Сервер OPC-UA запрограммирован на Python и использует бесплатную библиотеку OPC-UA
(https://github.com/FreeOpcUa)
Следующим шагом является загрузка сертификата и закрытого ключа (из TPM) на сервер OPC-UA.
Библиотека предоставляет следующие методы:
load_certificate(path) загрузить сертификат сервера из файла, pem или der
load_private_key(path)
Мы знаем, что это невозможно извлечь закрытый ключ из TPM, в этом и заключается идея этого модуля. Мы использовали механизм: tpm2-pkcs#11, чтобы создать токен, связанный с нашим ключом в TPM, а затем открыть сеанс, который позволил бы серверу OPC-UA получить доступ к нашему закрытому ключу для выполнения криптографических операций.
Для этого использовалась библиотека Python PyKCS11, и можно получить доступ к нашему закрытому ключу:
Код: Выделить всё
lib = self.get_PYKCS11LIB()
print("PYKCS11LIB={}".format(lib))
os.environ["PYKCS11LIB"] = lib
pkcs11 = PyKCS11.PyKCS11Lib()
pkcs11.load(lib) # define environment variable PYKCS11LIB=YourPKCS11Lib
# Obtention de la liste des slots où un token est présent
slots = pkcs11.getSlotList(tokenPresent=True)
print("Slots disponibles: ", len(slots), slots)
slot = pkcs11.getSlotList(tokenPresent=True)[0]
print(f"slot : {slot}")
print(f"ouverture de session")
session = pkcs11.openSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION)
print(f"tentative de login")
session.login(user_pin)
print(f"trouver la première clé privée")
privKey = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])[0]
print(f"private_key_data: { privKey }")
Существует ли реализация взаимодействия TPM с сервером Python OPC-UA или даже с другим языком программирования?
Этот документ с официального сайта OPC-UA документация:
https://opcconnect.opcfoundation.org/20 ... lications/
Поясняет, что TPM повышает безопасность серверов OPC-UA. Мне кажется странным, что невозможно связать наш TPM с конфигурацией сервера OPC-UA:
'Хранилище сертификатов и закрытых ключей: никогда не храните закрытые ключи или соответствующие файлы сертификатов. (.pfx/p12) в незашифрованной файловой системе. Используйте выделенные хранилища сертификатов вашей операционной системы и используйте возможности операционной системы для настройки прав доступа. Модули TPM или внешнее защищенное оборудование, такое как токены аутентификации на основе USB для хранения сертификатов и/или закрытых ключей, повышают уровень безопасности».
Я провел небольшое исследование, чтобы обойти эту проблему, и нашел способ механизм в TPM: tpm2_duulate -> Закрытый ключ RSA, созданный в TPM, с атрибутами, позволяющими дублировать его на другой платформе. Этот ключ защищен родительским ключом и экспортируется в зашифрованном виде.
Можно было бы используйте этот ключ для расшифровки закрытый ключ в традиционном файле (формат PEM или DER) и передать его на сервер Python OPC-UA.
Знаете ли вы, возможно ли это?
Если да, то с точки зрения кибербезопасности этот процесс менее надежен, чем использование «стандартного» закрытого ключа TPM, т. е. такого, который не выходит за пределы TPM, поскольку мы собираемся хранить закрытый ключ в незашифрованном файле. в Linux (SoM).
Подробнее здесь: https://stackoverflow.com/questions/792 ... ver-python
Мобильная версия