2016-02-03 2 views
0

В поисках ответа на этот вопрос я наткнулся на http://blog.nanthrax.net/2013/02/multiple-http-connectors-in-apache-karaf/ и Jetty SSL configuration Apache karaf, но эта информация устарела. Я нашел новую документацию по адресу https://www.eclipse.org/jetty/documentation/current/configuring-connectors.html, и примеры отличаются от предложенных конфигураций. Apache Karaf 4.0.2, похоже, использует Jetty 9.Как добавить соединитель SSL для apache karaf?

У меня уже есть хранилище ключей в $ {karaf.home} /etc/keystores/keystore.jks и хотелось бы просто добавить второй разъем ssl на порт 14000. Как сделать это?

Вот мой org.ops4j.pax.web.cfg:

org.osgi.service.http.port=8181 

org.osgi.service.http.port.secure=8443 
org.osgi.service.http.secure.enabled=true 
org.ops4j.pax.web.ssl.keystore=./etc/keystores/keystore.jks 
org.ops4j.pax.web.ssl.password=seeburger 
org.ops4j.pax.web.ssl.keypassword=seeburger 

org.ops4j.pax.web.config.file=${karaf.home}/etc/jetty.xml 

Вот мой jetty.xml:

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    <Call name="addConnector"> 
     <Arg> 
      <New class="org.eclipse.jetty.server.ServerConnector"> 
       <Arg name="server"> 
        <Ref refid="Server" /> 
       </Arg> 
       <Arg name="factories"> 
        <Array type="org.eclipse.jetty.server.ConnectionFactory"> 
         <Item> 
          <New class="org.eclipse.jetty.server.SslConnectionFactory"></New> 
         </Item> 
         <Item> 
          <New class="org.eclipse.jetty.server.HttpConnectionFactory"></New> 
         </Item> 
        </Array> 
       </Arg> 
       <Set name="host"> 
        <Property name="jetty.host" default="0.0.0.0" /> 
       </Set> 
       <Set name="port"> 
        <Property name="jetty.port" default="14000" /> 
       </Set> 
       <Set name="idleTimeout"> 
        <Property name="http.timeout" default="30000" /> 
       </Set> 
       <Set name="name">restConnector:14000</Set> 
      </New> 
     </Arg> 
    </Call> 
</Configure> 

я должен был установить имя, как это обойти в pax- в ArrayIndexOutOfBoundsException 1 веб-мол-4.2.2.jar в org.ops4j.pax.web.service.jetty.internal.ServerControllerImpl$Stopped.start(ServerControllerImpl.java:503):

String[] split = connector.getName().split(":"); 
if (httpSecurePort == Integer.valueOf(split[1]) 
     .intValue() 
     && address.equalsIgnoreCase(split[0])) { ... } 

Теперь разъем, кажется, начинается с того, что я вижу в журнал:

2016-02-03 13:39:19,821 | INFO | pool-60-thread-1 | JettyServerImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | Pax Web available at [localhost]:[14000] 
2016-02-03 13:39:19,821 | INFO | pool-60-thread-1 | JettyFactoryImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | SPDY not available, creating standard ServerConnector for Http 
2016-02-03 13:39:19,822 | INFO | pool-60-thread-1 | JettyServerImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | Pax Web available at [0.0.0.0]:[8181] 
2016-02-03 13:39:19,825 | INFO | pool-60-thread-1 | JettyFactoryImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | No ALPN class available 
2016-02-03 13:39:19,825 | INFO | pool-60-thread-1 | JettyFactoryImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | SPDY not available, creating standard ServerConnector for Https 
2016-02-03 13:39:19,825 | INFO | pool-60-thread-1 | JettyServerImpl     | 128 - org.ops4j.pax.web.pax-web-jetty - 4.2.2 | Pax Web available at [0.0.0.0]:[8443] 
... 
2016-02-03 14:02:03,493 | INFO | pool-54-thread-1 | ContextHandler     | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | Started HttpServiceContext{httpContext=org.apache.felix.webconsole.internal.[email protected]} 
2016-02-03 14:02:03,493 | INFO | pool-54-thread-1 | Server       | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | jetty-9.2.10.v20150310 
2016-02-03 14:02:03,571 | INFO | pool-54-thread-1 | ServerConnector     | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | Started restConnector:[email protected]{SSL-HTTP/1.1}{0.0.0.0:14000} 
2016-02-03 14:02:03,571 | INFO | pool-54-thread-1 | ServerConnector     | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | Started [email protected]{HTTP/1.1}{0.0.0.0:8181} 
2016-02-03 14:02:03,602 | INFO | pool-54-thread-1 | ServerConnector     | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | Started [email protected]{SSL-http/1.1}{0.0.0.0:8443} 
2016-02-03 14:02:03,602 | INFO | pool-54-thread-1 | Server       | 115 - org.eclipse.jetty.util - 9.2.10.v20150310 | Started @14307ms 

