Соединение Azure не может подключиться Ошибка сертификата - PullRequest
0 голосов
/ 01 февраля 2019

Я с трудом пытаюсь пройти аутентификацию на основе определенного идентификатора клиента Azure.Я использую следующий код:

public abstract class Azure
{
    private final static String GRAPH = "https://graph.windows.net/";
    private Logger objLogger;
    private String strAccessToken;
    private String strTenantID;
    private String strLogin;
    private String strAuthorize;
    private String strGraph;
    private String strApplicationID;
    private String strUsername;
    private String strPassword;
    public String getAccessToken() throws InvalidKeyException, MalformedURLException, ServiceUnavailableException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InterruptedException, ExecutionException
    {
        if (this.strAccessToken == null)
        {
            this.setAccessToken();
        }
        return this.strAccessToken;
    }
    private void setAccessToken() throws MalformedURLException, InterruptedException, ExecutionException, ServiceUnavailableException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException
    {
        AuthenticationContext objContext;
        AuthenticationResult objToken;
        ExecutorService objService;
        Future<AuthenticationResult> objFuture;
        objService = null;
        objToken = null;
        try
        {
            objService = Executors.newFixedThreadPool(1);
            objContext = new AuthenticationContext(this.getAuthorize(), false, objService);
            objFuture = objContext.acquireToken(GRAPH, this.getApplicationID(), this.getUsername(), this.getPassword(), null);
            objToken = objFuture.get();
            this.getLogger().info("Connection to Azure ".concat(this.getClass().getSimpleName().toLowerCase()).concat(" successfully stablished"));
        }
        finally
        {
            objService.shutdown();
        }
        if (objToken == null)
        {
            throw new ServiceUnavailableException("Authentication Service is not available");
        }
        this.strAccessToken = objToken.getAccessToken();
    }
    public void setGraph()
    {
        this.strGraph = GRAPH.concat(this.getTenantID());
    }
}

public class Connection1 extends Azure
{
    private static Connection1 objInstance;
    private Connection1() throws ParameterException, IOException, ParserConfigurationException, SAXException
    {
        super();
        this.setTenantID(<Tenant ID>);
        this.setLogin("https://login.microsoftonline.com/".concat(this.getTenantID()));
        this.setAuthorize(this.getLogin().concat("/oauth2/authorize"));
        this.setGraph();
        this.setApplicationID(<Application ID>);
        this.setAccessToken(null);
        this.setUsername(<username>);
        this.setPassword(<password>);
        this.setLogger();
    }
    public static Azure getInstance() throws ParameterException, IOException, ParserConfigurationException, SAXException
    {
        if (objInstance == null)
        {
            objInstance = new Connection1();
        }
        return objInstance;
    }
}

У меня есть два класса Connection1 и Connection2.Connection2 - это копия Connection1, единственное, что я изменил, это:

1) Арендатор ID

2) Идентификатор приложения

3) Имя пользователя

4) Пароль.

С Connection1 я могу аутентифицировать и получать данные без каких-либо проблем.Проблема возникает с Connection2, с этой я получаю следующую ошибку:

[pool-3-thread-1] ERROR com.microsoft.aad.adal4j.AuthenticationContext - [Correlation ID: 63cc6344-2bc1-4f61-aaa0-a2f07acb172b] Execution of class com.microsoft.aad.adal4j.AcquireTokenCallable failed.
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Кажется, это ошибка сертификата, поэтому я немного поищу в Интернете, и они рекомендуют добавить "DigiCert Baltimore Root" сертификат для моего хранилища сертификатов.Сертификат уже есть.Ты хоть представляешь, как мне с этим столкнуться?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

На самом деле найти проблему.Я использовал TamperData addIn из Firefox и проверял каждое перенаправление, чтобы получить все сайты с соответствующими сертификатами.Похоже, что в этом конкретном арендаторе произошли изменения: вместо использования DigiCert Baltimore Root он заканчивается на Entrust.net Root

0 голосов
/ 05 февраля 2019

В соответствии с вашей информацией об ошибке, под двумя блогами вы можете обратиться, чтобы решить эту проблему unable to find valid certification path to requested target.

  1. https://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
  2. http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target

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

Между тем, только я думаю, что возможной причиной является конкуренция за ресурсы для хранилища сертификатов в JVM.Поэтому, если вы запускаете Connection1 и Connection2 в экземпляре JVM, вы можете попытаться запустить их отдельно на отдельном экземпляре JVM или скопировать каталог JAVA_HOME и установить временный JAVA_HOME & * 1020.* переменные окружения в командной строке для запуска других Connection2 без какого-либо общего ресурса с ними.

...