首页 > 解决方案 > 带有 https 的码头服务器

问题描述

我正在尝试让“嵌入式”码头与 https 一起工作。

爪哇信息:

/opt/ducc/test/java/jdk-11.0.3+7/bin/java -version

openjdk 版本“11.0.3” 2019-04-16

码头信息:

ls

码头分布-9.4.6.v20170531

密钥库信息:

[duck@ducc-master-1 资源]$ keytool -list -keystore keystore 输入密钥库密码:

密钥库类型:jks 密钥库提供者:IBMJCE

您的密钥库包含 3 个条目

根,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA1):66:7C:48:44:D0:B6:0B:EF:1A:F7:ED:D5:2D:C3:55:76:B0:1A :02:73 中级,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA1):F0:46:B4:00:B8:52:24:6E:A2:94:6B:17:CE:83:23:49 :54:9A:3A:49 ducc-master-1.sl.cloud9.ibm.com,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA1):D9:0C:9D:A8:A5:C9:81:E9 :04:AF:55:63:73:9B:E4:8D:3C:FF:12:C2

码头服务器代码:

public static void main(String[] args) {
    try {
        Server server = new Server();

        server.setHandler(new HelloWorld());

        int portHttps = 57081;
        String pw = "xxxxxxxx";

        SslContextFactory sslContextFactory = new SslContextFactory();

        String keystore = "/opt/ducc/test/resource/keystore";

        HttpConfiguration http_config = new HttpConfiguration();
        http_config.setSecureScheme("https");
        http_config.setSecurePort(portHttps);

        HttpConfiguration https_config = new HttpConfiguration(http_config);
        https_config.addCustomizer(new SecureRequestCustomizer());

        ServerConnector https = new ServerConnector(server,
             new SslConnectionFactory(sslContextFactory,"http/1.1"),
             new HttpConnectionFactory(https_config));

        https.setPort(portHttps);
        sslContextFactory.setKeyStorePath(keystore);

        sslContextFactory.setKeyStorePassword(pw);    
        sslContextFactory.setKeyManagerPassword(pw);

        server.setConnectors(new Connector[] { https });
        server.addConnector(https);

        server.start();
        server.join();
    } 
    catch(Exception e) {
        e.printStackTrace();
    }
}

Jetty 日志文件片段,显示错误:

jetty.io.ManagedSelector$SelectorProducer@a52dbf0e/PRODUCING/1/1->IDLE/0/1 EPC!org.eclipse.jetty.io.ManagedSelector$$Lambda$83/0000000088041510@389822c0 2019-07-23 07:04:18.361:DBUG:oejut.QueuedThreadPool:qtp1008531893-28: 队列 EatWhatYouKill@f9f67448/org.eclipse.jetty.io .ManagedSelector$SelectorProducer@a52dbf0e/PRODUCING/0/1 2019-07-23 07:04:18.361:DBUG:oejuts.EatWhatYouKill:qtp1008531893-32: EatWhatYouKill@f9f67448/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@a52dbf0e /PRODUCING/0/1 产生非阻塞 2019-07-23 07:04:18.361:DBUG:oejut.InvocableInvocableExecutor:qtp1008531893-28: org.eclipse.jetty.util.thread.Invocable$InvocableExecutor@9918488e 调用 org.eclipse .jetty.io.ManagedSelector$$Lambda$83/0000000088041510@389822c0 2019-07-23 07:04:18.361:DBUG:oeji.ManagedSelector:qtp1008531893-32:

请建议我可能做错了什么。考虑我是证书+安全方面的新手。

=====

切换到使用 OpenJdk keytool 创建密钥库。

[ducc@ducc-master-1 test]$ /opt/ducc/test/java/jdk-11.0.3+7/bin/keytool -list -keystore resource/keystore 输入密钥库密码:密钥库类型:PKCS12 密钥库提供者:SUN

您的密钥库包含 3 个条目

ducc-master-1,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA-256):6C:C5:9F:CD:E6:DD:79:BE:46:72:7A:08:7E:73:0F :4F:01:C3:EA:9E:6D:37:62:99:32:0B:1B:EE:FC:A5:84:72 root,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA-256) : EC:8B:BD:C4:2A:9C:FD:AF:7D:02:94:11:50:16:C2:A8:2B:F7:3E:6B:4C:24:46:0E:75 :EC:A9:FA:A6:A2:42:EB 中间,2019 年 7 月 23 日,trustedCertEntry,证书指纹 (SHA-256):F0:4E:33:1A:B5:4C:8D:F0:ED:E7 :AB:1B:67:0B:ED:BB:D1:3C:6F:52:4B:D9:B4:09:F6:CA:03:AC:35:81:04:C8

没提升。

2019-07-23 08:37:18.146:DBUG:oeji.ManagedSelector:qtp-1083415165-41: 已销毁 SocketChannelEndPoint@79c59b3e{/9.74.14.171:43406<->/9.59.193.91:57081,CLOSED,fill=-, flush=-,to=1/30000}{io=0/0,kio=-1,kro=-1}->SslConnection@a175c2a2{NOT_HANDSHAKING,eio=-1/-1,di=-1}=> HttpConnection@634a6259[p=HttpParser{s=START,0 of 0},g=HttpGenerator@2d97796{s=START}]=>HttpChannelOverHttp@a0ea7c17{r=0,c=false,a=IDLE,uri=null} 2019-07-23 08:37:18.145:DBUG:oejs.HttpConnection:qtp-1083415165-32:javax.net.ssl.SSLHandshakeException:java.base/sun.security.ssl.Alert.createSSLException 没有共同的密码套件(Alert.java:131) 在 java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)。 ..

标签: sslssl-certificatejetty

解决方案


基于IBMJCE密钥库是您需要解决的第一个问题。

由于您使用的是 OpenJDK 11.0.3 JVM(不是 IBM JVM),因此您需要各种 IBM JCE 提供程序 jar,然后配置标准 java 安全提供程序以使用它们。

过去的答案:https ://stackoverflow.com/a/18093554/775715

另请注意,它SslContextFactory.setProvider(String providerName)存在,并且是 Jetty 特定于 HTTPS 和 HTTP2 连接器使用的 SslContextFactory 的。

您可能认为改用 IBM JVM 会更容易,但请注意,您需要进行更多的配置工作才能使其正常工作,因为 IBM JVM 不使用协议和密码套件的 RFC 标准名称。

见:https ://github.com/eclipse/jetty.project/issues/2921

老实说,您可以为自己做的最好的事情是将这些密钥迁移到基于 PKCS12(首选)或 JKS(开箱即用支持)的新密钥库。


推荐阅读