Jetty Webservice - 不支持基于 https 协议的地址
Jetty Webservice - https protocol based address is not supported
我正在使用 jetty 7.5.1 版。
我的 Web 服务在“http://...”端点上运行良好,但是当我将其更改为“https://...”时,一切正常错了。
Endpoint e = Endpoint.create(webservice);
e.publish("https://localhost:" + serverPort + "/ws/mywebservice);
我收到以下错误消息:
“不支持基于 https 协议的地址”。
我试过使用 SslChannelConnector
、SelectChannelConnector
以及两者的组合。
Connector connector = new SelectChannelConnector();
connector.setPort(59180);
SslContextFactory factory = new SslContextFactory();
factory.setKeyStore("keystore");
factory.setKeyStorePassword("password");
factory.setKeyManagerPassword("password");
factory.setTrustStore("keystore");
factory.setTrustStorePassword("password");
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(factory);
sslConnector.setPort(443);
sslConnector.setMaxIdleTime(30000);
server.setConnectors(new Connector[]{connector, sslConnector});
我也试过修改发布路径中的端口。但是没有成功。
会不会是我创建的密钥库文件出了问题?
即使我输入了错误的密码,它也会显示不同的错误消息,说明我的密码错误。
我的选择是 运行。有什么想法吗?
编辑:更多信息:
Servlet 现在可以很好地使用 HTTPS。但是 web 服务不是。我可能发布它的方式不对吗?
我在各种论坛上发现了几个有类似问题的帖子。但是一直没有找到解决办法。我想为未来的受害者写下我的解决方案:
publish
方法只接受http协议。即使您发布的是 https,也应该是 "http://..."
。另一方面,您应该使用 SSL 连接器的端口。
Endpoint e = Endpoint.create(webservice);
e.publish("http://localhost:443/ws/mywebservice);
使用任何其他协议,您将始终得到 "xxx protocol based address is not supported" 异常。 See source code.
注意 1: 此时网络服务已经可以正常工作了。但是有一个讨论点:生成的 wsdl 文件(位于 https://localhost:443/ws/mywebservice?wsdl
)将引用 http://...
路径。您可能会争论 wsdl 文件是必需的还是只是文档。
更正 WSDL 文件中的主机名并不难,但替换协议更难。最简单的解决方案可能是只需编辑 wsdl 文件并托管文件,当然这不是很好"dynamic"。
或者,我通过创建一个替换地址的 WsdlServlet 解决了这个问题。另一方面,为了固定一个字符而创建整个 class 确实感觉很糟糕。 :)
注 2: 此 Jetty 版本中的另一个错误是身份验证。没有任何身份验证就不可能提供网络服务。在关闭所有可能的身份验证后,您可以获得最好的结果:您仍然需要使用 'preemptive authentication' 并输入随机用户名和密码。
我正在使用 jetty 7.5.1 版。
我的 Web 服务在“http://...”端点上运行良好,但是当我将其更改为“https://...”时,一切正常错了。
Endpoint e = Endpoint.create(webservice);
e.publish("https://localhost:" + serverPort + "/ws/mywebservice);
我收到以下错误消息: “不支持基于 https 协议的地址”。
我试过使用 SslChannelConnector
、SelectChannelConnector
以及两者的组合。
Connector connector = new SelectChannelConnector();
connector.setPort(59180);
SslContextFactory factory = new SslContextFactory();
factory.setKeyStore("keystore");
factory.setKeyStorePassword("password");
factory.setKeyManagerPassword("password");
factory.setTrustStore("keystore");
factory.setTrustStorePassword("password");
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(factory);
sslConnector.setPort(443);
sslConnector.setMaxIdleTime(30000);
server.setConnectors(new Connector[]{connector, sslConnector});
我也试过修改发布路径中的端口。但是没有成功。
会不会是我创建的密钥库文件出了问题? 即使我输入了错误的密码,它也会显示不同的错误消息,说明我的密码错误。
我的选择是 运行。有什么想法吗?
编辑:更多信息:
Servlet 现在可以很好地使用 HTTPS。但是 web 服务不是。我可能发布它的方式不对吗?
我在各种论坛上发现了几个有类似问题的帖子。但是一直没有找到解决办法。我想为未来的受害者写下我的解决方案:
publish
方法只接受http协议。即使您发布的是 https,也应该是 "http://..."
。另一方面,您应该使用 SSL 连接器的端口。
Endpoint e = Endpoint.create(webservice);
e.publish("http://localhost:443/ws/mywebservice);
使用任何其他协议,您将始终得到 "xxx protocol based address is not supported" 异常。 See source code.
注意 1: 此时网络服务已经可以正常工作了。但是有一个讨论点:生成的 wsdl 文件(位于 https://localhost:443/ws/mywebservice?wsdl
)将引用 http://...
路径。您可能会争论 wsdl 文件是必需的还是只是文档。
更正 WSDL 文件中的主机名并不难,但替换协议更难。最简单的解决方案可能是只需编辑 wsdl 文件并托管文件,当然这不是很好"dynamic"。
或者,我通过创建一个替换地址的 WsdlServlet 解决了这个问题。另一方面,为了固定一个字符而创建整个 class 确实感觉很糟糕。 :)
注 2: 此 Jetty 版本中的另一个错误是身份验证。没有任何身份验证就不可能提供网络服务。在关闭所有可能的身份验证后,您可以获得最好的结果:您仍然需要使用 'preemptive authentication' 并输入随机用户名和密码。