公開鍵や暗号スーツなどのリモートサーバーに関する情報を取得するために、プログラムで SSL ハンドシェイクを行う必要があります。私は、ステルス ハンドシェイクと呼ばれるものを認識しています。これは、ハンドシェイクを完了しませんが、私が言及したような必要な情報を取得します。Javaでこれを行う方法について、どの団体でも説明できますか。検索しようとしましたが、正確な具体的な方法を見つけることができませんでした。
2 に答える
1
ステルス?これを聞いたことがない。証明書などを取得するためにSSLクライアントソケットに
登録することができますが、ハンドシェイクが完了し た後javax.net.ssl.HandShakeCompletedListener
javax.net.ssl.HandShakeCompletedListenerは、特定のSSLSocket接続でSSLプロトコルハンドシェイクの完了の通知を受信したい任意のクラスによって実装されるインターフェースです。
また、を介してハンドシェイクデータを処理することもできますSSLEngine
。
スタディJSSEリファレンスガイド
于 2012-08-10T20:49:20.393 に答える
1
ステラスモードではこれについてはわかりませんが、サーバーから証明書チェーンを取得するために以下のようなことをしていました
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];
}
}
于 2012-08-10T20:57:21.510 に答える