2013-09-19 2 views
0

я пытаюсь вызвать службу REST с помощью JBoss остальное легко следующим образомдля отдыха простых вызовов по протоколу HTTPS, как принять все сертификаты

public ETTestCasePackage getPackageById(String packageId) throws PackageNotFound { 

    ClientRequest req = new ClientRequest("https://facebook/api"); 
    req.header("Authorization", "Basic " + EztrackerConstants.base64AuthenticationValue); 
    req.pathParameter("id", packageId); 
    ETTestCasePackage etPackage = null; 
    try { 
     logger.info("invoking "+req.getUri()); 
     //ProxyFactory.create 
     ClientResponse<ETTestCasePackage> res = req.get(ETTestCasePackage.class); 
     etPackage = res.getEntity(); 
    } catch (Exception e) { 
     logger.debug("Not able to retrieve details for testcase package having id = " + packageId, e); 
     throw new PackageNotFound("Package with id " + packageId + " not found", e); 
    } 
    return etPackage; 

} 

но выше коде явно бросить «коллегиально не прошедших проверку подлинности»;

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(Unknown Source) 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:126) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:437) 
    at 

Я могу добавить соответствующий сертификат в свои локальные java-системы безопасности, чтобы решить эту проблему. , но я могу запустить это так много машин, поэтому не могу сделать это для всех машин. поэтому я хочу, чтобы мой клиент http принимал все запросы, переопределяя проверки HTTP.

но для отдыха просто httprequest, я не могу найти способ сделать это. будет ли кто-то помогать мне делать это для отдыха.

Thanks in Advance, syam.

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

private void test(){ 

     TrustManager[] trustAllCerts = new TrustManager[]{ 
       new X509TrustManager() { 
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 
        public void checkClientTrusted(
         java.security.cert.X509Certificate[] certs, String authType) { 
        } 
        public void checkServerTrusted(
         java.security.cert.X509Certificate[] certs, String authType) { 
        } 
       } 
      }; 

      // Install the all-trusting trust manager 
      try { 
       SSLContext sc = SSLContext.getInstance("SSL"); 
       sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
       HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
      } catch (Exception e) { 
      } 

    } 

    static { 
     //for localhost testing only 
     javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
     new javax.net.ssl.HostnameVerifier(){ 

      public boolean verify(String hostname, 
        javax.net.ssl.SSLSession sslSession) { 

       return true; 
      } 
     }); 
    } 

} 
+0

Там нет ничего «очевидным» о первый код, бросающий PeerNotAuthenticatedException. Это только делает это, если что-то не так. Подход «всех доверенных сертификатов» радикально небезопасен и его даже не следует рассматривать. Либо распространяйте свой самозаверяющий сертификат, либо гораздо лучше его подписывайте CA. – EJP

ответ

0

Самый простой способ, чтобы получить соответствующий сертификат, с правильным DN и подписаны общедоступным центром сертификации, на каждом компьютере, на котором выполняется развертывание службы. Это бюрократический и раздражающий и, вероятно, стоит реальных денег, но, безусловно, проще всего в целом.

В противном случае вы должны настроить клиентов на наличие верификатора, который фактически не проверяет. Это опасно, поскольку кто-нибудь вообще (включая случайных хакеров, организованных преступников и изворотливых правительственных агентств) может сделать самозаверяющий сертификат, и нет никакого практического способа обнаружить, что они это сделали. За исключением того, что через будет отправлен весь клиент, будет использоваться весь список сертификатов сервера, который будет использоваться (позволяя верификатору выполнять свою проверку с использованием техники приемов клуба: «если вы не в списке, не приходите ").

Верификатор технически будет своего рода экземпляром X509TrustManager.

+0

Я не буду использовать это в прямом эфире, это для моей тестовой среды. поэтому я хочу обойти это. я попробовал переопределить trustManger, и установка DefaultHostnameVerifier все еще не работала для этого удобства jboss. но для apache httpclient он работал. что-то на фоне происходит во время отдыха при использовании. – syam

+0

Точно нулевой момент написания дополнительного кода для тестирования. Условия тестирования и проверенный код должны быть такими же, как и в производственной среде. В противном случае это не тест. Получите подписанный сертификат. – EJP

5

Использовать подписанные сертификаты как план A. В качестве плана B при ориентации на промежуточную версию другой системы, которую вы не контролируете, например, вы можете использовать следующее решение.

Для Resteasy 3 вам необходимо предоставить свой собственный доверяющий Httpclient экземпляр клиента. Конечно, вы никогда не должны использовать это в производстве, поэтому не зацикливайте его.

Обычно (с использованием jax-rs 2.0) вы бы инициализировать клиента, как это:

javax.ws.rs.client.Client client = javax.ws.rs.client.ClientBuilder.newClient(); 

Для всех доверителя клиента, замените его следующим образом:

Client client = null; 
if (config.trustAllCertificates) { 
    log.warn("Trusting all certificates. Do not use in production mode!"); 
    ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(createAllTrustingClient()); 
    client = new ResteasyClientBuilder().httpEngine(engine).build(); 
} 
else { 
    client = ClientBuilder.newClient(); 
} 

createAllTrustingClient() будет выглядеть следующим образом:

private DefaultHttpClient createAllTrustingClient() throws GeneralSecurityException { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); 

    TrustStrategy trustStrategy = new TrustStrategy() { 
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
     return true; 
    } 
    }; 
    SSLSocketFactory factory = new SSLSocketFactory(trustStrategy, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", 443, factory)); 

    ThreadSafeClientConnManager mgr = new ThreadSafeClientConnManager(registry); 
    mgr.setMaxTotal(1000); 
    mgr.setDefaultMaxPerRoute(1000); 

    DefaultHttpClient client = new DefaultHttpClient(mgr, new DefaultHttpClient().getParams()); 
    return client; 
} 

