2016-07-22 5 views
0

私はHttpsURLConnectionのは、次のようにカスタマイズのTrustManagerを使用するconfigedされているプロジェクトをしている:JerseyクライアントがHttpsURLConnectionでdefaultSSLSocketFactoryを使用する方法

:、それはHTTP/HTTPSリクエストを送信するためにジャージーのクライアントを

SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, new TrustManager[]{new MyTrustManager()}, null); 
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 

REST APIクライアントは、このプロジェクトでありを使用しています

Client client = ClientBuilder.newClient(); 

しかし、このJersetクライアントによって開始されたHTTPS接続は、HttpsURLConnectionで設定したdefaultSSLSocketFactoryを使用せず、信頼できないHTTPS URLへの接続に失敗します。

このクライアントで明示的にSslContextを設定して、TrustManagerと連携させる必要があります。

この問題を解決する方法はありますか?

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

+0

はhttp://stackoverflow.com/questions/い2145431/https-using-jersey-clientこれに答えますか? –

+0

いいえ、その投稿はJersey経由でHTTPS URLにリクエストを送信する方法を教えています。私はこれを行う方法を知っています(最後のスニペットに示されています)。私が知らないのは、JersyクライアントにHttpsURLConnectionで設定したSslContextを使用させる方法です。私がこれをやりたい理由は、Jerseyクライアント上でSslContextを明示的に設定するためのREST APIクライアントコードを編集する権限がないからです。 – Lee

答えて

1

私が最終的に見つけた解決策は、SSLSocketFactoryプロバイダープロパティをカスタマイズされたSSLSocketFactoryに設定することです。似たような問題を抱えている人を助けることができればと思いますプログラムの先頭で

コールこれを:MySSLSocketFactoryがどのように見えるかここで

Security.setProperty("ssl.SocketFactory.provider", MySSLSocketFactory.class.getCanonicalName()); 

は(それはまた、接続タイムアウトを設定します)です:

public class MySSLSocketFactory extends SSLSocketFactory { 

    private SSLContext sslContext = SSLContext.getInstance(Const.Ssl.PROTOCOL_SSL); 


    public MySSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException { 
     this.sslContext.init(
       null, 
       new TrustManager[] { new MyTrustManager(false) }, 
       new SecureRandom()); 
    } 


    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
      throws IOException { 
     socket.connect(new InetSocketAddress(host, port), Const.Ssl.CONNECT_TIMEOUT); 
     socket.setSoTimeout(Const.Ssl.DATA_TIMEOUT); 
     return this.sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 


    @Override 
    public String[] getDefaultCipherSuites() { 
     return this.sslContext.getSocketFactory().getDefaultCipherSuites(); 
    } 


    @Override 
    public String[] getSupportedCipherSuites() { 
     return this.sslContext.getSocketFactory().getSupportedCipherSuites(); 
    } 


    @Override 
    public Socket createSocket(String host, int port) 
      throws IOException, UnknownHostException { 
     return this.createSocket(new Socket(), host, port, true); 
    } 


    @Override 
    public Socket createSocket(InetAddress address, int port) 
      throws IOException { 
     return this.createSocket(new Socket(), address.getHostAddress(), port, true); 
    } 


    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) 
      throws IOException, UnknownHostException { 
     return this.createSocket(new Socket(), host, port, true); 
    } 


    @Override 
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) 
      throws IOException { 
     return this.createSocket(new Socket(), address.getHostAddress(), port, true); 
    } 
関連する問題