2011-08-26 5 views
16

リモートサーバとのHttps接続を作成し、証明書を取得して確認する必要があります。サーバ証明書チェーンを取得し、それがJavaで有効で信頼できるものであることを確認する方法

私は罰金、接続確立している:

try { 
    url = new URL(this.SERVER_URL); 
    HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
    HttpsURLConnection secured = (HttpsURLConnection) con; 
    secured.connect(); 
} 

をしかし、getServerCertificateChain()方法がタイプHttpsURLConnectionによって定義されていないようです。

どのようにサーバー証明書チェーンを取得できますか?私の理解は、getServerCertificateChain()X509Certificateオブジェクトの配列を返さなければならず、このクラスには証明書を問い合わせるためのメソッドがあります。

  1. 証明書が有効で信頼され、
  2. チェック証明書のシリアル番号に対する証明書失効リストの配布ポイント
  3. それは有効期限が切れていないことを確認し、
  4. は、私はそれを確認する必要があります

  5. 証明書のURLが他のものと一致していることを確認します(既に取得済みです)。

私は迷子になり、本当に助けになります!

+0

Javaのhttpsクライアントコードでは、4つのことすべてを実行していないのですか? –

+0

これには解決策がありましたか?証明書が信頼できるかどうかそのための解決策 –

答えて

23

getServerCertificateChainではなく、getServerCertificatesです。いくつかの素晴らしいサンプルコードhereがあります。


EDIT

は、私自身のいくつかのサンプルコードを追加しました。あなたにとって良い出発点。 JavadocをHttpsURLConnectionX509Certificateに見ることを忘れないでください。

import java.net.URL; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateExpiredException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HttpsURLConnection; 

public class TestSecuredConnection { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     TestSecuredConnection tester = new TestSecuredConnection(); 
     try { 
      tester.testConnectionTo("https://www.google.com"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public TestSecuredConnection() { 
     super(); 
    } 

    public void testConnectionTo(String aURL) throws Exception { 
     URL destinationURL = new URL(aURL); 
     HttpsURLConnection conn = (HttpsURLConnection) destinationURL 
       .openConnection(); 
     conn.connect(); 
     Certificate[] certs = conn.getServerCertificates(); 
     for (Certificate cert : certs) { 
      System.out.println("Certificate is: " + cert); 
      if(cert instanceof X509Certificate) { 
       try { 
        ((X509Certificate) cert).checkValidity(); 
        System.out.println("Certificate is active for current date"); 
       } catch(CertificateExpiredException cee) { 
        System.out.println("Certificate is expired"); 
       } 
      } 
     } 
    } 
} 
+0

ありがとうございます - 私は大企業のマニュアルの仕様書をコーディングしており、このセクションを書いた人が誤っていると思われ始めました。私は初心者ですが、Javaネットワーキングについては、getServerCertificateChainとgetServerCertificatesの違いが何であるか把握しようとしています。 –

+0

私は上記の4つの要件に従って証明書の問い合わせを行いますか? –

+0

証明書をX509Certificatesに変換し、そのクラスのメソッドを使用する必要があります。 – Perception

2

私はこの例にBouncyCastleを使用しています。私はそれがより良い質問に答えると思います。 http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

+2

そのブログでコードが正しくフォーマットされていません。ここにソースコードhttps://svn.apache.org/repos/asf/cxf/tags/cxf-2.4.1/distribution/src/main/release/samples/sts_issue_operationがあります/ src/main/java/demo/sts/provider/cert / –

関連する問題