2011-12-17 13 views
6

JavaでSSLチェッカーを作成する上で参考になるチュートリアル、サイト、および書籍はありますか?私はここにあるものをしようとしています:http://www.sslshopper.com/ssl-checker.html。 自己署名付き証明書を作成したり、キーストアを使用しようとしていません。有効なSSL証明書が存在するかどうかを判断し、Certのホスト名が入力された名前と一致するかどうかを判断し、このCertが期限切れになる時期を判断する必要があります。私はこのトピックを捜したが、「Javaを使ってSSL買い物客を作る方法」は私には何ももたらさず、私の他の検索は自己署名入りの証明書を作成する方法についてのリンクだけをもたらした。どんな助けでも大歓迎です。あなたは何ができるかJavaを使用したSSLチェッカーの作成

答えて

1

あなたはSSLコンテキストを初期化し、必要なすべてのチェックを行うためにTrustManagersをオーバーライドする必要があります例えばApache's HttpClient
の上に独自のチェッカーを実装しています。

ホスト名検証は、ライブラリによって自動的に実行されます。

など。かかわらず、それはだかどうかの、手動で検証を行うために、最初にサーバー証明書を取得するには

SSLSocketFactory sf = new SSLSocketFactory(
    SSLContext.getInstance("TLS"), 
    SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); 
3

:ホスト名が証明書の情報と一致しない場合、次の例外をスローする取扱いSSLソケットを設定します有効であるかどうかを確認するには、証明書の確認を無効にした後にSSLSocketで接続するのが最も簡単です。

何かを経由することができますSSLContextを作成します。

SSLContext sslContext = SSLContext.getInstance("TLS"); 
X509TrustManager passthroughTrustManager = new X509TrustManager() { 
    @Override 
    public void checkClientTrusted(X509Certificate[] chain, 
      String authType) throws CertificateException { 
    } 

    @Override 
    public void checkServerTrusted(X509Certificate[] chain, 
      String authType) throws CertificateException { 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 
}; 
sslContext.init(null, new TrustManager[] { passthroughTrustManager }, 
     null); 

(注記:内部テスト証明書を使用する方法を探している人々のために、私はちょうど、カリフォルニア州ではなく、チェックを無効にする独自のテストを構築するお勧めしますそれらのダミーチェックが誤って生産コードに残っている場合や、テストがより現実的になるため)。

ソケットを作成して明示的に接続して起動します(実際にフォームを読むつもりはないのでそれ):

SSLSocketFactory ssf = sslContext.getSocketFactory(); 
SSLSocket socket = (SSLSocket) ssf.createSocket(
     "the.host.name", 443); 
socket.startHandshake(); 

ピア証明書チェーンを取得します。最初の項目は実際のサーバー証明書です。

X509Certificate[] peerCertificates = (X509Certificate[]) socket 
     .getSession().getPeerCertificates(); 

デフォルト値に基づいてX509TrustManagerを構築し、デフォルトのトラストアンカー(デフォルトの信頼できるCA証明書)に対して検証したい場合(これは事実上無効になっ上記の何passthroughTrustManagerです):

// By default on Oracle JRE, algorithm is PKIX 
TrustManagerFactory tmf = TrustManagerFactory 
     .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
// 'null' will initialise the tmf with the default CA certs installed 
// with the JRE. 
tmf.init((KeyStore) null); 
X509TrustManager tm = (X509TrustManager) tmf.getTrustManagers()[0]; 

証明書が現在有効であるかどうか、信頼できるアンカーに対して検証されているかどうか、および正しい拡張子がRFC 3280になっているかどうかを確認します。

try { 
    // Assuming RSA key here. 
    tm.checkServerTrusted(peerCertificates, "RSA"); 
} catch (CertificateException e) { 
    // Here you may check which subclass of CertificateException to know what the error is. 
} 

上記はすべてJSSE APIを使用しています。

また、PKIXの詳細を詳しく調べる場合は、Java Certification Path API(JSSEで使用されています)を使用できます。

(有効な証明書のみを使用したい場合は、最初にSSLContext sslContext = SSLContext.getDefault()を使用してソケットを作成し、ハンドシェイクしてください。)

直接サーバ証明書を取得するには、これを使用することができます:

X509Certificate serverCert = peerCertificates[0]; 

X509Certificateは、日付と様々な拡張については、多くの方法があります。例えば:

Date expirationDate = serverCert.getNotAfter(); 

ホスト名の検証は、RFC 6125(または少なくともRFC 2818)に従うべきです。つまり、接続先のホスト名が主体別名(SAN)のDNSエントリの1つであるかどうかを確認します。それに失敗した場合は、ホスト名が証明書のCN RDNにあるかどうかを確認してください(このためには、Subject DNをRDNに分割する必要があります)。また、this discussion (on the specific case of using IP addresses)に興味があります。

どれが「手動」確認をどれだけ行いたいかによって異なります。 APIドキュメントに加えて、いくつかの仕様(RFC 5280/RFC 3280およびRFC 6125/RFC 2818以上)があります。

Security.SE上のこの質問はまた、関心のあるべき

+0

:X509Certificateに[] peerCertificates =(X509Certificateの[ ]))socket.getSession()。getPeerCertificates(); – W3B5T4R

+0

私はOraclesのサイトから上記の例を試しても、 "inconvertible types"を取得し続けることさえありました – W3B5T4R

+0

私はimport javax.security.cert.X509Certificateを使用していました。 import java.security.cert.X509Certificateの代わりに。 – W3B5T4R

関連する問題