Использование движка openssl, не используемого по умолчанию, с помощью netty-tcnative

#java #spring-boot #openssl #netty #amazon-cloudhsm

Вопрос:

Вопрос 1) Как мне заставить netty-tcnative работать с движком openssl, который не используется по умолчанию? В моем случае я пытаюсь использовать движок cloudhsm. Есть ли у кого-нибудь опыт загрузки этого двигателя или любого другого двигателя подобным образом. Я задокументировал проблемы, с которыми сталкиваюсь ниже.

Вопрос 2) Должна ли версия openssl, сообщенная netty-tcnative при инициализации в журналах, соответствовать собственной версии установки openssl? Я бы ожидал, что это произойдет, однако это не в моем случае. Возможно, это имеет отношение к делу, я не уверен.

Более подробно У меня есть контейнер docker, который может получить доступ к AWS CloudHSM. Я могу использовать openssl и cloudhsm в контейнере, используя openssl в командной строке.

 [root@1f094ffd14e4 ob-shell]# openssl engine
(rdrand) Intel RDRAND engine
(dynamic) Dynamic engine loading support

[root@1f094ffd14e4 ob-shell]# openssl engine cloudhsm
(cloudhsm) CloudHSM hardware engine support
 

Все работает так, как я и ожидал. Собственная версия openssl-1.0.2 k-fips

 [root@1f094ffd14e4 ob-shell]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
 

Мне требуется Java-приложение, использующее netty-tcnative, для доступа к HSM с помощью openssl. Я не могу использовать подход JCE из-за того, что он не работает с JDK > JDK8. AWS не поддерживают JDK11/JDK17.

Я использую динамически связанную версию netty-tcnative.

     <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-tcnative</artifactId>
        <classifier>linux-x86_64-fedora</classifier>
        <version>2.0.38.Final</version>
    </dependency>
 

Это хорошо работает, и я могу видеть детали конфигурации netty openssl при использовании движка по умолчанию.

2021-09-02 13:07:45.905 ОТЛАДКА 7 — — — [ основной] io.netty.обработчик.ssl.OpenSSL : Инициализация netty-tcnative с использованием движка: «по умолчанию» 2021-09-02 13:07:45.906 ОТЛАДКА 7 — [
основной] ввод-вывод.netty.обработчик.ssl.OpenSSL : нетто-приложение с использованием собственной библиотеки: OpenSSL 1.0.1 e-fips 11 февраля 2013

Однако для использования HSM мне нужно использовать движок cloudhsm. Вот тут-то и начинаются неприятности. Когда я пытаюсь включить механизм cloudhsm со следующим системным свойством-Dio.netty.handler.ssl.openssl.engine=cloudhsm У меня возникают проблемы. Движок cloudhsm вообще не загружается.

2021-09-02 17:19:49.433 ОТЛАДКА 7 — [ основной] i.n.util.internal.NativeLibraryLoader : Успешно загружена библиотека /tmp/libnetty_tcnative_linux_x86_64569349996051888224.поэтому 2021-09-02 17:19:49.434 ОТЛАДКА 7 — — — [ основной] ввод-вывод.netty.обработчик.ssl.OpenSSL : Инициализация нетти-ткнатива с помощью движка: Ошибка «cloudhsm» при чтении методов дайджеста, отличных от fips, из библиотеки.Ошибка кэширования дайджеста программного обеспечения. Динамический движок: сбой загрузки cloudhsm 2021-09-02 17:19:49.437 ОТЛАДКА 7 — — — [
основной] ввод-вывод.нетти.обработчик.ssl.OpenSSL : Не удалось инициализировать netty-tcnative; OpenSslEngine будет недоступен. Видишь https://netty.io/wiki/forked-tomcat-native.html для получения дополнительной информации.

