2014-01-13 5 views
7

Я пытаюсь получить grizzly для использования шифрования SSL и все еще отлично работаю с Джерси. Я смотрел по всему Интернету, и я нахожу всевозможные попытки SSL с Grizzly и Jersey. Похоже, что есть разные способы сделать это в зависимости от того, какую версию вы используете, и как вы решили ее реализовать. Я еще не смог получить какие-либо примеры для работы с моим кодом.SSL с Grizzly и Jersey

Вот как я начинаю мой сервер:

static HttpServer startSecureServer() throws IOException{ 
     ResourceConfig rc=new PackagesResourceConfig("server.grizzlyresources"); 
     SSLContextConfigurator sslCon=new SSLContextConfigurator(); 

     sslCon.setKeyStoreFile(ConfigLoader.getKeystoreLocation()); // contains server keypair 
     sslCon.setKeyStorePass(ConfigLoader.getKeystorePassword()); 

     System.out.println("Starting server on port "+ConfigLoader.getHttpsServerPort()); 
     HttpServer secure=GrizzlyServerFactory.createHttpServer(BASE_URI_SECURED, rc); 
     secure.stop(); 

     HashSet<NetworkListener> lists=new HashSet<NetworkListener>(secure.getListeners()); 
     for (NetworkListener listener : lists){ 
      listener.setSecure(true); 
      SSLEngineConfigurator ssle=new SSLEngineConfigurator(sslCon); 
      listener.setSSLEngineConfig(ssle); 
      secure.addListener(listener); 
      System.out.println(listener); 
     } 

     secure.start(); 
     return secure; 
} 

private static URI getBaseURISecured(){ 
    return UriBuilder.fromUri("https://0.0.0.0/").port(ConfigLoader.getHttpsServerPort()).build(); 
} 

private static final URI BASE_URI_SECURED = getBaseURISecured(); 

ConfigLoader загружает в информации из конфигурационного файла. Когда я запускаю этот код, он запускает сервер, он находит ресурсы в пакете server.grizzlyresources, и он отлично работает! За исключением одного. Сервер не защищен. Я могу подключиться к нему telnet и отправить HTTP-запрос в текстовом виде для одного из моих ресурсов, и он вернет его. Таким образом, код работает для запуска сервера, но вся его часть SSL просто обойдена. Любые идеи, как это исправить или почему это может быть сделано?

Вот вывод на консоль, когда я запускаю его:

Starting server on port 9999 
Jan 13, 2014 9:51:08 AM com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    server.grizzlyresources 
Jan 13, 2014 9:51:08 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class server.grizzlyresources.SessionResource 
    class server.grizzlyresources.LoginResource 
Jan 13, 2014 9:51:08 AM com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
Jan 13, 2014 9:51:08 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.12 02/15/2012 04:51 PM' 
Jan 13, 2014 9:51:09 AM org.glassfish.grizzly.http.server.NetworkListener start 
INFO: Started listener bound to [0.0.0.0:9999] 
Jan 13, 2014 9:51:09 AM org.glassfish.grizzly.http.server.HttpServer start 
INFO: [HttpServer] Started. 
Jan 13, 2014 9:51:09 AM org.glassfish.grizzly.http.server.NetworkListener stop 
INFO: Stopped listener bound to [0.0.0.0:9999] 
NetworkListener{name='grizzly', host='0.0.0.0', port=9999, secure=true} 
Jan 13, 2014 9:51:09 AM org.glassfish.grizzly.http.server.NetworkListener start 
INFO: Started listener bound to [0.0.0.0:9999] 
Jan 13, 2014 9:51:09 AM org.glassfish.grizzly.http.server.HttpServer start 
INFO: [HttpServer] Started. 

Я использую Grizzly 2.2.1 и Джерси 1.12.

Спасибо!

ответ

3

ИМО вы можете использовать другой метод Factory для инициализации защищенного Grizzly HTTPServer:

HttpServer secure = GrizzlyServerFactory.createHttpServer(BASE_URI_SECURED, 
         ContainerFactory.createContainer(HttpHandler.class, rc), 
         true, 
         new SSLEngineConfigurator(sslCon)); 

При инициализации сервера, как это, вам не нужно, чтобы остановить и перенастроить его снова.

Надеюсь, это поможет.

+0

Спасибо за ответ! Это не работает, но это привело меня к поисковому пути, который, я надеюсь, приведет к решению. Теперь сервер начинает защищаться, но он умирает при рукопожатии, когда я пытаюсь использовать 'openssl s_client -connect localhost: 9999'. Я думаю, что мне просто нужно перенести все на самую новую версию Джерси, которая резко отличается от Джерси 1.12, как я понимаю. Я отправлю сообщение, если выясню это. – user1389906

+1

Вы можете включить отладку SSL: «-Djavax.net.debug = all» и посмотреть, почему сбой управления не получается – alexey

+1

