带有 https 的嵌入式 Jetty:无效的密钥库格式

Embedded Jetty with https : Invalid keystore format

我正在尝试让我的嵌入式 Jetty 8.1.4(不,我可以更高!)服务器与 https 一起工作。我使用以下命令生成我的密钥库:

keytool -genkey -alias sitename -keyalg RSA -keystore keystore -keysize 2048

我的问题是,当我 运行 这个时,我得到了一个很好的异常!

WARN - AbstractLifeCycle - FAILED SslContextFactory@160b6dff(null,null): java.io.IOException: Invalid keystore format
java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:633)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38)
    at java.security.KeyStore.load(KeyStore.java:1183)

我尝试按照不同的在线指南生成密钥库,但无济于事。

有什么想法吗?

非常感谢,

AW

这是服务器代码:

public static void main(String[] args) throws Exception {

    Server server = new Server();

    server.setStopAtShutdown(true);
    server.setGracefulShutdown(ALLOWED_SHUTDOWN_TIME);

    Resource keystore = Resource.newClassPathResource("/keystore");

    SslContextFactory sslContextFactory = new SslContextFactory();

    sslContextFactory.setKeyStoreResource(keystore);
    sslContextFactory.setKeyStorePassword("wicket");
    sslContextFactory.setTrustStoreResource(keystore);
    sslContextFactory.setKeyManagerPassword("wicket");

    SslSelectChannelConnector connector = new SslSelectChannelConnector(sslContextFactory);

    connector.setMaxIdleTime(30000);
    connector.setPort(getServerPort());
    connector.setAcceptors(4);

    connector.setReuseAddress(false);

    server.addConnector(connector);

    final ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);

    context.setResourceBase("src/main/webapp");
    context.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");

    context.getSessionHandler().getSessionManager().setMaxInactiveInterval(60 * 15);
    context.getSessionHandler().getSessionManager().setSessionTrackingModes(newHashSet(SessionTrackingMode.COOKIE));

    final FilterHolder openSessionInViewFilter = new FilterHolder(new OpenSessionInViewFilter());

    context.addFilter(openSessionInViewFilter, "/", EnumSet.of(DispatcherType.REQUEST));

    final FilterHolder wicketFilter = new FilterHolder(WicketFilter.class);

    wicketFilter.setInitParameter(WicketFilter.FILTER_MAPPING_PARAM, "/*");
    wicketFilter.setInitParameter("applicationFactoryClassName", "org.apache.wicket.spring.SpringWebApplicationFactory");

    wicketFilter.setInitParameter("configuration", "development");

    context.addFilter(wicketFilter, "/*", EnumSet.of(DispatcherType.REQUEST));

    context.getInitParams().put("contextConfigLocation", "classpath:spring/spring-config.xml");

    context.addEventListener(new ContextLoaderListener());

    try {
        server.start();
        server.join();

    } catch (Exception exception) {

        exception.printStackTrace();
        System.exit(100);
    }
}

当谈到 SSL 和网络时,您 必须在 JVM 和服务器软件中保持最新。浏览器、代理、硬件等中 SSL 支持的快速变化。迫使你。

例如,Jetty 8.1.4 是在 SSL v1、SSL v2 流行的时代创建的。今天,SSL 几乎已被弃用(一直到 SSL v3),取而代之的是 TLS NPN/ALPN 越来越受欢迎。

较新版本的 Jetty 甚至弃用了导致在线问题的各种密码套件。

甚至证书颁发机构 (CA) 也在朝着使旧 SSL 变得无关紧要的方向发展,这使得几乎不可能获得适用于这些旧环境的证书。