如何注入自定义SSLSocketFactory到Azure Java SDK



是否有一种方法可以覆盖Azure HTTPConnection默认使用的SSLSocketFactory并使用我自己的自定义SSLSocketFactory ?我需要这个,因为我使用的系统使用不同的sslcontext与不同的服务器通信,我不能使用默认的SSLSocketFactory。

我已经在github上的java AD库上提出了一个关于相同的问题,但如果有一种方法可以覆盖它,那在代码修复完成之前会更好。

据我所知,Azure SDK for Java使用javax.net.ssl包中的SSLContextSSLSocketFactory

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;

我认为你可以使用sslContext.getInstance(*yourparamters*)不同的SSLContext,如果我理解正确。根据我的经验,我们可以使用这个方法来返回一个实现指定的安全套接字协议的SSLContext对象。例如,如果您使用SSLV3,您可以编写如下代码:

SSLContext context=SSLContext.getInstance("SSLv3");

实际上,您也使用相同的方法来设置TLSSSL。我建议您可以参考关于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

相关内容

  • 没有找到相关文章

最新更新