Большое спасибо! Информация об отладке показала, что она пытается аутентифицировать клиента (чего я не хотел делать). Просматривая документацию на гризли, я обнаружил, что при построении SSLEngineConfigurator я могу передать логические строки, говоря им, чтобы не проверять подлинность клиента. Вот так! – user1389906

1

Следующий код работает с Grizzly 2.3.7 и я использую Джерси 1.18 - это включает в себя код для проверки подлинности клиента SSL - если вы не имеют кейсторов, эта функция просто будет проигнорирована.

/** 
* create a Server based on an url and possibly a ResourceConfig 
* 
* @param url 
* @param rc 
* @param secure 
*   - true if SSL should be used 
* @param contextPath 
* @return 
* @throws Exception 
*/ 
public HttpServer createHttpServer(String url, ResourceConfig rc, 
     boolean secure, String contextPath) throws Exception { 
    // HttpServer result = GrizzlyServerFactory.createHttpServer(url, rc); 
    // http://grepcode.com/file/repo1.maven.org/maven2/com.sun.jersey/jersey-grizzly2/1.6/com/sun/jersey/api/container/grizzly2/GrizzlyServerFactory.java#GrizzlyServerFactory.createHttpServer%28java.net.URI%2Ccom.sun.jersey.api.container.grizzly2.ResourceConfig%29 
    HttpServer result = new HttpServer(); 
    final NetworkListener listener = new NetworkListener("grizzly", 
      settings.getHost(), settings.getPort()); 
    result.addListener(listener); 
    // do we need SSL? 
    if (secure) { 
     listener.setSecure(secure); 
     SSLEngineConfigurator sslEngineConfigurator = createSSLConfig(true); 
     listener.setSSLEngineConfig(sslEngineConfigurator); 
    } 
    // Map the path to the processor. 
    final ServerConfiguration config = result.getServerConfiguration(); 
    final HttpHandler handler = ContainerFactory.createContainer(
      HttpHandler.class, rc); 
    config.addHttpHandler(handler, contextPath); 
    return result; 
} 

    /** 
* create SSL Configuration 
* 
* @param isServer 
*   true if this is for the server 
* @return 
* @throws Exception 
*/ 
private SSLEngineConfigurator createSSLConfig(boolean isServer) 
     throws Exception { 
    final SSLContextConfigurator sslContextConfigurator = new SSLContextConfigurator(); 
    // override system properties 
    final File cacerts = getStoreFile("server truststore", 
      "truststore_server.jks"); 
    if (cacerts != null) { 
     sslContextConfigurator.setTrustStoreFile(cacerts.getAbsolutePath()); 
     sslContextConfigurator.setTrustStorePass(TRUSTSTORE_PASSWORD); 
    } 

    // override system properties 
    final File keystore = getStoreFile("server keystore", "keystore_server.jks"); 
    if (keystore != null) { 
     sslContextConfigurator.setKeyStoreFile(keystore.getAbsolutePath()); 
     sslContextConfigurator.setKeyStorePass(TRUSTSTORE_PASSWORD); 
    } 

    // 
    boolean clientMode = false; 
    // force client Authentication ... 
    boolean needClientAuth = settings.isNeedClientAuth(); 
    boolean wantClientAuth = settings.isWantClientAuth(); 
    SSLEngineConfigurator result = new SSLEngineConfigurator(
      sslContextConfigurator.createSSLContext(), clientMode, needClientAuth, 
      wantClientAuth); 
    return result; 
} 
8

Извините, что так долго размещать его здесь. Ответ Алексея привел меня к рабочему решению, которое во многом напоминает код Вольфганга Фаля. Вот что я закончил с:

static HttpServer startSecureServer() throws IOException 
{ 
    System.out.println("Starting server on port " + ConfigLoader.getHttpsServerPort()); 
    ResourceConfig rc = new PackagesResourceConfig("com.kinpoint.server.grizzlyresources"); 

    SSLContextConfigurator sslCon = new SSLContextConfigurator(); 

    sslCon.setKeyStoreFile(ConfigLoader.getKeystoreLocation()); // contains server keypair 
    sslCon.setKeyStorePass(ConfigLoader.getKeystorePassword()); 

    HttpHandler hand = ContainerFactory.createContainer(HttpHandler.class, rc); 

    HttpServer secure = GrizzlyServerFactory.createHttpServer(BASE_URI_SECURED, hand, true, 
      new SSLEngineConfigurator(sslCon, false, false, false)); 

    return secure; 
} 

Второй параметр в SSLEngineConfigurator говорит это не использовать режим клиента. Это то, что меня путало. Спасибо за помощь.

+0

Это было очень полезно. Я заметил, что когда я запускаю свой сервер с фиктивными учетными данными (местоположение/пароль хранилища ключей), я не получаю никаких исключений, но служба недоступна. Проверяет ли ваш ConfigLoader какую-либо проверку, или вы нашли другой способ поймать ошибки? – Amber

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