2015-06-05 2 views
1

Это первый раз, когда я получил требование подключиться к https url. В мгновение ока я узнал, что мне нужно пройти SSLContext.Как настроить wildfly для использования https с ClientBuilder в resteasy?

Я также узнал, что мне нужно настроить в standalone.xml, чтобы это сделать.

Любые указатели на решение/ссылку, рабочий код будет высоко оценен.

Нужно ли нам генерировать хранилища ключей? или wildfly предоставляет любые существующие?

Это то, что я пробовал:

SSLContext context = null; 
    KeyManagerFactory kmf = null; 
    KeyStore ks = null; 
    char[] storepass = "somestringhere".toCharArray(); 
    char[] keypass = "somestringhere".toCharArray(); 

    try { 
     context = SSLContext.getInstance("SSL"); 
    } catch (NoSuchAlgorithmException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } 
    try { 
     kmf = KeyManagerFactory.getInstance("SunX509"); 
    } catch (NoSuchAlgorithmException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    FileInputStream fin = null; 
    try { 
     fin = new FileInputStream("file here"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     ks = KeyStore.getInstance("JKS"); 
    } catch (KeyStoreException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     ks.load(fin, storepass); 
    } catch (NoSuchAlgorithmException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (CertificateException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    try { 
     kmf.init(ks, keypass); 
    } catch (UnrecoverableKeyException | KeyStoreException | NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     context.init(kmf.getKeyManagers(), null, null); 
    } catch (KeyManagementException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    Client client = ClientBuilder.newBuilder().sslContext(context).build(); 

    WebTarget target = client 
      .target("https://...."); 

    Builder builder = target.request(); 

Я попытался https://stackoverflow.com, он дал 200OK, я попробовал google.com, он сказал документ переместилась 302 статуса. Я попробовал URL, который я хочу, чтобы соединить я получил коллегиально не прошла проверку подлинности исключения

Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:421) [jsse.jar:1.7.0_71] 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) [httpclient-4.2.5.jar:4.2.5] 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) [httpclient-4.2.5.jar:4.2.5] 
    at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283) [resteasy-client-3.0.6.Final.jar:] 
    ... 30 more 

И сервер запрашивает для базовой аутентификации, это причина для исключения?

ответ

1

«Нужно ли нам создавать кейсторы?»

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

См. SSL setup guide в документации Wildfly. Он покажет вам, как создать хранилище ключей и настроить его с помощью Wildfly. Просто следуйте разделу «Чистая Java-настройка SSL с помощью keytool»

Затем вам нужно создать клиентское хранилище ключей. Вы экспортируете сертификат из хранилища сервера и импортируете его в хранилище клиентов.

Как это работает, так это то, что Client должен доверять серверу. И способ сделать это через сертификат сервера. Теперь, если сертификат подписан с помощью известного CA, обычно Java уже поддерживает этот сертификат, и нам не нужно настраивать клиента. Но поскольку вы создаете свой собственный сертификат, мы должны настроить клиент, чтобы доверять сертификату сервера, импортируя его в хранилище доверия.

Вы можете увидеть все шаги для обработки сертификатов/магазинов для обоих клиентов и здесь in this post. Перейдите к шагу 5. Три команды, которые начинаются с keytool, являются командами для выполнения этой задачи. Первый создает хранилище серверов с именем tomcat-keystore.jks (но вы можете назвать его чем угодно). Следующий фрагмент экспортирует сертификат из хранилища ключей в имя файла tomcat.crt (но вы его ничем не называете). Третья команда импортирует предыдущий сертификат в client-truststore.jks (но вы можете назвать его чем угодно). Вы заметите, что вам не нужно явно создавать хранилище доверия, оно будет создаваться неявно, когда мы будем импортировать.

Как только у вас есть серверное хранилище ключей, следуйте инструкциям в документации по wildfly, приведенной выше, и настройте хранилище с сервером.

Чтобы настроить Client, см. Шаг 6 в приведенном выше ответе. Он настраивает клиента с созданным нами хранилищем доверия.Все в коде является стандартным Java и JAX-RS, за исключением конфигурации Basic auth, что характерно для Джерси.

+0

Я подключения HTTPS URL, но что URL не mine..I значит, не из моего приложения JAX-RS ... Я просто хочу, чтобы подключиться к этому URL, используя ClientBuilder апи .. поэтому в этом случае мне не нужно настраивать сервер wildfly с правом сертификата? так как я не хочу размещать какие-либо https-вызовы? – pinkpanther

+0

Извините, я думал, что вы хотите провести тестирование со своего сервера и клиента. Если сервер, к которому вы обращаетесь, имеет сертификат, подписанный хорошо известным ЦС, скорее всего, у Java есть сертификат в собственном магазине доверия, и вам не нужно будет его настраивать. Предположим, вы хотели получить доступ к API Google. В хранилище доверия обязательно будет сертификат, и вам не нужно настраивать клиента. Это нужно делать только тогда, когда сертификату не доверяют. Вы можете попытаться сделать запрос https на сервер и посмотреть, что произойдет. Если cert не доверен, вы можете либо игнорировать ненадежный сертификат, либо загрузить его, либо добавить его. –

+0

Возможно, я мог бы найти вам некоторую хорошую информацию в любом случае, но сначала вы должны, вероятно, проверить, работает ли он с URL-адресом, который вы пытаетесь доступ. –

1

Вот мои коды для использования JAX-RS с HTTPS с использованием Wildly 10. Обратите внимание, что Wildly для JAX-RS - это RestEasy 3.xxxx.

ClientBuilder builder = ClientBuilder.newBuilder(); 
builder.sslContext(ConnectionFactory.getSslContext()); 
builder.hostnameVerifier(ConnectionFactory.getHostnameVerifier()); 
client = builder.build(); 
String baseURI = acsUser.getSelectedService().getWebserviceBaseUrl(); 
WebTarget webTarget = client.target(baseURI); 

Этот класс называется ConnectionFactory.

public class ConnectionFactory { 

Proxy proxy; 

String proxyHost; 

Integer proxyPort; 

public boolean canConnect = true; 

private static final Logger log = Logger.getLogger("ReportPortal"); 

public ConnectionFactory() { 
} 

/** 
* 
* @return 
*/ 
public static SSLContext getSslContext() { 
    SSLContext sslContext = null; 
    try { 
     sslContext = SSLContext.getInstance("SSL"); 
     sslContext.init(null, new TrustManager[]{new  SecureTrustManager()}, new SecureRandom()); 
    } 
    catch (NoSuchAlgorithmException | KeyManagementException ex) { 
     log.error("ERROR OCCURS", ex); 
    } 
    return sslContext; 
} 

/** 
* 
* @return 
*/ 
public static HostnameVerifier getHostnameVerifier() { 
    return (String hostname, javax.net.ssl.SSLSession sslSession) -> true; 
} 

public Boolean isHttps(String url) { 

    if (url.startsWith("https://")) { 
     return Boolean.TRUE; 
    } 
    else { 
     return Boolean.FALSE; 
    } 
} 

}

+0

Это решение сработало для меня, используя эту реализацию SecureTrustManager http://stackoverflow.com/questions/10385259/configure-proxy-to-jersey-client/10394903 – user954156

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