java.lang.Исключение: Эта функция не была реализована на этой платформе в io.netty.internal.tcnative.SSL.инициализация(собственный метод) ~[netty-tcnative-2.0.38.Final-linux-x86_64-fedora.jar:na] в io.netty.internal.tcnative.Библиотека.инициализировать(Библиотека.java:158) ~[netty-tcnative-2.0.38.Final-linux-x86_64-fedora.jar:na] в io.netty.обработчик.ssl.OpenSSL.Инициализация(OpenSSL.java:597) ~[обработчик нетти-4.1.63.Финал.jar:4.1.63.Финал] в io.netty.обработчик.ssl.OpenSSL.(OpenSSL.java:153) ~[netty-обработчик-4.1.63.Final.jar:4.1.63.Final] в io.нетти.обработчик.ssl.ReferenceCountedOpenSslContext.(ReferenceCountedOpenSslContext.java:207) ~[обработчик нетти-4.1.63.Final.jar:4.1.63.Final] в io.netty.обработчик.ssl.OpenSslContext.(OpenSslContext.java:36) ~[обработчик нетти-4.1.63.Final.jar:4.1.63.Final] в io.netty.обработчик.ssl.OpenSslClientContext.(OpenSslClientContext.java:191) ~[обработчик нетти-4.1.63.Final.jar:4.1.63.Final] в io.netty.обработчик.ssl.SSLContext.newClientContextInternal(SSLContext.java:830) ~[обработчик нетти-4.1.63.Финал.jar:4.1.63.Финал] в io.netty.обработчик.ssl.SslContextBuilder.сборка(SslContextBuilder.java:614) ~[netty-обработчик-4.1.63.Final.jar:4.1.63.Final] по командам com.me.NettyCommands.эксперимент(NettyCommands.java:44) ~[классы/:1.0-СНИМОК] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Собственный метод) ~[na:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] в java.base/jdk.internal.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) ~[na:na] в java.base/java.lang.reflect.Метод.вызов(Метод.java:566) ~[na:na] в организации.пружинная конструкция.использование.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.6.jar:5.3.6] в org.springframework.shell.Shell.оцените(Shell.java:169) ~[spring-shell-core-2.0.0.RELEASE.jar:2.0.0.RELEASE] в org.springframework.shell.Shell.run(Shell.java:134) ~[spring-shell-core-2.0.0.RELEASE.jar:2.0.0.RELEASE] в org.springframework.shell.jline.InteractiveShellApplicationRunner.run(InteractiveShellApplicationRunner.java:84) ~[spring-shell-core-2.0.0.RELEASE.jar:2.0.0.RELEASE] в org.springframework.boot.SpringApplication.callRunner(приложение SpringApplication.java:810) ~[spring-boot-2.4.5.jar:2.4.5] в org.springframework.boot.SpringApplication.Запуск вызовов(SpringApplication.java:800) ~[spring-boot-2.4.5.jar:2.4.5] в org.springframework.boot.SpringApplication.запустите(SpringApplication.java:346) ~[spring-boot-2.4.5.jar:2.4.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1340) ~[spring-boot-2.4.5.jar:2.4.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.5.jar:2.4.5] в com.me.Application.main(Приложение.java:41) ~[классы/:1.0-СНИМОК] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Собственный метод) ~[na:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] в java.base/jdk.internal.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) ~[na:na] в java.base/java.lang.reflect.Метод.вызов(Метод.java:566) ~[na:na] в org.springframework.boot.loader.Mainmethod. run(mainmethod. java:49) ~[оболочка/:na] в org.springframework.boot.loader.Пусковая установка.запустите(Launcher.java:108) ~[ob-shell/:na] в организации.пружинный каркас.загрузчик.загрузчик.Пусковая установка.запустите(Launcher.java:58) ~[ob-оболочка/:na] в org.springframework.загрузчик.загрузчик.JarLauncher.main(JarLauncher.java:88) ~[оболочка/:na]

Есть какие-нибудь идеи?

Комментарии:

1. можете ли вы попробовать последнюю версию netty-tcnative ? Тем не менее, я сомневаюсь, что это поможет. Можете ли вы загрузить двигатель через cmdline ?

2. Спасибо @Norman — То же самое с последним выпуском netty-tcnative. Я могу загрузить движок из командной строки.

3. Пожалуйста, откройте проблему и прикрепите соответствующий двигатель.

4. Спасибо Норман — github.com/netty/netty-tcnative/issues/659