На всякий случай у вас возникли проблемы с определением названий пакетов классов, вот соответствующие импорты:

import org.apache.http.conn.scheme.PlainSocketFactory; 
import org.apache.http.conn.scheme.Scheme; 
import org.apache.http.conn.scheme.SchemeRegistry; 
import org.apache.http.conn.ssl.SSLSocketFactory; 
import org.apache.http.conn.ssl.TrustStrategy; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; 

import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; 
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine; 

Для справки:

+0

все устаревшие классы, но он работает! – electrobabe

0

Чтобы добавить на ответ Arnelism: если вы используете httpclient-4.2.6.jar (который является зависимость для resteasy-jaxrs-3.0.10.Final.jar), вы обнаружите, что ThreadSafeClientConnManager является @Deprecated. Вы можете изменить его BasicClientConnectionManager или PoolingClientConnectionManager вместо:

private static DefaultHttpClient createAllTrustingClient() 
               throws GeneralSecurityException { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(
     new Scheme("http", 80, PlainSocketFactory.getSocketFactory()) 
    ); 

    TrustStrategy trustStrategy = new TrustStrategy() { 
     @Override 
     public boolean isTrusted(java.security.cert.X509Certificate[] arg0, 
       String arg1) throws java.security.cert.CertificateException { 
      return true; 
     } 
    }; 
    SSLSocketFactory factory = new SSLSocketFactory(
            trustStrategy, 
            SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER 
           ); 
    registry.register(new Scheme("https", 443, factory)); 

    BasicClientConnectionManager mgr = new BasicClientConnectionManager(registry); 

    DefaultHttpClient client = 
       new DefaultHttpClient(mgr, new DefaultHttpClient().getParams()); 
    return client; 
} 
0

Нужно взломать ApacheHttpClient4Executor, приведенный ниже код является работа с HTTPS и обеспечит ClientRequest:

UriBuilder uri = UriBuilder.fromUri(request.endpoint() + request.path()); 
    System.out.println(request.endpoint() + request.path()); 

    class ApacheHttpClient4Executor2 extends ApacheHttpClient4Executor { 
    } 

    ApacheHttpClient4Executor2 executor = new ApacheHttpClient4Executor2(); 
    Scheme http = new Scheme("http", 80, PlainSocketFactory.getSocketFactory()); 

    TrustStrategy trustStrategy = new TrustStrategy() { 
     @Override 
     public boolean isTrusted(java.security.cert.X509Certificate[] chain, String authType) 
       throws CertificateException { 
      return true; 
     } 
    }; 

    SSLSocketFactory factory = null; 
    try { 
     factory = new SSLSocketFactory(trustStrategy, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    } catch (KeyManagementException | UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e1) { 

     e1.printStackTrace(); 
    } 
    Scheme https = new Scheme("https", 443, factory); 

    executor.getHttpClient().getConnectionManager().getSchemeRegistry().register(http); 
    executor.getHttpClient().getConnectionManager().getSchemeRegistry().register(https); 

    ClientRequest client = new ClientRequest(uri, executor, providerFactory); 
Смежные вопросы