是否有一种方法可以覆盖Azure HTTPConnection默认使用的SSLSocketFactory
并使用我自己的自定义SSLSocketFactory
?我需要这个,因为我使用的系统使用不同的sslcontext与不同的服务器通信,我不能使用默认的SSLSocketFactory。
我已经在github上的java AD库上提出了一个关于相同的问题,但如果有一种方法可以覆盖它,那在代码修复完成之前会更好。
据我所知,Azure SDK for Java使用javax.net.ssl
包中的SSLContext
和SSLSocketFactory
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
我认为你可以使用sslContext.getInstance(*yourparamters*)
不同的SSLContext
,如果我理解正确。根据我的经验,我们可以使用这个方法来返回一个实现指定的安全套接字协议的SSLContext
对象。例如,如果您使用SSLV3
,您可以编写如下代码:
SSLContext context=SSLContext.getInstance("SSLv3");
实际上,您也使用相同的方法来设置TLS
和SSL
。我建议您可以参考关于SSLSocketFactory的示例
【UPDATE】
这就是我为通用SSLSocketFactory添加SSL上下文的方式。我想知道如何为Azure java SDK做到这一点。
如果我理解的话,似乎你想为不同的服务器获得不同的socketfactory。在这种情况下,我建议您可以创建一个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);
我认为Will的答案是正确的。SSLSocketFactory是一个泛型类,并不特定于Azure。您可以在自己的代码中使用上述方法。基于您的服务器,您可以创建不同的SSLSocketFactory对象。我看不出有任何理由让Azure SDK为Java公开它正在使用的SSLSocketFactory。如果它可以,那么它是特定于Azure http通信的,我认为你不能在其他服务器上使用它。你能再澄清一下你的问题吗?此外,我建议您在标签中添加"adal",以便adal团队可以查看它。https://stackoverflow.com/questions/tagged/adal