Я новичок в Milo и столкнулся с проблемой: мне нужно установить соединение между клиентом milo и сервером (оба на локальном хосте) с использованием сертификата X509. Для этого я использовал классы KeyStoreLoader из https://github.com/eclipse/milo/tree/master/milo-examples оставив их почти нетронутыми. И сервер, и клиент загружаются без проблем, но клиент не подключается, выдавая:
13:07:34.671 [main] INFO milo_test.client.BrowseExample - security temp dir: /tmp/security
13:07:34.671 [main] INFO milo_test.client.KeyStoreLoader - Loading KeyStore at /tmp/security/example-client.pem
13:07:35.417 [main] ERROR milo_test.client.ClientExampleRunner - Error running client example: UaServiceFaultException: status=Bad_SecurityChecksFailed, message=An error occurred verifying security.
java.util.concurrent.ExecutionException: UaServiceFaultException: status=Bad_SecurityChecksFailed, message=An error occurred verifying security.
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908)
at milo_test.client.BrowseExample.run(BrowseExample.java:35)
at milo_test.client.ClientExampleRunner.run(ClientExampleRunner.java:121)
at milo_test.client.BrowseExample.main(BrowseExample.java:27)
Caused by: org.eclipse.milo.opcua.stack.core.UaServiceFaultException: status=Bad_SecurityChecksFailed, description=An error occurred verifying security.
at org.eclipse.milo.opcua.stack.client.UaStackClient.lambda$deliverResponse$5(UaStackClient.java:275)
at org.eclipse.milo.opcua.stack.core.util.ExecutionQueue$Task.run(ExecutionQueue.java:119)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
13:07:35.420 [ForkJoinPool.commonPool-worker-1] ERROR milo_test.client.ClientExampleRunner - Error running example: UaServiceFaultException: status=Bad_SecurityChecksFailed, message=An error occurred verifying security.
Внутри интерфейса ClientExample у меня есть этот метод getIdentityProvider():
default IdentityProvider getIdentityProvider() {
//return new AnonymousProvider();
//return new UsernameProvider("user", "pass");
File securityTempDir = new File(System.getProperty("java.io.tmpdir"), "security");
if (securityTempDir.exists() || securityTempDir.mkdirs()) {
try {
LoggerFactory.getLogger(getClass()).info("security temp dir: {}", securityTempDir.getAbsolutePath());
KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir.toPath());
return new X509IdentityProvider(loader.getClientCertificate(), loader.getClientKeyPair().getPrivate());
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
и если я использую AnonymusProvider() или UsernameProvider(), все идет нормально.
Теперь, основываясь на этом потоке, я искал securityTempDir, находя как сервер, так и клиентский сертификат и правильную структуру (/pki -> эмитенты, отклоненные и доверенные), но папка отклоненных всегда пуста, что делает невозможным перемещение сертификата в доверенные.
Что я могу сделать неправильно? Спасибо всем, кто может мне помочь!