我跟着this article并创建了最简单的websocket echo应用程序。虽然文章是关于Glassfish的,但我在Jetty 9下成功运行了我的应用程序,因为他们在文章中使用标准的javax.websocket API。
它工作正常,但现在我想保护websocket连接。我搜索了一下,发现大多数示例都是作为独立的Java应用程序编写的(使用public static void main()
方法)。他们创建新的ConnectionFactory
并从代码中启动服务器(例如here)。
但是我想在Jetty下运行我的应用程序作为容器,所以我想在web.xml或其他东西中指定一些选项来保护我的连接。所以我找到了this文章并修改了我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected resource</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<!-- https -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>
问题是它不起作用。可能是因为文章又是关于Glassfish的。
它是如何工作的:
<security-constraint>
中显示红色的所有标记,这意味着架构验证失败,这些标记无法包含在<security-constraint>
ssl_error_rx_record_too_long
,并且Jetty输出中也有两个错误: Illegal character 0x16 in state=START for buffer HeapByteBuffer
和
badMessage: 400 Illegal character 0x16 for HttpChannelOverHttp
那么......我做错了什么?如何通过Jetty或应用程序配置制作安全的websocket?
答案 0 :(得分:1)
您描述的安全约束标记主要用于在应用程序服务器中指定BASIC身份验证模式。
我想您要启用HTTPS而不是身份验证。要启用HTTPS,您可以按照以下文章进行操作:https://wiki.eclipse.org/Jetty/Howto/Configure_SSL