2013-06-12 17 views
7

私はREST APIへの呼び出しを行うためにしようとしているが、私は(最後のコンプリートのStackTrace)以下の例外を取得:私はこの問題についてのAPIプロバイダを求め、何か問題があることは言う SSL検証をどのように無効にできますか?

"javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target" 

使用しているSSLライブラリを使用してください。

どのようにこの問題を解決しますか?この同じコード(下記)では、NIMBLE API RESTを問題なく呼び出しましたが、この場合は機能しません。 次に、私はファイル証明書(.cer)を持っていません。

セキュリティメソッドが既に持っているAPIキーであるため、SSL検証を無効にする必要があります。

提案がありますか?

ありがとうございました!

POST https://api.nexalogy.com/project/create 
HTTP Header:"Content-Type" "application/json" 
HTTP Header:"api_key" "XXXXXXXXXXXXXXXXXXXX" 
HTTP Body:[{"name":"project1","lang":"en","type":"twitter"}] 
api_key:XXXXXXXXXXXXXXXXXXXX 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

====コード:==を

====コンソール:私はまた、次の形式と例外が同じで試みた====

POST https://api.nexalogy.com/project/create?api_key=XXXXXXXXXXXXXXXXXXXX 
HTTP Header:"Content-Type" "application/json" 
HTTP Body:[{"name":"project1","lang":"en","type":"twitter"}] 
api_key:XXXXXXXXXXXXXXXXXXXX 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

==

package servlet; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet("/AddProject") 
public class AddProject extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    public AddProject() { 
    } 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    } 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String body="[{\"name\":\"project1\",\"lang\":\"en\",\"type\":\"twitter\"}]"; 
     String api_key="XXXXXXXXXXXXXXXXXXXX"; 
     String str_response=""; 
     String line=""; 
     URL url = new URL("https://api.nexalogy.com/project/create?api_key="+api_key); 
     try{ 
      HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type","application/json"); 
      System.out.println("POST https://api.nexalogy.com/project/create?api_key="+api_key); 
      System.out.println("HTTP Header:"+"\"Content-Type\" \"application/json\""); 
      System.out.println("HTTP Body:"+body); 
      System.out.println("api_key:"+api_key); 
      connection.setUseCaches(false); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
      wr.writeBytes(body); 
      wr.flush(); 
      wr.close(); 
      InputStream is = connection.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader rd = new BufferedReader(isr); 
      while ((line = rd.readLine()) != null) str_response+= line + '\r'; 
      rd.close(); 
      System.out.println("str_response:"+str_response); 
     }catch(Exception e){ 
      e.printStackTrace(System.out); 
      //throw new RuntimeException(e); 
     } 
    } 
} 

====コンプリートのStackTrace:====

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131) 
    at com.sun.jersey.api.client.Client.handle(Client.java:616) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:559) 
    at com.sun.jersey.api.client.WebResource.post(WebResource.java:230) 
    at engine_brandchats.twitter_api_create_project_0_1.Twitter_api_create_project.tREST_2Process(Twitter_api_create_project.java:955) 
    at engine_brandchats.twitter_api_create_project_0_1.Twitter_api_create_project.tJava_1Process(Twitter_api_create_project.java:635) 
    at engine_brandchats.twitter_api_create_project_0_1.Twitter_api_create_project.runJobInTOS(Twitter_api_create_project.java:1641) 
    at engine_brandchats.twitter_api_create_project_0_1.Twitter_api_create_project.main(Twitter_api_create_project.java:1494) 
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler$1$1.getOutputStream(URLConnectionClientHandler.java:203) 
    at com.sun.jersey.api.client.CommittingOutputStream.commitWrite(CommittingOutputStream.java:117) 
    at com.sun.jersey.api.client.CommittingOutputStream.write(CommittingOutputStream.java:89) 
    at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source) 
    at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source) 
    at sun.nio.cs.StreamEncoder.implFlush(Unknown Source) 
    at sun.nio.cs.StreamEncoder.flush(Unknown Source) 
    at java.io.OutputStreamWriter.flush(Unknown Source) 
    at java.io.BufferedWriter.flush(Unknown Source) 
    at com.sun.jersey.core.util.ReaderWriter.writeToAsString(ReaderWriter.java:191) 
    at com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider.writeToAsString(AbstractMessageReaderWriterProvider.java:128) 
    at com.sun.jersey.core.impl.provider.entity.StringProvider.writeTo(StringProvider.java:88) 
    at com.sun.jersey.core.impl.provider.entity.StringProvider.writeTo(StringProvider.java:58) 
    at com.sun.jersey.api.client.TerminatingClientHandler.writeRequestEntity(TerminatingClientHandler.java:305) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:182) 
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129) 
    ... 7 more 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source) 
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) 
    at sun.security.validator.Validator.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    ... 35 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) 
    at java.security.cert.CertPathBuilder.build(Unknown Source) 
    ... 41 more 

EDITED 2013年6月13日ソリューション:のX509TrustManager

が...

HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 
connection.setRequestMethod("POST"); 
connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
if (connection instanceof HttpsURLConnection) { 
    try { 
     KeyManager[] km = null; 
     TrustManager[] tm = {new RelaxedX509TrustManager()}; 
     SSLContext sslContext = SSLContext.getInstance("SSL"); 
     sslContext.init(null, tm, new java.security.SecureRandom()); 
     SSLSocketFactory sf = sslContext.getSocketFactory(); 
     ((HttpsURLConnection)connection).setSSLSocketFactory(sf); 
     System.out.println("setSSLSocketFactory OK!"); 
    }catch (java.security.GeneralSecurityException e) { 
     System.out.println("GeneralSecurityException: "+e.getMessage()); 
    } 
} 

