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

我已经针对相同问题提出了an issue on the AD library for java on github,但是如果有一种方法可以覆盖它,那么在完成代码修复之前会更好。

最佳答案

据我所知,Azure SDK for Java使用了SSLContextSSLSocketFactory,它们在软件包javax.net.ssl

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


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

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


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

10-11 10:50