Mule — «не удалось найти действительный путь сертификации к запрошенной цели» при попытке отправить сообщение через HTTPS

У меня есть поток Mule (Mule CE 3.4.0, Studio 3.5.0), который обрабатывает некоторый XML и отправляет его в веб-службу с использованием конечной точки HTTPS, например:

<flow>
    <!-- Process XML -->
    <https:outbound-endpoint address="https://admin:password@localhost:8081/hello" exchange-pattern="request-response" contentType="text/xml" method="POST" doc:name="HTTP"/>
    <!-- Evaluate response -->
</flow>

В производственной среде это затронет веб-службу, предоставляемую другой платформой, но для локального тестирования я создал совершенно отдельное приложение Mule (отдельная рабочая область, файл проекта и т. д.), которое предоставляет конечную точку HTTPS для использования сообщения:

<spring:beans>
    <security:authentication-manager alias="MyManager">
        <security:authentication-provider>
            <security:user-service id="UserService">
                <security:user name="admin" password="password" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager> 
</spring:beans>

<spring-security:security-manager>
    <spring-security:delegate-security-provider name="InMemory" delegate-ref="MyManager"/>
</spring-security:security-manager>

<https:connector name="httpsConnector">
    <https:tls-key-store path="test.jks" keyPassword="test1234" storePassword="test1234"/>
</https:connector>

<flow name="httpTestFlow" doc:name="httpTestFlow">
    <https:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8081" doc:name="HTTP" connector-ref="httpsConnector">
        <spring-security:http-security-filter realm="mule-realm" securityProviders="InMemory"/>
    </https:inbound-endpoint>
    <object-to-string-transformer doc:name="Object to String"/>
    <logger level="INFO" message="The XML message received is: #[payload]" doc:name="Logger"/>
</flow>

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

********************************************************************************
Message               : Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=https://admin:<password>@localhost/hello, connector=HttpsConnector
{
  name=connector.https.mule.default
  lifecycle=start
  this=7cc4f42c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[https]
  serviceOverrides=<none>
}
,  name='endpoint.https.localhost.8081.hello', mep=REQUEST_RESPONSE, properties={http.method=POST, Content-Type=text/xml}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: PostMethod
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
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)
4. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=https://admin:<password>@localhost/hello, connector=HttpsConnector
{
  name=connector.https.mule.default
  lifecycle=start
  this=7cc4f42c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[https]
  serviceOverrides=<none>
}
,  name='endpoint.https.localhost.8081.hello', mep=REQUEST_RESPONSE, properties={http.method=POST, Content-Type=text/xml}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: PostMethod (org.mule.api.transport.DispatchException)
  org.mule.transport.http.HttpClientMessageDispatcher:155 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

И эта ошибка внутри моего другого приложения, получающего сообщение:

ERROR 2014-06-05 15:58:05,380 [[test-webservice].http.request.dispatch.8081.01] org.mule.exception.DefaultSystemExceptionStrategy: Caught exception in Exception Strategy: Received fatal alert: certificate_unknown
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:818)
    at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
    at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:50)
    at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
    at org.mule.transport.http.HttpServerConnection.readLine(HttpServerConnection.java:243)
    at org.mule.transport.http.HttpServerConnection.getRequestLine(HttpServerConnection.java:509)
    at org.mule.transport.http.HttpRequestDispatcherWork.run(HttpRequestDispatcherWork.java:70)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)

Может ли кто-нибудь определить, что здесь может пойти не так, или предложить альтернативный способ локального тестирования моей исходящей конечной точки? Заранее спасибо.


person danw    schedule 05.06.2014    source источник


Ответы (1)


Вы уверены, что ваше отдельное приложение действительно работает? Похоже, что нет: может, он просто не запускается?

person David Dossot    schedule 05.06.2014
comment
Привет @David, похоже, что-то не так с моим файлом test.jks - теперь, когда я исправил эту проблему, у меня возникают новые проблемы, см. вопрос об обновлении для получения дополнительной информации. - person danw; 05.06.2014
comment
Можете ли вы завить -k? Если да, вам необходимо установить сертификат змеиного масла в хранилище ключей клиента соединителя HTTPS, используемого в клиентском приложении Mule. - person David Dossot; 06.06.2014
comment
Да, я могу завить -k. Знаете ли вы руководство, которое я мог бы использовать для установки сертификата змеиного масла? Я не знаком с тем, как это сделать - person danw; 06.06.2014
comment
Если вам удалось сохранить сертификат сервера и ключ в test.jks, вы сможете установить только сертификат в новом client.jks. Это должно помочь: docs.oracle.com/javase/tutorial/security/ инструментальный знак/rstep2.html - person David Dossot; 06.06.2014
comment
При создании test.jks я не уверен, что хранил внутри него сертификат сервера, я использовал команду: keytool -genkey -alias mule -keyalg RSA -keystore test.jks - это было бы сделано автоматически? Кроме того, в опубликованной вами ссылке упоминается файл .cer, я не могу найти на своем компьютере файлы с таким расширением... - person danw; 06.06.2014
comment
Перейдите к https://admin:password@localhost:8081/hello и запишите .cer, щелкнув значок замка и следуя меню, чтобы получить его. Используйте portecle.sourceforge.net, чтобы легко проверить JKS. - person David Dossot; 06.06.2014
comment
Спасибо @David, теперь я смог разрешить исключение unable to find valid certification path to requested target, но теперь я заблокирован исключением No X509TrustManager implementation available внутри моего приложения Mule, обращающегося к конечной точке входящего трафика HTTPS. Я буду исследовать это дальше и открою новый вопрос, если не смогу решить проблему. Спасибо еще раз. - person danw; 09.06.2014