を次のコードを追加...と、以下のクラスを追加実装(のX509TrustManagerを実装)

class RelaxedX509TrustManager implements X509TrustManager { 
    public boolean isClientTrusted(java.security.cert.X509Certificate[] chain){ return true; } 
    public boolean isServerTrusted(java.security.cert.X509Certificate[] chain){ return true; } 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } 
    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String input) {} 
    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String input) {} 
} 
+0

のJavaのバージョンを使用していますか。? – Bruno

+0

こんにちは、お返事いただきありがとうございます、私はあなたのコメントを見ました。私はjava6を使用しましたが、今度はjava7をインストールして設定しましたが、エラーは同じです:/ 2番目のオプションを試してみる必要があります。 –

+0

"X509TrustManager"インタフェース(http://docs.oracle.com/javase/6/docs/api/javax/net/ssl/X509TrustManager.html)を実装して、java7にアップグレードする必要がありました。ソリューションは、今正常に動作します。ありがとう! –

答えて

7

お試しください

public void disableCertificates() { 
    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) { 
      } 
     } 
    }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
    } 
} 
+4

プロダクション環境でこのコードを使用しないでください。すべての証明書のチェックが無効になるためです。したがって、あなたの実装は[MITM攻撃](http://en.wikipedia.org/wiki/Man-in-the-middle_attack)に脆弱です。 –

+1

こんにちは!お返事いただきありがとうございます。私はこのコードを試してみました。javax.net.ssl.TrustManagerとjavax.net.ssl.X509TrustManagerをインポートしました。私はこのメソッドを自分のコードの前に呼び出しますが、例外は同じです。 –

+1

このコード*は一切使用しないでください。*テストするだけで安全でないソリューションを展開することはできません。あなたはそれが生産に持ち込まれるリスクを冒しています。それは*大きな*セキュリティ違反でしょう。また、コードは例外を無視し、 'TrustManager.'の契約に違反します。避けてください。 – EJP

-2

完全な証明書チェーンを持つ証明書を使用してください。つまり、少なくともルート証明書が必要です。

相手のエンド証明書をインポートしただけで、実装が証明書チェーンを検証できません。少なくともルート証明書が必要です。

+0

これは間違っています。必要なのは、「信頼できる」としてインポートされた署名者証明書のすべてです。通常、最も高いものがインポートされます。ピアは証明書と共にチェインの残りの部分を送るべきです。 – EJP

+0

@ EJP私は少なくともルート証明書が必要であると書いていました(最初の段落)。これを明確にするために第2段落を修正しました。 –

3

私が既に持っているAPIキーであるセキュリティメソッドが であるため、SSL検証を無効にする必要があります。

APIキー(およびそのセキュリティの側面)がSSL/TLSによって提供されるセキュリティとどのように関係しているかは、明らかではありません。 SSL/TLSは、データの送信を盗聴や改ざんから保護することです。

this SSL testing serviceと接触しようとしているサーバーを確認すると、サーバーにはサーバー名表示(SNI)をサポートするクライアントが必要です。これにより、サーバーは異なる証明書を持つ複数のホストをホストできます。

クライアントがSNIをサポートしていない場合(Javaではバージョン7のクライアント側でのみサポートされます)、要求にはインデントされたものとは異なる証明書が提示されます。証明書の検証またはホスト名前確認手続き。いずれかのチェックを無効にすると、Man-In-The-Middle攻撃に対する接続が脆弱になります。

  • 問題の原因として、SNI(Java 6など)をサポートしていないJavaを使用している可能性が最も高い原因が考えられます。

  • 使用しているJREに、この特定のCAがデフォルトのトラストストアに含まれていない可能性もあります。別のソース(たとえば、cURLでよく推奨されるMozillaバンドル)から信頼したいCA証明書のリストを変換しようとすることもできます。 CA証明書が最初に何であるかを理解する必要があるかもしれません。 JSSE reference guide saysとして

    重要:/ libに/セキュリティ/ cacertsファイル内の信頼されたルート証明書 の数が限られているJDKの船。この ファイルをトラストストアとして使用する場合は、keytoolに と記載されているので、このファイルに含まれている証明書を(つまり、 の追加と削除を)維持するのはあなたの責任です。

    連絡先のサーバーの証明書の設定によっては、 ルート証明書を追加する必要があります。適切なベンダーから必要な 特定のルート証明書を入手します。

いずれかの方法:SSL認証を無効には、あなたの問題への解決策ではありません。

EDIT:

あなたが使用しようとしているサービスは、明らかにOracleのJREにデフォルトでバンドルされたCAの一つではないStartSSLによって発行された証明書を、持っているように見えます。

download it from StartSSLする必要があります(または既に持っている信頼できるバンドルからエクスポートしてください、 "StartCom ...")、それをcacertsストアにインポートしてください。別の1):

keytool -import -keystore /path/to/jre/lib/security/cacerts -alias startssl -file startssl.crt 

(必要に応じて、もちろん、パスとstartssl証明書ファイルの名前を適応)

関連する問題