我正在開發一個java代理來監視在我的應用程序服務器中發生的http通信。我想知道在傳出Https連接中使用的SSL版本(SSLv3,TLS等)。有沒有辦法通過任何方式獲得SSL版本?獲取HttpsURLConnection中使用的SSL版本 - Java
2
A
回答
4
我用這個解決方案,也許它可以幫助你:
首先,你需要一個擴展類的SSLSocketFactory
附上HandshakeCompletedListener
由SSLSocketFactory
創建的套接字: (由How to override the cipherlist sent to the server by Android when using HttpsURLConnection?啓發)
public class SecureSSLSocketFactory extends SSLSocketFactory {
private final SSLSocketFactory delegate;
private HandshakeCompletedListener handshakeListener;
public SecureSSLSocketFactory(
SSLSocketFactory delegate, HandshakeCompletedListener handshakeListener) {
this.delegate = delegate;
this.handshakeListener = handshakeListener;
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose)
throws IOException {
SSLSocket socket = (SSLSocket) this.delegate.createSocket(s, host, port, autoClose);
if (null != this.handshakeListener) {
socket.addHandshakeCompletedListener(this.handshakeListener);
}
return socket;
}
// and so on for all the other createSocket methods of SSLSocketFactory.
@Override
public String[] getDefaultCipherSuites() {
// TODO: or your own preferences
return this.delegate.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
// TODO: or your own preferences
return this.delegate.getSupportedCipherSuites();
}
然後,您需要實現HandshakeCompletedListener
接口。您必須實現handshakeCompleted
方法:
public class MyHandshakeCompletedListener implements HandshakeCompletedListener {
@Override
public void handshakeCompleted(HandshakeCompletedEvent event) {
SSLSession session = event.getSession();
String protocol = session.getProtocol();
String cipherSuite = session.getCipherSuite();
String peerName = null;
try {
peerName = session.getPeerPrincipal().getName();
} catch (SSLPeerUnverifiedException e) {
}
}
在handshakeCompleted
,你可以得到的協議版本(也許TLSv1.2工作),並順便也對密碼套件等信息,這也是通過HttpsConnection
訪問。 您可以在連接之前通過conn.setSSLSocketFactory
設置定製SSL插座工廠:
private void setupAndConnect() {
URL url = new URL("https://host.dom/xyz");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(/*keyManagers*/null, /*trustManagers*/null, /*new SecureRandom()*/null); // simple here
conn.setSSLSocketFactory(new SecureSSLSocketFactory(sslContext.getSocketFactory(), new MyHandshakeCompletedListener()));
// conn.set... /* set other parameters */
conn.connect();
相關問題
- 1. Android:使用HttpsURLConnection的HTTPS(SSL)連接
- 2. 使用java類HttpsURLConnection
- 3. 獲取SSL上下文HttpsURLConnection的從x509證書
- 4. 我如何使用HttpsURLConnection的在Java中
- 5. 使用Websphere MQ版本7.0.1的C# - SSL
- 6. 與Android版本不同的HttpsURLConnection問題
- 7. 用Java獲取組件版本
- 8. 如何在Linux中使用單行命令獲取Java版本
- 9. 如何使用PHP獲取用戶的Java版本?
- 10. System.Web.Services.Protocols.SoapHttpClientProtocol使用什麼版本的SSL/TLS?
- 11. 在Javamail中從smtp服務器獲取SSL版本
- 12. Javascript SSL版本
- 13. 配置Java HttpsURLConnection
- 14. 從Java Applet獲取Windows Service Pack版本?
- 15. 使用git獲取最新版本
- 16. 使用pkg_resources獲取軟件包版本?
- 17. 使用C#獲取NSIS文件版本
- 18. 使用Puppet Fact獲取軟件版本
- 19. 使用Javascript獲取Adobe Reader版本
- 20. 如何使用Node.js獲取Windows版本?
- 21. 使用python獲取Firefox版本
- 22. 使用nodegit獲取最新版本
- 23. 使用SmartClient LGPL版本獲取數據
- 24. 使用TFS API獲取最新版本
- 25. 如何使用使用HttpsUrlConnection的SSL連接使用代理驗證?
- 26. 獲取用戶Android版本
- 27. 獲取文本文件中的版本
- 28. Javaee中的SSL/TLS協議版本
- 29. 解密由Java生成的Wireshark中的客戶端SSL流量HttpsURLConnection
- 30. 獲取NDIS版本?