从 9.4.41.v20210516 升级到 11.0.6 后无法启动码头服务器

Unable to start jetty server after upgrade to 11.0.6 from 9.4.41.v20210516

我 运行 我的应用程序使用 9.4.41.v20210516 版本的 Jetty 服务器,运行良好。 我最近将码头版本升级到 11.0.6。以下是我的jetty.xml文件配置

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <Call name="addBean">
        <Arg>
            <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/>
        </Arg>
    </Call>

    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
        <Set name="sendServerVersion"><Property name="jetty.send.server.version" default="false" /></Set>
        <Set name="sendDateHeader"><Property name="jetty.send.date.header" default="false" /></Set>
    </New>

    <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
        <Set name="KeyStorePath"><SystemProperty name="mcruncher.app.dataDir" default="." />\<Property name="jetty.keystore" default="temp\keystore.jks"/></Set>
        <Set name="KeyStorePassword">
            <Property name="jetty.keystore.password" default=""/>
        </Set>
        <Set name="EndpointIdentificationAlgorithm"></Set>

        <Set name="IncludeProtocols">
            <Array type="String">
                <Item>TLSv1.2</Item>
            </Array>
        </Set>

        <Set name="IncludeCipherSuites">
            <Array type="String">
                <Item>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384</Item>
                <Item>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Item>
            </Array>
        </Set>

        <New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
            <Arg><Ref refid="httpConfig"/></Arg>
            <Call name="addCustomizer">
                <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
            </Call>
        </New>
    </New>

    <Call id="sslConnector" 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">
                                <Arg name="config"><Ref refid="tlsHttpConfig"/></Arg>
                            </New>
                        </Item>
                    </Array>
                </Arg>
                <Set name="port"><Property name="jetty.port" default="9090" /></Set>
                <Set name="idleTimeout"><Property name="jetty.idleTimeout" default="30000"/></Set>
                <Set name="soLingerTime"><Property name="jetty.soLingerTime" default="-1"/></Set>
            </New>
        </Arg>
    </Call>

</Configure> 

升级版本后jetty服务器没有启动,出现如下异常

            <Property name="jetty.keystore.password" default=""/>
        </Set><Set name="EndpointIdentificationAlgorithm"/><Set name="IncludeProtocols">
            <Array type="String"><Item>TLSv1.2</Item></Array>
        </Set><Set name="IncludeCipherSuites">
            <Array type="String"><Item>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384</Item><Item>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Item></Array>
        </Set><New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration"><Arg><Ref refid="httpConfig"/></Arg><Call name="addCustomizer"><Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg></Call></New></New> on Server@30506c0d{STOPPED}[11.0.6,sto=0]
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:1001)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:470)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:380)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:303) 

有人可以帮我解决这个问题吗?

jetty 用来启动自身的 XML 发生了很多变化。

与您一起查看 jetty-home tarball 自己的 XML 文件中发现的其他更改可能是个好主意。

我注意到的一件事是,您仍在 XML 中使用旧的通用 SslContextFactory(强烈建议不要这样做,因为它不区分服务器模式与客户端模式)。

这就是您正在使用的...

<New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">

在 Jetty 9.x 中使用 class 将导致警告甚至错误(取决于您的密钥库中的内容)

在 Jetty 9.x 中,您应该使用特定于服务器或客户端的版本。

示例:来自 9.4.43 ${jetty.home}/etc/jetty-ssl-context.xml

<Configure id="sslContextFactory"
    class="org.eclipse.jetty.util.ssl.SslContextFactory$Server">

ClientServer 特定实现的这种使用在 Jetty 9.x 中是可选的,以允许代码迁移。

在 Jetty 10.x 中,泛型 class (SslContextFactory) 现在是抽象的,它本应如此。

你现在只需要使用具体的实现。

示例:从 11.0.6 ${jetty.home}/etc/jetty-ssl-context.xml

<New id="sslContextFactory"
    class="org.eclipse.jetty.util.ssl.SslContextFactory$Server">

另请注意,Jetty 9.4.x 中的默认密钥库 format/type 是 JKS,但从 Jetty 10.0.x 开始,现在是 PKCS12 .