2014-12-02 3 views
0

Я пишу интеграционные тесты для приложения Mule ESB. Приложение Mule подключается к стороннему API через HTTPS. Когда я пытаюсь запустить свое приложение против сторонней конечной точки API тестирования, все работает отлично, и мне не нужно добавлять какую-либо конфигурацию SSL к разъему HTTPS. Я считаю, что это связано с тем, что у их сервера есть сертификаты CA, поэтому они сразу же доверяют и, например, HTTP-коннектор, такой какРазъем Mule HTTPS, который доверяет всем сертификатам

<https:connector 
     name="my.https.connector" 
     cookieSpec="netscape" 
     validateConnections="true" 
     sendBufferSize="0" 
     receiveBufferSize="0" 
     receiveBacklog="0" 
     clientSoTimeout="10000" 
     serverSoTimeout="10000" 
     socketSoLinger="0" 
     doc:name="HTTPS"> 
    <service-overrides sessionHandler="org.mule.session.NullSessionHandler"/> 
</https:connector> 

будет работать из коробки.

При написании интеграционного теста я заглушаю (или высмеиваю, если хотите) сторонний API. Однако для того, чтобы сделать работу SSL я должен генерировать хранилище ключей для встроенного сервера HTTPS и изменить разъем HTTPS клиента путем добавления

<https:tls-client path="keystore" storePassword="psw" /> 
    <https:tls-key-store path="keystore" storePassword="psw" keyPassword="psw" /> 

как уже упоминалось во всем Интернете.

Я мог бы определить тестовый HTTPS-коннектор в отдельном XML-файле и загрузить его в методе FunctionalTestCase.getConfigResources(). Однако это не идеально: то, что я на самом деле, это способ сделать HTTPS-коннектор (клиент) доверять всем - но только при запуске теста интеграции, т. Е. При создании Maven. Это должно произойти программно, чтобы оставить код приложения Mule нетронутым.

Я пытался добавить следующий код в @BeforeClass аннотированный метод

http://www.rgagnon.com/javadetails/java-fix-certificate-problem-in-HTTPS.html

, но не везло. Я все еще получаю следующее исключение при выполнении интеграционных тестов

Exception stack is: 
1. unable to find valid certification path to requested target (sun.security.provider.certpath.SunCertPathBuilderException) 
    sun.security.provider.certpath.SunCertPathBuilder:196 (null) 
2. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (sun.security.validator.ValidatorException) 
    sun.security.validator.PKIXValidator:385 (null) 
3. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (javax.net.ssl.SSLHandshakeException) 
    sun.security.ssl.Alerts:192 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/net/ssl/SSLHandshakeException.html) 

Любой, у кого есть рабочее решение? :)

ответ

0

Есть ли особая причина, по которой вы не можете просто создать тестовый файл jks для импорта в экосистему ESB для тестирования? Я предполагаю, что ESB имеет тестовую среду, из которой вы запускаете свои тестовые примеры.

+0

Нет, простите, это не тот случай. Для моего тестирования интеграции я запускаю полностью встроенную среду, которая во время сборки Maven создается программно. В этом весь смысл использования набора совместимости тестов Mule (TCK) ', и именно здесь возникает проблема с HTTPS. – Guido

+0

Как правило, в этих сценариях, где у вас есть встроенная среда, в которой тестовая среда (в данном случае Mule) отображает/удаляет веб-контейнер, вы можете обычно включать параметры безопасности, в которых Mule должен иметь возможность вводить в контейнер при запуске , Таким образом, последовательность событий должна выглядеть следующим образом: 1. Скопируйте JKS в папку 2. Конфигурация безопасности Развертывание в веб-контейнер 3. Развертывание приложений 4. Выполнить тест 5. Shutdown – anonymous

+0

Хорошо, я думаю, я понимаю вопрос Теперь. У вас есть Mock Service, в которой у вас нет надлежащей цепочки CA, поэтому вы получаете ошибку SSL.Клиентский тест - тот, который испытывает проблему. Когда вы запускаете клиентский тест, вы хотите, чтобы клиент игнорировал ошибки SSL только на время тестирования. В этом случае я бы сказал, что вы используете параметры java для выполнения самого теста: java -Djavax.net.ssl.keyStore = serverKeys -Djavax.net.ssl.keyStorePassword = password -Djavax.net. ssl.trustStore = serverTrust -Djavax.net.ssl.trustStorePassword = password SSLApplication – anonymous

0

Установить это в свойствах в менеджере выполнения: com.ning.http.client.AsyncHttpClientConfig.acceptAnyCertificate = True

Настройка файл pom.xml по мере необходимости так, чтобы она торчит между разворачивает.

Смежные вопросы