Jetty Webservice - 不支持基于https协议的地址

时间:2015-02-10 17:27:20

标签: web-services ssl jetty

我正在使用jetty版本7.5.1。

我的网络服务可以正常使用“http:// ...”端点,但当我将其更改为“http s :// ...”时,事情就出错了。

Endpoint e = Endpoint.create(webservice);
e.publish("https://localhost:" +  serverPort + "/ws/mywebservice);

我收到以下错误消息: “不支持基于https协议的地址”。

我尝试使用SslChannelConnectorSelectChannelConnector以及两者的组合。

  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。但是 webservices不是。我可能以错误的方式发布它吗?

1 个答案:

答案 0 :(得分:1)

我在各种论坛上发现了几个类似问题的线程。但从未找到解决方案。我想为未来的受害者写下我的解决方案:

publish方法仅接受http协议。即使您要发布https,这仍应为"http://..."。另一方面,您应使用SSL连接器的端口

Endpoint e = Endpoint.create(webservice);
e.publish("http://localhost:443/ws/mywebservice);

使用任何其他协议,您将始终获得"基于xxx协议的地址不受支持" 例外。 See source code.

注1:此时此网络服务已正常运行。但是有一点需要讨论:生成的wsdl文件(https://localhost:443/ws/mywebservice?wsdl)将引用http://...路径。你可以争论wsdl文件是一个要求还是仅仅是文档。

更正WSDL文件中的主机名并不难,但更换协议更难。最简单的解决方案可能是只需编辑wsdl文件并托管文件,这不是很好的动态"当然。

或者,我通过创建一个替换地址的WsdlServlet 来解决它。另一方面,为了修复1个字符而创建整个类确实感觉不好。 :)

注2:此Jetty版本中的另一个错误是身份验证。没有任何身份验证就无法提供Web服务。在关闭所有可能的身份验证后,您可以获得最好的结果:您仍然必须使用“抢先身份验证”#39;并输入随机用户名和密码。