我们希望在 Java 7 版本中启用 TLSv1.2 协议,同时确保对较低版本的支持。
我知道我们可以利用 SSLContext.getInstance("TLSv1.2") 来激活 TLSv1.2。然而,我们的场景涉及使用 Axis 存储库,特别是 org.apache.commons.httpclient.* 包来执行 SOAP 调用。
我们已经实现了使用 ProtocolSocketFactory 来注册协议,在这种情况下,我们设计了一个扩展 HttpSecureProtocol 的自定义协议工厂类。
现在使用现有的代码我怎样才能实现这一目标。
**初始化类:
PropertiesLoader props = PropertiesLoader.getInstance();
// Mask the system variable. Causes problems, as not-commons-ssl expects the private key to be there
Properties sysProps = System.getProperties();
String sysKeystore = (String) sysProps.remove("javax.net.ssl.keyStore");
// use client keystore for connection factory
ProtocolSocketFactory factory = new FixedProtocolSocketFactory(KEYSTORE, KEYSTORE_PASS);
Protocol.unregisterProtocol("https");
Protocol.registerProtocol("https", new Protocol("https", factory , HttpsURL.DEFAULT_PORT));
Protocol.registerProtocol("https", new Protocol("https", factory , 8443));
if (sysKeystore != null) {
sysProps.setProperty("javax.net.ssl.keyStore", sysKeystore);
}
**自定义类: **
public class FixedProtocolSocketFactory extends HttpSecureProtocol {
public FixedProtocolSocketFactory(final String keystore,
final String keystorePassword) throws GeneralSecurityException, IOException {
super();
TrustChain trustChain = TrustMaterial.CACERTS;
super.setTrustMaterial(trustChain);
File keystoreFile = new File(keystore);
// prepare key material
if (keystoreFile != null && keystoreFile.exists()) {
char[] ksPass = null;
if (keystorePassword != null) {
ksPass = keystorePassword.toCharArray();
}
KeyMaterial km = new KeyMaterial(keystoreFile, ksPass.clone());
super.setKeyMaterial(km);
}
}
**注意**:无法升级到更高版本的java
**尝试过什么? **
**我在期待什么? **需要在 SOAP 调用中使用 TLSv1.2 进行握手。
虽然我强烈质疑使用不受支持的 Java 版本和使用低于 TLS 1.2 的任何版本,但它非常简单:
SSLContext sslContext = SSLContexts.custom()
.build()
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
sslContext,
new String[]{ "TLSv1.0", "TLSv1.1", "TLSv1.2" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier())
您的 HttpClient 调用现在将接受 TLS 1.2 及更低版本。