Сервис Java SOAP через SSL с клиентскими сертификатами - PullRequest
1 голос
/ 01 декабря 2011

Итак, я пытался настроить сервлет Java SOAP с JAX-WS и SSL.Я получил настоящую службу, работающую по SSL, но мне нужно, чтобы она проходила аутентификацию на основе сертификата клиента, и сейчас он принимает все соединения с ним.

Вот мой код:

TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
                String authType)
                throws CertificateException {
    System.out.println("yay1");
}



public void checkServerTrusted(X509Certificate[] chain,
                String authType)
                throws CertificateException {
    System.out.println("yay2");
}

public X509Certificate[] getAcceptedIssuers() {
    throw new UnsupportedOperationException("Not supported yet.");
}
};


String uri = "http://127.0.0.1:8083/SoapContext/SoapPort";
Object implementor = new Main();

Endpoint endpoint = Endpoint.create(implementor);

SSLContext ssl = SSLContext.getInstance("TLS");

KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore store = KeyStore.getInstance("JKS");

store.load(new FileInputStream("serverkeystore"),"123456".toCharArray());

keyFactory.init(store, "123456".toCharArray());


TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

trustFactory.init(store);


ssl.init(keyFactory.getKeyManagers(),
new TrustManager[] { tm }, null);

HttpsConfigurator configurator = new HttpsConfigurator(ssl);

HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8083), 8083);

httpsServer.setHttpsConfigurator(configurator);

HttpContext httpContext = httpsServer.createContext("/SoapContext/SoapPort");

httpsServer.start();

endpoint.publish(httpContext);

И я тестирую его с помощью этого PHP-кода:

$soapClient = new SoapClient("https://localhost:8083/SoapContext/SoapPort?wsdl", array('local_cert' => "newcert.pem"));
$soapClient->add(array('i' => '1', 'j' => '2'));

К сожалению, это вызывает ошибку, когда я включаю local_cert:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://localhost:8083/SoapContext/SoapPort?wsdl' : failed to load external entity "https://localhost:8083/SoapContext/SoapPort?wsdl"

Он успешно подключается, еслине включайте local_cert, но он никогда не вызывает мой пользовательский TrustManager, поэтому он принимает все входящие соединения.

Что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 01 декабря 2011

Я не знаю PHP, но ваш TrustManager в веб-сервисе не выполняет никакой аутентификации.
Таким образом, соединение не должно быть отклонено из-за проблем с аутентификацией клиента.

Содержит ли new_cert.pem, на который вы ссылаетесь в своем клиенте, закрытый ключ?
Если нет, то это может быть проблемой.

Я предлагаю вам взять проволочную акулу и посмотреть сообщение.
Я подозреваю, что вы не увидите отклонение от вашего сервера.

Ошибка должна быть локальной на вашем клиенте

...