6

アプリケーションで Spring RestTemplate を使用して、外部 Web サービスにアクセスしています。ただし、この Web サービスは SSL を有効にしており、自己署名証明書 (ドメインなども有効ではありません) を使用しています。これはローカル ネットワーク上にあるだけなので、セキュリティ上の問題について心配する必要はありません。この証明書を受け入れるようにSpringを作りたいです。これは私がこれまでに行ったことです:

1.) このキーストアを使用するように JBOSS 7 を設定しました

<connector name="https" protocol="HTTP/1.1" socket-binding="https" scheme="https" enable-lookups="false" secure="true">
    <ssl name="ssl" key-alias="my-private-key" password="rmi+ssl" certificate-key-file="../standalone/configuration/server-keystore.jks" protocol="TLSv1" verify-client="false"/>
</connector>

2.) これが私の RestTemplate Bean の構成です (クラスでオートワイヤーを使用しています)

<bean id="stringHttpConverter" class="org.springframework.http.converter.StringHttpMessageConverter"></bean>

<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">
    <property name="authenticationPreemptive" value="true"/>
    <property name="connectionManagerClass" value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"/>
</bean>

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg ref="httpClientParams"/>
</bean>

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <constructor-arg ref="httpClient"/>
</bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg ref="httpClientFactory"/>
    <property name="messageConverters">
        <list>
            <!-- <ref bean="marshallingConverter" /> -->
            <ref bean="stringHttpConverter" />              
        </list>
    </property>
</bean>

サーバー証明書をキーストアにインポートしました。間違いなくそこにあります。他に何をしなければなりませんか?ここで同様の質問をすべて確認しましたが、どれも役に立ちませんでした。ありがとう。

4

2 に答える 2

2

jboss-web のコネクタで指定した server-keystore.jks は、着信接続のサーバー証明書としてのみ使用されます。

アウトバウンド接続の場合、JBoss は他の Java クライアントと同じように動作するため、サーバー証明書をデフォルトの Java トラストストアにインポートする必要があります。デフォルトの %JAVA_HOME%\lib\security\cacerts を使用し、次を使用してサーバー証明書をインポートできます。

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias mycert -file mycert.cer

デフォルトの cacerts を編集したくない場合は、HTTPS/SSL を介した Java クライアント証明書で説明されているように、システム プロパティを設定することで代替のトラストストアを定義できます。

3 番目の方法は、次のようにすべての証明書を受け入れるように https ProtocolSocketFactory をオーバーライドすることです

于 2012-01-04T17:17:53.493 に答える
2

私は簡単な方法を作りました:

static HttpComponentsClientHttpRequestFactory requestFactory = null;

/**
 *
 * @return
 */
public static ServerProperties getServerProperties() {
    return serverProperties;
}

/**
 * @return
 */
public static HttpComponentsClientHttpRequestFactory getRequestFactory() {
    if (requestFactory == null) {
        TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
            @Override
            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                return true;
            }
        };
        SSLContext sslContext = null;
        try {
            sslContext = org.apache.http.ssl.SSLContexts.custom()
                    .loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
            SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

            CloseableHttpClient httpClient = HttpClients.custom()
                    .setSSLSocketFactory(csf)
                    .build();
            requestFactory = new HttpComponentsClientHttpRequestFactory();
            requestFactory.setHttpClient(httpClient);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
    }
    return requestFactory;
}

次に、restTemplate をインスタンス化すると、次のようになります。

 RestTemplate  restTemplate = new RestTemplate(getRequestFactory());

単純。

于 2017-08-02T22:46:54.410 に答える