Java не может найти доверенный сертификат (JKS)

Мне нужно использовать службу с использованием CXF, и я столкнулся со следующей проблемой.

Несмотря на то, что у меня было хранилище ключей Java (JKS), например, рабочий интерфейс SOAP, когда я использую его в своей программе Java, он всегда дает мне сообщение

sun.security.validator.ValidatorException: No trusted certificate found

Я проверил файл JKS, и сертификат находится там, поэтому, когда я помещаю его в проект SOAPUI, он распознается, и служба успешно вызывается без проблем. Я использую в качестве основы код, предоставленный веб-сайтом cxf (http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/wsdl_first_https/src/main/java/demo/hw_https/client/ClientNonSpring.java?view=log) следующим образом:

public static void setupTLS(Object port) throws FileNotFoundException, IOException, GeneralSecurityException
{
    final String keyStoreLoc = "d:/certs/mykeystore.jks";
    HTTPConduit httpConduit = (HTTPConduit) ClientProxy.getClient(port).getConduit();

    TLSClientParameters tlsCP = new TLSClientParameters();
    final String keyPassword ="password";
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(new FileInputStream(keyStoreLoc), keyPassword.toCharArray());
    KeyManager[] myKeyManagers = getKeyManagers(keyStore, keyPassword);
    tlsCP.setKeyManagers(myKeyManagers);

    KeyStore trustStore = KeyStore.getInstance("JKS");
    trustStore.load(new FileInputStream(keyStoreLoc), keyPassword.toCharArray());
    TrustManager[] myTrustStoreKeyManagers = getTrustManagers(trustStore);
    tlsCP.setTrustManagers(myTrustStoreKeyManagers);
    httpConduit.setTlsClientParameters(tlsCP);
}

private static TrustManager[] getTrustManagers(KeyStore trustStore)
        throws NoSuchAlgorithmException, KeyStoreException
{
    String alg = KeyManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory fac = TrustManagerFactory.getInstance(alg);
    fac.init(trustStore);
    return fac.getTrustManagers();
}

private static KeyManager[] getKeyManagers(KeyStore keyStore, String keyPassword)
        throws GeneralSecurityException, IOException
{
    String alg = KeyManagerFactory.getDefaultAlgorithm();
    char[] keyPass = keyPassword != null ? keyPassword.toCharArray() : null;
    KeyManagerFactory fac = KeyManagerFactory.getInstance(alg);
    fac.init(keyStore, keyPass);
    return fac.getKeyManagers();
}

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

Заранее спасибо.


person Jesse Teixeira    schedule 05.09.2016    source источник
comment
Вот несколько тестов, которые могут помочь: git-wip-us.apache.org/repos/asf?p= cxf.git;a=blob;f=системы/   -  person Colm O hEigeartaigh    schedule 06.09.2016


Ответы (1)


После выполнения еще нескольких тестов стало ясно, что проблема была в сертификате. Я изменил jks на действительный, и теперь он работает отлично.

Для тех, кому нужно такое решение, пример, на котором я основывал свое решение (http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/wsdl_first_https/src/main/java/demo/hw_https/client/ClientNonSpring.java?view=log) прекрасно работает.

person Jesse Teixeira    schedule 06.09.2016