Jetty:如何保护 web.xml 中的 websocket 连接?
Jetty: how to secure websocket connection in web.xml?
我按照 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 的。
它是如何不起作用的:
- 我的 IDE (IDEA) 将
<security-constraint>
内的所有标签显示为红色,这意味着模式验证失败,这些标签不能包含在 <security-constraint>
- 当我尝试通过 HTTPS 打开 index.html 时,我在浏览器中收到错误
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?
您描述的安全约束标记主要用于在应用服务器中指定 BASIC 身份验证模式。
我猜您想启用 HTTPS 而不是身份验证。要启用 HTTPS,您可以阅读这篇文章:https://wiki.eclipse.org/Jetty/Howto/Configure_SSL
我按照 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 的。
它是如何不起作用的:
- 我的 IDE (IDEA) 将
<security-constraint>
内的所有标签显示为红色,这意味着模式验证失败,这些标签不能包含在<security-constraint>
- 当我尝试通过 HTTPS 打开 index.html 时,我在浏览器中收到错误
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?
您描述的安全约束标记主要用于在应用服务器中指定 BASIC 身份验证模式。
我猜您想启用 HTTPS 而不是身份验证。要启用 HTTPS,您可以阅读这篇文章:https://wiki.eclipse.org/Jetty/Howto/Configure_SSL