Не удается настроить SSL для Apache CXF и JAX-RS

#rest #cxf #jax-rs

#rest #cxf #jax-rs

Вопрос:

У меня возникли проблемы с правильной настройкой, чтобы заставить мой клиент CXF REST взаимодействовать с моим сервером CXF. Я получаю страшное исключение javax.net.ssl.SSLHandshakeException: Получено фатальное предупреждение: handshake_failure. Странно то, что эта конфигурация работала, когда мы использовали CXF для SOAP. Приветствуются любые подсказки.

Вот конфигурация на стороне сервера:

 <httpj:engine-factory bus="cxf">
<httpj:engine port="443">
<httpj:tlsServerParameters>
    <sec:keyManagers keyPassword="password">
        <sec:keyStore type="JKS" password="password" file="cxf.jks"/>
    </sec:keyManagers>
    <sec:trustManagers>
        <sec:keyStore type="JKS" password="password" file="cxf.jks"/>
    </sec:trustManagers>
    <sec:cipherSuitesFilter>
        <sec:include>.*_EXPORT_.*</sec:include>
        <sec:include>.*_EXPORT1024_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:include>.*_WITH_NULL_.*</sec:include>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
    </sec:cipherSuitesFilter>
</httpj:tlsServerParameters>
<httpj:sessionSupport>true</httpj:sessionSupport>
</httpj:engine>
</httpj:engine-factory>


<jaxrs:server id="restContainer" bus="cxf" address="/" >
<jaxrs:serviceBeans>
    <ref bean="policyService"/>
</jaxrs:serviceBeans>
</jaxrs:server>
  

И вот конфигурация клиента:

 <http:conduit name="*.http-conduit">
    <http:tlsClientParameters>
        <sec:keyManagers
            keyPassword="password">
            <sec:keyStore type="JKS"
                password="password"
                file="cxf.jks" />
        </sec:keyManagers>
        <sec:trustManagers>
            <sec:keyStore type="JKS"
                password="password"
                file="cxf.jks" />
        </sec:trustManagers>
        <sec:cipherSuitesFilter>
            <sec:include>.*_EXPORT_.*</sec:include>
            <sec:include>.*_EXPORT1024_.*</sec:include>
            <sec:include>.*_WITH_DES_.*</sec:include>
            <sec:include>.*_WITH_NULL_.*</sec:include>
            <sec:exclude>.*_DH_anon_.*</sec:exclude>
        </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
    <http:client AutoRedirect="true" ReceiveTimeout="0"  Connection="Keep-Alive" />
</http:conduit>
  

Это тип клиента, который я использую:

 MyRestApi api = JAXRSClientFactory.create(myRestUri, MyRestApi.class);
  

Все это работает нормально в чистом виде, проблема заключается только в SSL.

Комментарии:

1. Возникает аналогичная проблема… Использование javax.net.debug=all в командной строке Java, похоже, показывает нам, что cxf не может найти truststore / хранилище ключей.

2. Я обнаружил, что вам необходимо импортировать сертификат сервера на ваш клиентский компьютер. В Linux или OS X: keytool -import -trustcacerts -псевдоним <псевдоним> -файл <файл сертификата> -хранилище ключей <your_path_to_jre>/lib/security /cacerts -изменение доступа к хранилищу -noprompt -v

Ответ №1:

чтобы убедиться, что у вас правильные настройки, вы можете жестко запрограммировать его (temp.) следующим образом:

     System.setProperty("javax.net.ssl.keyStore", "/usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts");
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
    System.setProperty("javax.net.ssl.trustStore", "/usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("javax.net.debug", "all");
  

затем с помощью проверки выходных данных вы можете отлаживать больше…