2012-08-08 9 views
8

私は現在、すべての証明書を一時的な「解決策」(安全でないもの)として許可するために、X509TrustManagerをオーバーライドしています。私は、私が問題を抱えている特定の証明書を受け入れるように、追加する方法について考えてみようとしています。ここに現在のコードがあります。X509TrustManagerすべての証明書を許可せずにオーバーライドしますか?

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 

    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 
}}; 

try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (GeneralSecurityException e) { 
    System.out.println(e.getStackTrace()); 
} 
+0

なぜ空の配列の代わりにnullを返しますか?スペックはnullでない配列を返すと言います。 – Jayen

答えて

7

すべてを行う必要がgetAcceptedIssuersから証明書を返しています。 this

InputStream inStream = new FileInputStream("fileName-of-cert"); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); 
inStream.close(); 

を参照して、

+0

接続したURLから受け取った証明書を返すことはできますか?今、証明書のエラーを出している別のサーバーの別のURLに行くときだけ、証明書のエラーが表示されます。 – user1015523

+0

私がやったことは、ブラウザを使ってサイトから証明書をプルダウンすることです(エラーが表示されたら、すべての主要なブラウザにディスクに保存するオプションがあるはずです)。 StephenCはファイルから上記のコードを使用するか、使用します。 IIRCのキーストアを生成するのはちょっとした作業であるため、上記のソリューションは少し難解かもしれません(柔軟性は低くなります)。 – dfb

+1

opensslが利用可能な場合、証明書チェーンはコマンドラインでダウンロードできます。 openssl s_client -host www.webservicehost.com -port 443 -showcerts> output_certificate.crt – IcedDante

0

一つの可能​​性が一時的に信頼できる証明書としてお使いのJVMのキーストアに問題のある証明書を追加することですメソッド内で配列のことを返します。

関連する問題