Но если я пытаюсь открыть https://localhost:14000/ в моем браузере я получаю ERR_CONNECTION_CLOSED и следующее исключение:

2016-02-03 15:46:00,509 | DEBUG | qtp427346077-223 | HttpConnection     | 79 - org.eclipse.jetty.util - 9.2.10.v20150310 | 
javax.net.ssl.SSLHandshakeException: no cipher suites in common 
     at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1431)[:1.8.0_60] 
... 
Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)[:1.8.0_60] 

ли я что-то пропустил в конфигурации причала?

ответ

0

После нескольких часов тестирования различных конфигураций и отладки с отладчиком eclipse плюс log:set DEBUG в karaf я, наконец, пришел в правильную конфигурацию. Вот оно:

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"> 
    <Set name="KeyStorePath"><Property name="jetty.home" default="." />/etc/keystores/keystore.jks</Set> 
    <Set name="KeyStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set> 
    <Set name="KeyManagerPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set> 
    <Set name="TrustStorePath"><Property name="jetty.home" default="." />/etc/keystores/keystore.jks</Set> 
    <Set name="TrustStorePassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set> 
    </New> 
    <Call name="addConnector"> 
    <Arg> 
     <New class="org.eclipse.jetty.server.ServerConnector"> 
     <Arg name="server"> 
      <Ref refid="Server" /> 
     </Arg> 
     <Arg name="factories"> 
      <Array type="org.eclipse.jetty.server.ConnectionFactory"> 
      <Item> 
       <New class="org.eclipse.jetty.server.SslConnectionFactory"> 
       <Arg name="next">http/1.1</Arg> 
       <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg> 
       </New> 
      </Item> 
      <Item> 
       <New class="org.eclipse.jetty.server.HttpConnectionFactory"></New> 
      </Item> 
      </Array> 
     </Arg> 
     <Set name="host"> 
      <Property name="jetty.host" default="0.0.0.0" /> 
     </Set> 
     <Set name="port"> 
      <Property name="jetty.port" default="14000" /> 
     </Set> 
     <Set name="idleTimeout"> 
      <Property name="http.timeout" default="30000" /> 
     </Set> 
     <Set name="name">restConnector:14000</Set> 
     </New> 
    </Arg> 
    </Call> 
</Configure> 

Решающие моменты:

  • Выберите имя соединителя с двоеточием, чтобы обойти PAXWEB-907
  • Экземпляр SslContextFactory должен быть создан с помощью свойств хранилища ключей и ссылки в SslConnectionFactory
  • Необходимо указать как SslConnectionFactory, так и HttpConnectionFactory, в соответствии с которыми важно указать их в этом порядке.
+0

как альтернатива этому вопросу PAXWEB-907 сделать обновление до Karaf 4.0.4, который включает в себя исправления для этого. –

+0

Я должен придерживаться Karaf 4.0.2 на данный момент. –

0

Мне недавно пришлось столкнуться с такой же ситуацией, что и я прошел довольно легко. Я создал свои собственные jks самостоятельно, а затем настроил только Pax Web через cfg-файлы.

  1. Создать JKS

    Keytool -genkeypair -keyalg RSA -validity 2048 \ -alias dontesta-karaf \ -dNAME «сп = karaf.dontesta.it, НУ = R & D Labs, о = Блог Антонио Мусарры, C = IT, L = Рим, S = Италия "\ -keypass changeit -storepass changeit \ -keystore dontesta-karaf-server.jks \ -ext SAN = DNS: www.dontesta.it, DNS: services.dontesta.это

  2. Настройка CFG Pax Web

    javax.servlet.context.tempdir = /Users/amusarra/Progetti/Karaf/runtime/apache-karaf-4.0.8/data/pax-web-jsp орг .ops4j.pax.web.config.file = /Users/amusarra/Progetti/Karaf/runtime/apache-karaf-4.0.8/etc/jetty.xml org.osgi.service.http.port = 8181

    org.osgi.service.http.secure.enabled = true org.ops4j.pax.web.ssl.keystore = $ {karaf.etc} /keystore/dontesta-karaf-server.jks org.ops4j.pax. web.ssl.password = changeit org.ops4j.pax.web.ssl.k eypassword = changeit

Для получения дополнительной информации вы можете увидеть на https://www.dontesta.it/blog/2017/03/02/come-abilitare-https-apache-karaf-pax-web/