java テスト - Commons HTTPClient 3.1にTLS 1.2をHTTPS専用に使用させる方法





tls1 (4)


あまりにも悪い人は答えませんでした。 私はそれを行うことができました、まず、 CustomHttpSocketFactoryを記述します。

String scheme = "https";
Protocol baseHttps = Protocol.getProtocol(scheme);
int defaultPort = baseHttps.getDefaultPort();

ProtocolSocketFactory baseFactory = baseHttps.getSocketFactory();
ProtocolSocketFactory customFactory = new CustomHttpsSocketFactory(baseFactory);

Protocol customHttps = new Protocol(scheme, customFactory, defaultPort);
Protocol.registerProtocol(scheme, customHttps); 

サンプルのカスタムソケットファクトリコードがhereにありますが、代わりに私はしました:

public class CustomHttpsSocketFactory implements SecureProtocolSocketFactory
{

   private final SecureProtocolSocketFactory base;

   public CustomHttpsSocketFactory(ProtocolSocketFactory base)
   {
      if(base == null || !(base instanceof SecureProtocolSocketFactory)) throw new IllegalArgumentException();
      this.base = (SecureProtocolSocketFactory) base;
   }

   private Socket acceptOnlyTLS12(Socket socket)
   {
      if(!(socket instanceof SSLSocket)) return socket;
      SSLSocket sslSocket = (SSLSocket) socket;
      sslSocket.setEnabledProtocols(new String[]{"TLSv1.2" });
      return sslSocket;
   }

   @Override
   public Socket createSocket(String host, int port) throws IOException
   {
      return acceptOnlyTLS12(base.createSocket(host, port));
   }
   @Override
   public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException
   {
      return acceptOnlyTLS12(base.createSocket(host, port, localAddress, localPort));
   }
   @Override
   public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException
   {
      return acceptOnlyTLS12(base.createSocket(host, port, localAddress, localPort, params));
   }
   @Override
   public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException
   {
      return acceptOnlyTLS12(base.createSocket(socket, host, port, autoClose));
   }

}

HTTPSの唯一のプロトコルとしてApache Commons HTTP-Client (バージョン3.1 )にTLS 1.2を使用させたいと思っています。

これは、サーバーがTLS 1.2にアップグレードされており、古いプロトコルを受け入れていないため(「接続リセット」が返されるため)

HTTP-ClientはAxis2とともにSOAPの作成に使用されます。 HttpClientの設定に使用されるコードの一部は次のとおりです。

MultiThreadedHttpConnectionManager connMgr = new MultiThreadedHttpConnectionManager();
this.httpClient = new HttpClient(connMgr);

// initialize HttpClient parameters
HttpClientParams hcParams = this.httpClient.getParams();

// Maximum time to wait to receive connection from pool
hcParams.setConnectionManagerTimeout(this.maxWait);
hcParams.setSoTimeout(this.timeout);
hcParams.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(this.retryCount, false));

// Initialize global Connection manager parameters
HttpConnectionManagerParams cmParams = connMgr.getParams();
cmParams.setDefaultMaxConnectionsPerHost(this.maxActive);
cmParams.setStaleCheckingEnabled(this.checkStaleConnections);
cmParams.setConnectionTimeout(this.timeout);

助けてくれてありがとう!




これは、クライアントの作成方法と使用しているJREのバージョンによって異なります。

JRE8を使用している場合(JRE8に付属するデフォルトのSunJSSEを置き換えない限り)、システムプロパティー "jdk.tls.client.protocols"があります。 デフォルトでは、ここで言及しているものは、すべてのクライアント通信に使用されます。

クライアント接続にHttpsURLConnectionオブジェクトを使用している場合は、システムプロパティ "https.protocols"を使用できます。 これは、JRE8だけでなく、すべてのJREバージョンで機能します。

TLSクライアントのために何も指定しない場合、JRE8では、TLSv1、v1.1、およびv1.2が有効になっているので、このバージョンのいずれかをサポートするサーバーで動作します。 しかし、JRE7ではデフォルトでTLSv1だけが有効になっています。

あなたのコードでは、いつでもデフォルトをオーバーライドすることができますかuは、システムのプロパティを通過します。 コードで設定したものが優先されます。 コードをオーバーライドするには...

1)rawソケットとSSLEngineを使用している場合は、SSLEngineでプロトコルと暗号を設定できます(sslEngine.setEnabledProtocols(..)

2)SSLSocketを使用している場合、SSLSocketでプロトコルと暗号を設定できます(sslSocket.setEnabledProtocols(..)

必要なプロトコルを有効にしてSSLContextを取得し、使用するSSLコンポーネントに合わせてSSLContextを使用することもできます。 SSLContext.getInstance( "TLSvx.x")。 デフォルトでは、TLSvx.xが有効になっているプロトコルよりも少ないすべてのプロトコルでコンテキストが返されることに注意してください。 uが "jdk.tls.client.protocols"を設定している場合、これらのプロトコルを有効にしたコンテキストが返されます。

コード内のプロトコルをハードコーディングするのは良い考えではありません。 TLSの一部のバージョンで古いサーバーや重大な脆弱性が発生するため、特定のバージョンのクライアントに遭遇することがよくあります。 システムのプロパティを使って設定するか、sslsocketまたはsslengineを明示的に設定している場合でも、それをいくつかのconfファイルから読み込みます。

また参照:

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html

http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html




コード内にSocket参照が必要です。 次に、有効なプロトコルを次のように設定できます。

if (socket != null && (socket instanceof SSLSocket)) {
    ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"});
}



Powerlordコメントで述べたPowerlord 、このエラーはXMLファイルの構文解析が正しくないために発生します。なぜなら、/ some <dependency>...</dependency>タグの間に奇妙で隠れた文字があるからです。 これらの文字はWebのコピー貼り付けから来る可能性があります。

この問題を解決するには、すべてのスペースと改行文字を<dependency>...</dependency>タグ定義の間で削除し、エディタに戻します。







java ssl https apache-commons-httpclient