java - ReSTLet HTTP 到 HTTPS(非默认端口)重定向

标签 java http ssl https restlet

假设 SSL 安全应用程序在非默认 HTTPS 端口 9999 上运行。

当用户访问这样的页面时:

https://myapp.com:9999

将返回正确的响应。

但是当他尝试通过不安全的方式访问页面时——就像这样:

http://myapp.com:9999

这是返回的响应(十六进制):

15 03 01 00 02 02 0A

这实际上意味着:

15 alert
03 01 Version
00 02 Length
02 0A Fatal-unexpected message

现在的问题是在这种情况下是否可以使用 ReSTLet 将用户从 HTTP 重定向到 HTTPS?

PS:请注意,使用 Apache 或类似解决方案进行重定向/URI 重写并不是我想要的。

最佳答案

在同一端口上从 HTTP 重定向到 HTTPS 并不容易。通常一个端口专用于每个协议(protocol)。当您在公共(public)网站(使用默认端口)上看到从 http 到 https 的重定向时,第一个请求是 http://example.com (浏览器将通过端口 80 请求,这是 HTTP 的默认端口)并返回一个重定向到 https://example.com 的响应。 (浏览器将通过端口 443 请求,这是 HTTPS 的默认端口)。

当使用像ReSTLet这样的应用服务器时,一个典型的处理这种重定向的方法是在它前面放一个像Apache httpd这样的web服务器,在80端口上监听HTTP,在443端口上监听HTTPS,并代理两者它们连接到端口 9999(您不需要将其暴露给 Internet,因为它只能通过环回访问)。

但是当你连接到 http://myapp.com:9999 ,您的应用程序服务器首先期待 TLS 握手,并且您的浏览器或用户代理不会提供它,因为普通 HTTP 协议(protocol)不需要它。也就是说,您也许可以想出一种方法来检测浏览器正在使用的协议(protocol)并动态响应。有关执行此操作的创造性方法的更详细说明,请参阅此 node.js protocol detection example .如果您真的必须为两个协议(protocol)使用一个端口,则可以在 ReSTLet 中做同样的事情。

关于java - ReSTLet HTTP 到 HTTPS(非默认端口)重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975059/

相关文章:

javascript - NodeJs tls.createServer 等同于 Apache SSLCertificateChainFile?

java - 数组和输入

Java路径..jvm.cfg错误

PHP/ curl : inspecting response headers before downloading body

java - HTTPClient StringEntity PUT 问题

http - 将 JPEG 图像从 HTTP multipart/x-mixed-replace keep-alive 流保存到 ubuntu 服务器

security - 需要有关如何使用加密数据库创建网站的建议

Javascript:如何检查浏览器中是否启用了特定的 TLS 版本?

java - Ant:如果类路径 jar 已更改但源代码未更改,如何强制进行 java 编译

java - PIT工具变异生成格式