2012-08-10 43 views
1

需要在一个程序中的SSL握手,以获取有关,如公共密钥和密码套件远程服务器的一些信息。我知道一些称为隐形握手的东西,它不会完成握手,但会获得所需的信息,例如我所提到的。任何机构可以解释如何在Java中执行此操作。我试图搜索,但无法找到确切的具体方法。我如何让隐形SSL握手在Java中

+0

为什么证书链?除非服务器需要客户端证书,否则您可以使用内置的SSL类完成正常的SSL握手,然后获取所有SSL会话详细信息。 – EJP 2012-08-11 02:18:47

回答

1

隐身?从来没有听说过这个。
你可以注册一个javax.net.ssl.HandShakeCompletedListener你的SSL客户端套接字得到后握手已经完成

javax.net.ssl.HandShakeCompletedListener证书等,但是任何希望的类实现 接口接收在给定SSLSocket连接上完成 SSL协议握手的通知。

而且您还可以通过SSLEngine处理握手数据。

研究JSSE Ref guide

1

Stelath模式不知道这一点,但我用来做一些事情像下面从服务器检索

import java.io.IOException; 

import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class GetCertificates { 

public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException, IOException{ 
    String host="google.com"; 
    int port = 443; 
    SSLContext ssl = SSLContext.getInstance("TLS"); 
    ssl.init(null, new TrustManager[]{new SimpleX509TrustManager()}, null); 
    SSLSocketFactory factory = ssl.getSocketFactory(); 
    SSLSocket socket = (SSLSocket) factory.createSocket(host,port); 
    SSLSession session = socket.getSession(); 
    javax.security.cert.X509Certificate[] certs = session.getPeerCertificateChain(); 
    System.out.println(certs[certs.length-1].getSubjectDN()); 
    // you can display certificates info here and also cipher suites 
    session.getCipherSuite(); 
    session.invalidate(); 
} 
} 
class SimpleX509TrustManager implements X509TrustManager { 
public void checkClientTrusted(
     X509Certificate[] cert, String a) 
     throws CertificateException { 
} 

public void checkServerTrusted(
     X509Certificate[] cert, String a) 
     throws CertificateException { 
} 

public X509Certificate[] getAcceptedIssuers() { 
    return new X509Certificate[0]; 
} 
}