HTTPSを使用していくつかのサーバーと通信する必要があるアプリケーションを作成しています。 AWSと(AWSライブラリを使用して)やTLS 1.2を使用する内部サービスの一部と通信する必要があります。複数のTLSプロトコルをサポートするHttpClient
私はTLS 1.2のSSLContextを使用するために私のHttpClientを変更することで始まっ:
public static SchemeRegistry buildSchemeRegistry() throws Exception {
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom());
final SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext)));
return schemeRegistry;
}
と(春経由)DefaultHttpClientオブジェクトにこのSchemeRegistryを注入し、私はAWSからエラーが出るので、私が想定していることやって私は春に定義された2つのHttpClientsを持ってしようとした場合、1を
AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records.
:AWSは、TLS 1.2を(私は通常のDefaultHttpClientを使用している場合、私はこのメッセージを得ることはありません)をサポートしていないこと(私が間違っている可能性があります)それはTLS 1.2とデフォルトを使用するものを使用しています私が想定し、エラーを起因と、春は以下のように2つのHttpClientオブジェクトをインスタンス化し、オートワイヤリングしないことを意味します
SEVERE: Servlet /my-refsvc threw load() exception
java.lang.NullPointerException
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25)
...
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031)
at
...
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
私はJavaでHTTPSをあまり使用していないので、あなたの種類の人々が私にいくつかのアドバイスをしてくださいお願いしますか。 1)Springに2つのHttpClientオブジェクトを許可し、AWS stuff beansに配線する方法と、もう一方をTLS1.2サービスにアクセスするために他のBeanに配線する方法を教えてください。 2)または変更可能です1つのHttpClientオブジェクトがTLS1.2を(SSLContextまたはSchemeRegistryなどを介して)試すことができ、それが失敗した場合はTLS1.1または1.0を試してみてください。 3)どちらも可能な場合、それを行う「より良い」方法は何でしょうか?
のためにそれを有効にする方法について小さなブログの記事を作成し、あなたが '' SSLContext.getInstance(「TLSv1.1」)を使用した場合、同じエラーが出る 'またはでくださいSSLContext.getInstance( "TLS") '? – Bruno
はい、同じエラーが表示されます。私はそれがTLSバージョンではなく、それを台無しにしている私のクライアント側の証明書かどうか疑問に思っています。 – agentgonzo
(SSLContext sslContext = SSLContext.getDefault() 'が既に初期化されている場合)にデフォルトの' SSLContext'を使うようにしてください。それ以外の場合は、カスタム化を減らしてください。 'sslContext.init(createKeyManager()、null、null)'は、TMとSecureRandomのデフォルトを使用する必要があります。 keymanagerにはデフォルトがないので、keymanagerコードに何か問題がある可能性があります(サーバーがクライアント証明書を要求している場合にのみ便利です)。 – Bruno