Мне нужно использовать службу с использованием 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();
}
При отладке я вижу, что сертификаты загружены, а хранилище ключей и менеджеры доверия ключей соответственно заполнены, поэтому после нескольких дней попыток понять, что происходит, у меня заканчиваются идеи. Так что, если у вас есть какой-либо совет, который может помочь, пожалуйста, помогите мне.
Заранее спасибо.