2016-01-14 5 views
2

Я получаю SSLHandShakeException при попытке простого запроса GET с JBOSS RestEasyClient к моему API в AWS API Gateway. Вот мой код:SSLHandShakeException для AWS API Gateway с ResteasyClient

public static void main(String[] args){ 
    ResteasyClient client = new ResteasyClientBuilder().build(); 
    ResteasyWebTarget target = client.target("https://MYAPI_ID.execute-api.us-east-1.amazonaws.com/prod/proxy"); 
    Response response = target.request().get(); 
    String value = response.readEntity(String. class); 
    System.out.println(value); 
    response.close(); 
} 

И я получаю это:

Exception in thread "main" javax.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request 
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287) 
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436) 
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.get(ClientInvocationBuilder.java:159) 
at com.contaazul.gov.core.TesteSimples.main(TesteSimples.java:20) 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:533) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:401) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:178) 
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304) 
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) 
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283) 
... 3 more 

Этот код прекрасно работает на других сайтах, как https://google.com/ и URL моего API работает с локон, Python urllib2, и что-то вроде этого в Java: System.out.println(org.apache.commons.io.IOUtils.toString(new URL("https://MYAPI_ID.execute-api.us-east-1.amazonaws.com/prod/proxy")));

Я уже пробовал добавить cert в хранилище ключей (много раз, много способов), и я думаю, что если проблема с сертификатом, я не могу получить ответ с помощью IOUtils, не так ли?

Спасибо!

+0

Это * похоже на * более активное отклонение от шлюза API, чем пассивный сбой, за что он стоит. 'Полученное фатальное предупреждение: handshake_failure' подсказывает мне, что стек SSL на дальней стороне активно отказывается вести переговоры, возможно, из-за версии SSL/TLS или шифрования, который вы пытаетесь провести, или, возможно, потому, что вы не являетесь SNI- способен. http://stackoverflow.com/questions/30828759/thread-6-recv-tlsv1-alert-fatal-handshake-failure –

ответ

1

Каждое исключение SSLHandShakeException, которое я когда-либо видел с помощью API Gateway, было вызвано тем, что клиент не поддерживает SNI. API Gateway использует идентификатор имени сервера (SNI) для поддержки многих пользовательских имен доменов, используя небольшой набор IP-адресов, чтобы избежать необходимости назначать выделенный IP-адрес для каждого имени. Таким образом, клиент должен поддерживать SNI, чтобы вызывать API, поддерживаемый шлюзом API.

1

Вы получаете эту ошибку, поскольку API Gateway использует SNI, и все клиенты должны иметь поддержку SNI для доступа к ней.

0

За этим вопросом: https://issues.jboss.org/browse/RESTEASY-1089, вы можете попробовать следующую работу вокруг для ошибки в HTTPClient-4.2.1, который предотвращает SNI от работы:

ResteasyClient client = 
    new ResteasyClientBuilder() 
     .httpEngine(new URLConnectionEngine()) 
     .build(); 

Это должно быть зафиксировано в HttpClient-4,3. 2.

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