java - 如何优雅地检测 SSL

标签 java http ssl

我有一个可以绑定(bind)到 ssl 或纯 http 的网络服务。配置为知道服务器主机和端口的 Java 客户端。当客户端连接时,我构建服务器端点,如 http://host:port/service .客户端不知道服务器是否正在使用 ssl - 服务器总是绑定(bind)到一个端口,因此它是安全的还是不安全的。现在,问题是如何让客户端在不引入另一个参数的情况下发现这一点?我可以挑战纯 http 请求,然后在出现特定异常时回退到 ssl(反之亦然)吗?或者我必须明确地为客户端引入新的连接参数?

最佳答案

在服务器端,你可以使用像Grizzly's port unification这样的机制。执行。这可用于在同一端口上提供 HTTP 和 HTTPS。这依赖于这样一个事实,即在这两种情况下,客户端首先进行对话,然后发送 HTTP 请求或 SSL/TLS 客户端问候消息。这在服务器端非常方便(虽然我不确定我是否会推荐在同一端口上运行两个协议(protocol))。

从客户的角度(这就是您要问的),其后果是:

  • 客户先说话的事实意味着它总是必须先尝试。如果您尝试将 SSL/TLS 与普通 HTTP 服务对话,反之亦然,则可能会出现某种异常。
  • 如果服务器使用端口统一,您将无法可靠地找到答案。

抛开端口统一(毕竟这种情况很少见),您可以尝试缓存过去尝试的结果。

更根本的是,从安全的角度来看,不知道应该使用哪种协议(protocol)会引入漏洞:您的系统将容易受到降级攻击(与 blindly relying on automatic redirects 的方式类似) .如果您的用户代理支持 HSTS , 值得研究一下(尽管它需要用户代理记住哪些站点要与 HTTPS 一起使用)。

无论哪种方式,如果您担心安全问题,您必须配置客户端以知道何时使用https://

关于java - 如何优雅地检测 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348370/

相关文章:

java - 在 Java 中将十进制度或度分秒转换为米

java - 处理 UI 代码( Activity )和业务逻辑代码之间的消息的最佳策略是什么

Perl 模块 LWP::Protocol::https 在 Ubuntu 上安装失败

Java:regionMatches 比较用户输入的两个字符串

java - Android 通过蓝牙从 HC-06 发送/接收数据

node.js - 计算 Node http服务器中的访问者

javascript - 为什么 header 中的内容类型仍然是文本/纯文本,尽管我将其设置为 application/json

c# - 如何在 C# 中返回 HTTP 调用响应

php - mysqli 通过 ssl 提供 2003

ruby-on-rails - Heroku 控制台中的预期 (200) <=> 实际 (401 未经授权)