Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无JKS的嵌入式码头上的TLS_Java_Ssl_Jetty_X509certificate_Embedded Jetty - Fatal编程技术网

Java 无JKS的嵌入式码头上的TLS

Java 无JKS的嵌入式码头上的TLS,java,ssl,jetty,x509certificate,embedded-jetty,Java,Ssl,Jetty,X509certificate,Embedded Jetty,我的目标:我正在开发Jetty Embedded的集成,这将使其易于使用。除其他外,允许集成TLS证书的外部源,而无需使用Java密钥库 这将允许在构建分布式web服务时具有更大的灵活性(在我的例子中是一个) 但是,我在构建集成时遇到了问题。存根实现是 我尝试的内容:我尝试替换和,并为其中的每个函数设置断点。但是,当尝试访问服务器时,这些断点永远不会触发。相反,我遇到了以下错误: javax.net.ssl.SSLHandshakeException: no cipher suites in c

我的目标:我正在开发Jetty Embedded的集成,这将使其易于使用。除其他外,允许集成TLS证书的外部源,而无需使用Java密钥库

这将允许在构建分布式web服务时具有更大的灵活性(在我的例子中是一个)

但是,我在构建集成时遇到了问题。存根实现是

我尝试的内容:我尝试替换和,并为其中的每个函数设置断点。但是,当尝试访问服务器时,这些断点永远不会触发。相反,我遇到了以下错误:

javax.net.ssl.SSLHandshakeException: no cipher suites in common
    at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478)
    at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:813)
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
    at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:621)
    at org.eclipse.jetty.server.HttpConnection.fillRequestBuffer(HttpConnection.java:322)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:231)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112)
    at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:261)
    at org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:150)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
    at java.lang.Thread.run(Thread.java:748)
我曾尝试分析“标准”Jetty设置,该设置从密钥库中获取证书,但运气不佳。我找不到Jetty获取我应该覆盖的密码/证书信息的位置


我的问题:如何让Jetty代替Java密钥库和信任库使用?

@EJP为我指明了正确的方向,下面是如何做到的:

下面是需要如何做的

首先,为TLS设置码头:

HttpConfiguration https = new HttpConfiguration();
https.addCustomizer(new SecureRequestCustomizer());
SslContextFactory sslContextFactory = new JettySslContextFactory(configuration.getSslProviders());
ServerConnector sslConnector = new ServerConnector(
    server,
    new SslConnectionFactory(sslContextFactory, "http/1.1"),
    new HttpConnectionFactory(https)
);
sslConnector.setPort(httpsPort);
请注意JettySslContextFactory类。此类扩展了内置的X509ExtendedKeyManager,需要重写
受保护的KeyManager[]GetKeyManager(KeyStore KeyStore)抛出异常
方法,以便提供自定义KeyManager,如下所示:

@Override
protected KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception {
    return new KeyManager[] {
        new JettyX509ExtendedKeyManager(certificateProviders)
    };
}
除此之外,还将在每个连接中运行以下步骤:

  • 向SNI匹配者咨询SNI主机名。这似乎是唯一一个SNI主机名可用的地方
  • 咨询密钥管理器以获取特定密钥类型(EC或RSA)的别名(密钥ID的排序)。这里我们需要从SNI匹配器中获取主机名,因为否则我们就不知道要匹配哪个主机名
  • 根据别名(密钥ID),我们可以返回私钥和证书

  • 至少这是我从调试这个问题中得到的信息。完整代码。

    此异常通常意味着服务器找不到私钥和匹配的证书。显然,您的
    KeyManager
    安装不正确,否则在此之前会调用它。谢谢您,我将尝试跟踪“库存”版本与我自己的版本中如何安装密钥管理器。