Jetty: с двумя или более IP-адресами, как добавить еще один SSL-коннектор?

Использование Jetty 9.4 в Windows

Для http, всякий раз, когда у меня есть другой IP-адрес, я просто копирую файл jetty-http.xml в папку etc и редактирую файл, чтобы иметь другой коннектор со всем остальным, кроме IP-адреса, как показано ниже (в этом случае мои IP-адреса 1.2. 3.4 и 1.2.3.5)

<Call name="addConnector">
<Arg>
  <New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
    <Arg name="server"><Ref refid="Server" /></Arg>
    <Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" deprecated="http.acceptors" default="-1"/></Arg>
    <Arg name="selectors" type="int"><Property name="jetty.http.selectors" deprecated="http.selectors" default="-1"/></Arg>
    <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
        <Item>
          <New class="org.eclipse.jetty.server.HttpConnectionFactory">
            <Arg name="config"><Ref refid="httpConfig" /></Arg>
            <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg>
          </New>
        </Item>
      </Array>
    </Arg>
    <Set name="host">1.2.3.4</Set>
    <Set name="port">80</Set>
    <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" deprecated="http.timeout" default="30000"/></Set>
    <Set name="soLingerTime"><Property name="jetty.http.soLingerTime" deprecated="http.soLingerTime" default="-1"/></Set>
    <Set name="acceptorPriorityDelta"><Property name="jetty.http.acceptorPriorityDelta" deprecated="http.acceptorPriorityDelta" default="0"/></Set>
    <Set name="acceptQueueSize"><Property name="jetty.http.acceptQueueSize" deprecated="http.acceptQueueSize" default="0"/></Set>
  </New>
</Arg>

<Call name="addConnector">
<Arg>
  <New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
    <Arg name="server"><Ref refid="Server" /></Arg>
    <Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" deprecated="http.acceptors" default="-1"/></Arg>
    <Arg name="selectors" type="int"><Property name="jetty.http.selectors" deprecated="http.selectors" default="-1"/></Arg>
    <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
        <Item>
          <New class="org.eclipse.jetty.server.HttpConnectionFactory">
            <Arg name="config"><Ref refid="httpConfig" /></Arg>
            <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg>
          </New>
        </Item>
      </Array>
    </Arg>
    <Set name="host">1.2.3.5</Set>
    <Set name="port">80</Set>
    <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" deprecated="http.timeout" default="30000"/></Set>
    <Set name="soLingerTime"><Property name="jetty.http.soLingerTime" deprecated="http.soLingerTime" default="-1"/></Set>
    <Set name="acceptorPriorityDelta"><Property name="jetty.http.acceptorPriorityDelta" deprecated="http.acceptorPriorityDelta" default="0"/></Set>
    <Set name="acceptQueueSize"><Property name="jetty.http.acceptQueueSize" deprecated="http.acceptQueueSize" default="0"/></Set>
  </New>
</Arg>

Однако для https. Когда я делаю то же самое для файла ssl-jetty.xml, как показано ниже

  <Call  name="addConnector">
<Arg>
  <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
    <Arg name="server"><Ref refid="Server" /></Arg>
    <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
    <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
    <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
        <!-- uncomment to support proxy protocol
        <Item>
          <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
        </Item>-->
      </Array>
    </Arg>

    <Set name="host">1.2.3.4</Set>
    <Set name="port">443</Set>
    <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
    <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
    <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
    <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
  </New>
</Arg>

<Call  name="addConnector">
<Arg>
  <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
    <Arg name="server"><Ref refid="Server" /></Arg>
    <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
    <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
    <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
        <!-- uncomment to support proxy protocol
        <Item>
          <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
        </Item>-->
      </Array>
    </Arg>

    <Set name="host">1.2.3.5</Set>
    <Set name="port">443</Set>
    <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
    <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
    <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
    <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
  </New>
</Arg>

получение этого исключения, как показано ниже. Не уверен, что здесь не хватает?

Exception in thread "main" java.lang.IllegalStateException: No protocol factory for default protocol: null
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:258)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:235)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:390)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1516)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1441)

person Tommy Lord    schedule 02.10.2016    source источник


Ответы (1)


Я ни в коем случае не эксперт по Jetty; тем не менее, я недавно боролся с той же проблемой, что и у вас. Я могу предложить то, что я сделал, чтобы устранить проблему с протоколом, но я ожидаю, что это приведет вас только к следующему этапу проблем (хранилище ключей/сертификат). Ваше исключение «Нет фабрики протоколов для протокола по умолчанию: null» указывает, что ваш новый соединитель не ссылается на ContextFactory, который, в свою очередь, должен указывать протокол. Таким образом, не указывая протокол, вы назначаете его нулевым. Хотя я не понимаю, почему исходный соединитель SSL, который вы скопировали, не вызвал такой же проблемы, поскольку он, похоже, не ссылается на идентификатор sslContextFactory.

В конфигурации родительского сервера вы должны увидеть SslContextFactory. Если он есть, скопируйте/вставьте его, уникально изменив его идентификатор и убедитесь, что протокол установлен правильно. Мои классы Jetty уникальны для моего приложения, но вы должны иметь возможность взять то, что у меня есть, с некоторыми незначительными изменениями в соответствии с Eclipse.org для классов Jetty и решить проблему протокола и перейти к следующему.

В конфигурации сервера ваша sslContextFactory должна выглядеть примерно так:

<New id="secondarySSLContextFactory" class="com.myapp.appserver.jetty.server.connector.ssl.RuntimeSslContextFactory">
    <Set name="renegotiationAllowed">true</Set>
    <Set name="needClientAuth">false</Set>
    <Set name="wantClientAuth">false</Set>
    <Set name="protocol">TLS</Set>
    <Set name="secureRandomAlgorithm">SHA1PRNG</Set>
    <Set name="excludeProtocols">
        <Array type="java.lang.String">
            <!-- Excluded to mitigate POODLE attack -->
            <Item>SSLv3</Item>
        </Array>
    </Set>
</New>

Тогда ваш недавно измененный коннектор будет похож на:

<Call  name="addConnector">
<Arg>
  <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
    <Arg name="server"><Ref refid="Server" /></Arg>
    <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
    <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
    <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
        <!-- uncomment to support proxy protocol
        <Item>
          <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
        </Item>-->
        <!-- REFERENCE TO CONTEXT FACTORY ID -->
        <Item>
          <New class="org.eclipse.jetty.server.SslConnectionFactory">
            <Arg name="next">http/1.1</Arg>
            <Arg name="sslContextFactory">
              <Ref refid="secondarySSLContextFactory"/>
            </Arg>
          </New>
        </Item>
      </Array>
    </Arg>

    <Set name="host">1.2.3.5</Set>
    <Set name="port">443</Set>
    <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
    <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
    <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
    <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
  </New>
</Arg>

Кроме того, если вы планируете использовать альтернативный сертификат SSL для альтернативного IP-адреса, вам придется создать новое хранилище ключей. Вышеупомянутая вторичнаяSSLContextFactory — это место, где задаются новый путь к хранилищу ключей и пароль. Есть много ссылок, чтобы помочь с этим. Однако, помимо создания и назначения нового сертификата + цепочки / хранилища ключей, у меня мало полезного опыта, чтобы заставить сервер использовать их, но новый коннектор ответит. Я не нашел ничего, что могло бы помочь в этом в Jetty 9. Надеюсь, то, что я предоставил, немного поможет.

person Radarjr    schedule 01.03.2017