以下是一个使用Apache CXF创建2向SSL连接的示例代码,不使用Spring框架:
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.configuration.jsse.TLSParameterJaxBUtils;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;
public class SSLClientExample {
private static final String SERVICE_URL = "https://localhost:8443/your-service-url";
private static final String KEYSTORE_PATH = "/path/to/client_keystore.jks";
private static final String KEYSTORE_PASSWORD = "your_keystore_password";
private static final String TRUSTSTORE_PATH = "/path/to/client_truststore.jks";
private static final String TRUSTSTORE_PASSWORD = "your_truststore_password";
public static void main(String[] args) {
// Create the client proxy factory
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(YourServiceInterface.class);
factory.setAddress(SERVICE_URL);
// Create the client proxy
YourServiceInterface client = (YourServiceInterface) factory.create();
// Configure SSL/TLS parameters
configureTLS(client);
// Enable logging for request and response
enableLogging(client);
// Call the service methods
// ...
System.exit(0);
}
private static void configureTLS(YourServiceInterface client) {
try {
// Load the client keystore
KeyStore keyStore = KeyStore.getInstance("JKS");
try (InputStream keystoreInputStream = new FileInputStream(KEYSTORE_PATH)) {
keyStore.load(keystoreInputStream, KEYSTORE_PASSWORD.toCharArray());
}
// Load the client truststore
KeyStore trustStore = KeyStore.getInstance("JKS");
try (InputStream truststoreInputStream = new FileInputStream(TRUSTSTORE_PATH)) {
trustStore.load(truststoreInputStream, TRUSTSTORE_PASSWORD.toCharArray());
}
// Create KeyManagerFactory and TrustManagerFactory
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, KEYSTORE_PASSWORD.toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
// Create TLSClientParameters
TLSClientParameters tlsParams = new TLSClientParameters();
tlsParams.setKeyManagers(keyManagerFactory.getKeyManagers());
tlsParams.setTrustManagers(trustManagerFactory.getTrustManagers());
tlsParams.setDisableCNCheck(true); // Disable CN (Common Name) check
// Configure HTTPConduit with TLSClientParameters
Client clientProxy = ClientProxy.getClient(client);
HTTPConduit httpConduit = (HTTPConduit) clientProxy.getConduit();
httpConduit.setTlsClientParameters(tlsParams);
// Configure HTTPClientPolicy
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setReceiveTimeout(32000);
httpConduit.setClient(httpClientPolicy);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void enableLogging(YourServiceInterface client) {
Client clientProxy = ClientProxy.getClient(client);
clientProxy.getInInterceptors().add(new LoggingInInterceptor());
clientProxy.getOutInterceptors().add(new LoggingOutInterceptor());
}
}
在上面的代码中,您需要将以下值替换为实际值:
SERVICE_URL
- 要访问的SSL服务器的URL。KEYSTORE_PATH
- 用于客户端的keystore文件的路径。KEYSTORE_PASSWORD
- 客户端的keystore密码。TRUSTSTORE_PATH
- 用于客户端的truststore文件的路径。TRUSTSTORE_PASSWORD
- 客户端的truststore密码。您还需要创建一个接口 YourServiceInterface
,其中定义了要调用的服务方法的签名。然后,您可以使用 YourServiceInterface
接口创建一个代理客户端,通过该客户端可以调