ssl - 带有 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)。 ..
解决方案
基于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(开箱即用支持)的新密钥库。
推荐阅读
- flutter - 如何设置小吃店的标签颜色?
- apache-spark - 为什么 Spark 不使用 collect_list 将过滤器推到 groupBy 之前?
- reactjs - flushSync 有什么反应?
- security - 密码哈希中的漏洞
- spring-boot - 找不到存储库 Spring R2DBC
- java - 以秒为单位将日期和时间转换为单个字符串时间戳
- python - 如何将 .loc 与 groupby 一起使用,以便基于分组数据创建新列不会被视为副本?
- mysql - mysql:如何添加?"column1" + "column2" 其中 id_parent 相等
- reactjs - React Native Flatlist 在上下文更改后不更新
- javascript - 带有被推入对象的数组结果仍然是空的