有没有一种方法可以覆盖Azure HTTPConnection默认使用的SSLSocketFactory
并使用我自己的自定义SSLSocketFactory
?我需要这样做是因为我使用的系统使用不同的SSLContext与不同的服务器通信,并且无法使用默认的SSLSocketFactory。
我已经针对相同问题提出了an issue on the AD library for java on github,但是如果有一种方法可以覆盖它,那么在完成代码修复之前会更好。
最佳答案
据我所知,Azure SDK for Java使用了SSLContext
和SSLSocketFactory
,它们在软件包javax.net.ssl
中
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
如果我理解正确,我认为您可以将
sslContext.getInstance(*yourparamters*)
用于其他SSLContext
。根据我的经验,我们可以使用此方法返回实现指定安全套接字协议的SSLContext
对象。例如,如果使用
SSLV3
,则可以编写以下代码:SSLContext context=SSLContext.getInstance("SSLv3");
实际上,您还使用相同的方法来设置
TLS
和SSL
。我建议您可以参考samples about SSLSocketFactory
【更新】
这就是我为通用SSLSocketFactory添加SSL上下文的方式。
我想知道要针对Azure Java SDK执行此操作。
如果我理解的话,似乎您想为不同的服务器获取不同的SocketFactroy。在这种情况下,建议您创建一个socketfactory管理类来管理所有的socketfactory。请查看以下简单代码:
public class SSLScoketFactoryManage {
public static SSLSocketFactory getSSLSocketFactory(String keyStoreName, String password) throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException, IOException {
KeyStore ks= getKeyStore(keyStoreName, password);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(ks, password.toCharArray());
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
return context.getSocketFactory();
}
}
您可以在以下不同的套接字中使用此方法:
SSLSocketFactory sslFactory = getSSLSocketFactory(keyStore, keyStorePassword);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sslFactory);
如有任何疑问,请告诉我。
关于java - 如何将自定义SSLSocketFactory注入(inject)Azure Java SDK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32355933/