gpt4 book ai didi

Java SOAP 客户端 JAX-WS : How to use a certificate

转载 作者:行者123 更新时间:2023-11-30 11:46:06 25 4
gpt4 key购买 nike

我正在使用 NetBeans 7.0.1 开发一个应用程序,该应用程序能够通过安全 (HTTPS/SSL) SOAP 与服务器/网络服务进行通信。在 NetBeans 中,我只需单击“新建”->“Web 服务客户端...”,选择一个 wsdl 文件,然后单击“完成”。这将为 SOAP 客户端生成源代码。之后,我在自己的文件夹中有许多新的 java 文件:

Generated Sources (jax-ws)

我更改了 wsdl 文件以在不使用 HTTPS/SSL 的情况下连接到我自己/本地主机以测试 SOAP 客户端,它似乎运行良好,但现在我需要为 SOAP/HTTP 连接使用特定的证书,至极我得到了一个 .p12 文件。

我不知道如何结合生成的源使用证书。我像这样使用生成的 SOAP-Client:

SoapServiceExample SSA = new ClassSoapServiceExample();
Object Response = SSA.getServicePort().doSomething(Authentification, Data);

如果我尝试将 SOAP 客户端与未更改/正确的 wsdl 文件一起使用,我会收到此错误:

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

[com.sun.xml.internal.ws.transport.http.client.HttpClientTransport] [getOutput] [-1]
[com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe] [process] [-1]
[com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe] [processRequest] [-1]
[com.sun.xml.internal.ws.transport.DeferredTransportPipe] [processRequest] [-1]
[com.sun.xml.internal.ws.api.pipe.Fiber] [__doRun] [-1]
[com.sun.xml.internal.ws.api.pipe.Fiber] [_doRun] [-1]
[com.sun.xml.internal.ws.api.pipe.Fiber] [doRun] [-1]
[com.sun.xml.internal.ws.api.pipe.Fiber] [runSync] [-1]
[com.sun.xml.internal.ws.client.Stub] [process] [-1]
[com.sun.xml.internal.ws.client.sei.SEIStub] [doProcess] [-1]
[com.sun.xml.internal.ws.client.sei.SyncMethodHandler] [invoke] [-1]
[com.sun.xml.internal.ws.client.sei.SyncMethodHandler] [invoke] [-1]
[com.sun.xml.internal.ws.client.sei.SEIStub] [invoke] [-1]
[$Proxy31] [doSomething] [-1]

我已经能够加载 .p12 证书以将其用于套接字。

public static TrustManager[] createTrustManagerWhoTrustAllways()
{
return new TrustManager[]
{
new X509TrustManager()
{
@Override
public X509Certificate[] getAcceptedIssuers()
{
return null;
}

@Override
public void checkClientTrusted(X509Certificate[] certs, String authType)
{
return;
}

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType)
{
return;
}
}
};
}

public static SSLContext loadPkcs12CertificateAndGetSslContext(String FileName, String Password) throws Exception
{
KeyStore KS = KeyStore.getInstance("PKCS12");
KS.load(new FileInputStream(FileName), Password.toCharArray());

KeyManagerFactory KMF = KeyManagerFactory.getInstance("SunX509");
KMF.init(KS, Password.toCharArray());

SSLContext SSLC = SSLContext.getInstance("TLS");
SSLC.init(KMF.getKeyManagers(), createTrustManagerWhoTrustAllways(), new SecureRandom());

return SSLC;
}

public void connect() throws Exception
{
if(true == m_Secure)
{
SSLContext SSLC = loadPkcs12CertificateAndGetSslContext(m_CertificateFileName, m_CertificatePassword);

m_Socket = SSLC.getSocketFactory().createSocket(m_ServerName, m_ServerPort);
}
else
{
m_Socket = new Socket(m_ServerName, m_ServerPort);
}
}

我知道/猜想这不是写得很好的源代码,我相信使用像 createTrustManagerWhoTrustAllways() 这样的东西的糟糕做法,但我是 java 的新手,我的首要目标是生成一个工作的客户端,如果我已经克服了这个障碍我将专注于更安全的源代码。

谁能告诉我,我如何为生成的 SOAP 客户端使用证书?

最佳答案

您可以通过程序命令行上的系统属性提供 keystore 和信任库配置来声明系统范围的 keystore :

-Djavax.net.ssl.trustStore=<yourtruststore>
-Djavax.net.ssl.trustStorePassword=<pwd>
-Djavax.net.ssl.keyStore=<your-keystore>
-Djavax.net.ssl.keyStorePassword=<pwd>

JAX-WS 将选取此 keystore 来配置 SSL 客户端连接。只需确保您的 keystore 中有正确的证书。

关于Java SOAP 客户端 JAX-WS : How to use a certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9975500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com