Сертификат в Eclipse Milo

Я новичок в 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 -> эмитенты, отклоненные и доверенные), но папка отклоненных всегда пуста, что делает невозможным перемещение сертификата в доверенные.

Что я могу сделать неправильно? Спасибо всем, кто может мне помочь!


person tiggyliv    schedule 12.02.2021    source источник


Ответы (1)


Вы смешиваете сертификаты экземпляра приложения и отдельные сертификаты X509, которые используются для проверки подлинности. Каталоги безопасности и PKI необходимы для работы безопасного соединения, но не имеют ничего общего с аутентификацией удостоверения пользователя на основе X509.

Тем не менее, я думаю, что это может быть ошибка в серверном SDK, и если вы хотите открыть проблему в репозитории GitHub, мы можем изучить ее там.

person Kevin Herron    schedule 12.02.2021
comment
Привет, спасибо за ответ. Я видел, что вы имеете в виду под сертификатами экземпляра приложения и сертификатами аутентификации, но до сих пор не могу понять, как реализовать аутентификацию пользователя с использованием сертификатов X509. У вас есть рабочий пример, чтобы показать? - person tiggyliv; 17.02.2021
comment
Я думаю, что ваш модифицированный пример будет работать, если вы используете эту ветку, которая исправляет упомянутую мной ошибку: github.com /eclipse/milo/pull/771 - person Kevin Herron; 17.02.2021