带有https的码头服务器



我正在尝试让"嵌入式"Jetty使用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

密钥库信息:

[ducc@ducc-master-1 resource]$ keytool -list -keystore keystore Enter 密钥库密码:

密钥库类型:jks 密钥库提供程序:IBMJCE

您的密钥库包含 3 个条目

root,2019 年 7 月 23 日,受信任的证书条目,证书指纹 (SHA1): 66:7C:48:44:D0:B6:0B:EF:1A:F7:ED:D5:2D:C3:55:76:B0:1A:02:73 中级, 2019年7月23日, 可信证书条目, 证书指纹 (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 日,信任CertEntry, 证书指纹 (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();
}
}

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

2019-07-23 07:04:18.357:DBUG:oejis.Ssl连接:qtp1008531893-35: 填充 b[0]= SslConnection@98e9b6f4{NEED_TASK,eio=0/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null}<-SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,OPEN,fill=-,flush=-,to=2/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NEED_TASK,eio=0/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.357:DBUG:oejus.SslContextFactory:qtp1008531893-35: 类型=host_name (0) 的 SNI 匹配, 值=DUCC-主-1.sl.cloud9.ibm.com 2019-07-23 07:04:18.357:DBUG:oejus.SslContextFactory:qtp1008531893-35: SNI 匹配 ducc-master-1.sl.cloud9.ibm.com->空 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/EC 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/EC 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSA 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSASSA-PSS 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSA 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSA 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSASSA-PSS 2019-07-23 07:04:18.360:DBUG:oejus.SniX509扩展密钥管理器:qtp1008531893-35: 在sun.security.ssl.SSLEngineImpl@58859874上选择了别名空/RSA 2019-07-23 07:04:18.360:DBUG:oejis.Ssl连接:qtp1008531893-35: shutdownOutput: oshut=false, ishut=true SslConnection@98e9b6f4{NEED_WRAP,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 of 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null}<-SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,OPEN,fill=-,flush=-,to=5/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NEED_WRAP,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 of 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.360:DBUG:oejis.Ssl连接:qtp1008531893-35: 同花顺 b[0]= SslConnection@98e9b6f4{NEED_WRAP,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 of 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null}<-SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,OPEN,fill=-,flush=-,to=5/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NEED_WRAP,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 of 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.361:DBUG:oejis.Ssl连接:qtp1008531893-35: 包装状态 = 已关闭 握手状态 = NOT_HANDSHAKING 字节已消耗 = 0 字节生成 = 7 序列号 = 0 SslConnection@98e9b6f4{NOT_HANDSHAKING,eio=-1/7,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null}<-SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,OPEN,fill=-,flush=-,to=6/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NOT_HANDSHAKING,eio=-1/7,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.361:DBUG:oeji.通道端点:qtp1008531893-35: 冲洗 7 SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,OPEN,fill=-,flush=-,to=6/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NOT_HANDSHAKING,eio=-1/0,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.361:DBUG:oeji.通道端点:qtp1008531893-35: 多关闭 SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,已关闭,填充=-,刷新=-,to=0/30000}{io=0/0,kio=0,kro=1}->SslConnection@98e9b6f4{NOT_HANDSHAKING,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.361:DBUG:oeji.写入冲洗器:qtp1008531893-35: ignore : WriteFlusher@95ef7348{IDLE}->null java.nio.channels.ClosedChannelException 2019-07-23 07:04:18.361:DBUG:oeji.填充兴趣:qtp1008531893-35: FillInterest@f9b047db{假,空} 上关闭空 2019-07-23 07:04:18.361:DBUG:oeji.托管选择器:qtp1008531893-35:排队更改 org.eclipse.jetty.io.ManagedSelector$$Lambda$83/0000000088041510@389822c0 在 org.eclipse.jetty.io.ManagedSelector@4e9e4706 id=3 键=1 已选择=0 2019-07-23 07:04:18.361:DBUG:oeji.写入刷新器:qtp1008531893-35:忽略: WriteFlusher@7a814014{IDLE}->null javax.net.ssl.SSLHandshakeException: 没有共同的密码套件 2019-07-23 07:04:18.361:DBUG:oeji.托管选择器:qtp1008531893-28:选择器循环 从选择中醒来,0/0 选择 2019-07-23 07:04:18.361:DBUG:oejuts.吃什么你杀:qtp1008531893-28: EatWhatYouKill@f9f67448/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@a52dbf0e/PRODUCING/1/1->IDLE/0/1 咔嚓! 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.吃什么你杀: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.托管选择器:qtp1008531893-32: 选择器循环等待选择 2019-07-23 07:04:18.361:DBUG:oejut.队列线程池:qtp1008531893-40:运行 EatWhatYouKill@f9f67448/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@a52dbf0e/PRODUCING/0/1 2019-07-23 07:04:18.361:DBUG:oejs.HttpConnection:qtp1008531893-35: 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) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264) 在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255) 在 java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.chooseCipherSuite(ServerHello.java:461) 在 java.base/sun.security.ssl.ServerHello$T12ServerHelloProducer.produce(ServerHello.java:294) 在 java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436) 在 java.base/sun.security.ssl.ClientHello$T12ClientHelloConsumer.consumption(ClientHello.java:1101) 在 java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:851) 在 java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consumption(ClientHello.java:810) 在 java.base/sun.security.ssl.SSLHandshake.consumption(SSLHandshake.java:392) 在 java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:448) 在 java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1065) 在 java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1052) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:739) 在 java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:999) 在 org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:747) 在org.eclipse.jetty.server.HttpConnection.fillRequestBuffer(HttpConnection.java:322) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:231) 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110) 在 org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289) 在 org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:149) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110) 在 org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) 在 org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128) 在 org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591) at java.base/java.lang.Thread.run(Thread.java:825) 2019-07-23 07:04:18.361:DBUG:oeji.托管选择器:qtp1008531893-28:已销毁 SocketChannelEndPoint@d118e56a{/9.74.14.171:41120<->/9.59.193.91:57081,已关闭,填充=-,刷新=-,to=0/30000}{io=0/0,kio=-1,kro=-1}->SslConnection@98e9b6f4{NOT_HANDSHAKING,eio=-1/-1,di=-1}=>HttpConnection@1fae4192[p=HttpParser{s=START,0 之 0},g=HttpGenerator@10260d78{s=START}]=>HttpChannelOverHttp@3a5da0e8{r=0,c=false,a=IDLE,uri=null} 2019-07-23 07:04:18.361:DBUG:oejuts.吃什么你杀:qtp1008531893-40: EatWhatYouKill@f9f67448/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@a52dbf0e/PRODUCING/0/1 跑

请建议我可能做错了什么。 将我视为证书+安全性方面的新手。

=====

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

[ducc@ducc-主-1 测试]$/opt/ducc/test/java/jdk-11.0.3+7/bin/keytool -list -keystore 资源/密钥库 输入密钥库密码: 密钥库类型: PKCS12 密钥库提供商:孙

您的密钥库包含 3 个条目

ducc-master-1, Jul 23, 2019, 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日, 可信证书条目, 证书指纹 (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日, 可信证书条目, 证书指纹 (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.托管选择器:qtp-1083415165-41: 摧毁 SocketChannelEndPoint@79c59b3e{/9.74.14.171:43406<->/9.59.193.91:57081,已关闭,填充=-,刷新=-,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 之 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) ...

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

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

过去对此的回答:https://stackoverflow.com/a/18093554/775715

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

您可能认为改用 IBM JVM 会更容易,但请注意,由于 IBM JVM 不使用协议和密码套件的 RFC 标准名称,因此您将有更多的工作来配置内容以使其正常工作。

请参阅:https://github.com/eclipse/jetty.project/issues/2921

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

相关内容

最新更新