Я пытаюсь подключиться к кластеру cassandra через драйвер java datastax с openssl в соответствии с этим документом https://docs.datastax.com/en/developer/java-driver/3.1/manual/ssl/ с моим клиентским сертификатом и ключом и хранилищем доверенных сертификатов, поскольку мой кластер cassandra требует двусторонней взаимной проверки подлинности сертификата
Вот мой код
public static void main( String[] args ) throws Exception
{
KeyStore ks = KeyStore.getInstance("JKS");
// make sure you close this stream properly (not shown here for brevity)
InputStream trustStore = new FileInputStream("MyTrustStore");
ks.load(trustStore, "abcdef".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SslContextBuilder builder = SslContextBuilder
.forClient()
.sslProvider(SslProvider.OPENSSL)
.trustManager(tmf)
// only if you use client authentication
.keyManager(new File("client_cert"), new File("private_key"));
SSLOptions sslOptions = new NettySSLOptions(builder.build());
Cluster cluster = Cluster.builder()
.addContactPoint("w.x.y.z")
.withSSL(sslOptions)
.build();
}
со следующими зависимостями в моем pom
<dependencies>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative</artifactId>
<version>2.0.25.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>2.0.0.Final</version>
<classifier>osx-x86_64</classifier>
</dependency>
</dependencies>
Но я получаю сообщение об ошибке
Exception in thread "main" java.lang.UnsatisfiedLinkError: failed to load the required native library
at io.netty.handler.ssl.OpenSsl.ensureAvailability(OpenSsl.java:327)
at io.netty.handler.ssl.ReferenceCountedOpenSslContext.<init>(ReferenceCountedOpenSslContext.java:193)
at io.netty.handler.ssl.ReferenceCountedOpenSslContext.<init>(ReferenceCountedOpenSslContext.java:182)
at io.netty.handler.ssl.OpenSslContext.<init>(OpenSslContext.java:34)
at io.netty.handler.ssl.OpenSslClientContext.<init>(OpenSslClientContext.java:188)
at io.netty.handler.ssl.SslContext.newClientContextInternal(SslContext.java:775)
at io.netty.handler.ssl.SslContextBuilder.build(SslContextBuilder.java:446)
at com.example.App.main(App.java:41)
Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty_tcnative_osx_x86_64, netty_tcnative_x86_64, netty_tcnative]
at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:93)
at io.netty.handler.ssl.OpenSsl.loadTcNative(OpenSsl.java:421)
at io.netty.handler.ssl.OpenSsl.<clinit>(OpenSsl.java:89)
... 7 more
Я попытался удалить Boringssl-static или tcnative dep из pom, но это все еще не работает. Любая помощь будет принята с благодарностью.
заранее спасибо
@Jayr Спасибо за ваш ответ. Я использую последнюю версию, а также добавил netty-tcnative в свой файл dep. Не уверен, что еще я могу сделать, основываясь на проблеме с github.
Вы включили трассировку? В потоке, которым поделились, в конце концов может появиться сообщение об успешной загрузке натива после того, как класс создал «так» во временной папке.
Я подозреваю, что здесь может происходить какая-то несовместимость между используемыми здесь версиями netty
, netty-tcnative
и netty-tcnative-boringssl-static
.
В предыдущих экспериментах я обнаружил, что версии netty
и netty-tcnative
особенно важны, поскольку между ними может быть несовместимость.
Java-драйвер datastax 3.6.0 зависит от netty 4.0.56.Final и указывает netty-tcnative 2.0.7.Final как необязательную зависимость. Вы также можете найти в документации для java-драйвера 3.6.0, который рекомендуется 2.0.7.Final:
There are known runtime incompatibilities between newer versions of netty-tcnative and the version of netty that the driver uses. For best results, use version 2.0.7.Final.
Я также подозреваю, что использование одной и той же версии netty-tcnative
и netty-tcnative-boringssl-static
может привести к несовместимости. Я бы рекомендовал попробовать те же версии.
Поскольку я тестировал это, я бы сначала попробовал следующую конфигурацию:
<dependencies>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative</artifactId>
<version>2.0.7.Final</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>2.0.7.Final</version>
<classifier>osx-x86_64</classifier>
</dependency>
</dependencies>
Создан datastax-oss.atlassian.net/browse/JAVA-2267, чтобы рассмотреть вопрос об обновлении зависимости netty 4.0.x драйвера Java, чтобы с ним работали более новые версии netty-tcnative.
Посмотрите, поможет ли это: github.com/netty/netty-tcnative/issues/331