【问题标题】:Making an SSL happy for localhost让 SSL 对 localhost 感到满意
【发布时间】:2024-04-28 12:55:01
【问题描述】:

我有一个在客户端机器上运行的 java 应用程序,它接收来自 Web 应用程序的 ajax 请求。其中一些想要使用该服务的 Web 应用程序仅在 https 下提供。

我的 java 应用程序现在可以很好地接受和处理 SSL 请求,但我必须首先在浏览器中导航到服务器并接受证书。

在侦听https://localhost:my_port 的 Java 应用程序中安装“真实证书”的最佳方法是什么?

在 Windows 上,我似乎可以让安装程序将自签名证书添加到机器接受列表中。我还考虑过为thisApp.myDomain.com 获取经过验证的证书,然后更改主机文件以将该地址指向127.0.0.1,但更改主机文件似乎是恶意的,我担心会被防病毒软件检测到。

“主”应用程序是一个基于 Web 的系统。这个基于网络的系统的一些用户希望能够打印到指定计算机上的特殊打印机。 Java 应用程序将安装在这些计算机上,然后 Web 应用程序将 ajax 请求发送到与打印机交互的 Java 应用程序。最终用户需要能够使用简单的一键式安装程序来安装此 java 服务。 Web 应用程序是从进行打印的机器上的浏览器运行的,因此是 localhost。

如前所述,网络应用程序需要通过 https 连接到网络服务器(目前位于亚马逊)。除了 Chrome 抱怨内容不安全之外,与 localhost 打印服务器的连接不需要是 https,而 chrome 目前是我们用户使用最广泛的浏览器。

有什么想法或建议吗?

【问题讨论】:

  • 在开发中更改主机文件以进行测试是常见做法,无需担心
  • 在生产环境中修改hosts文件怎么样?
  • “主”应用程序是一个基于 Web 的系统。这个基于网络的系统的一些用户希望能够打印到指定计算机上的特殊打印机。 Java 应用程序将安装在这些计算机上,然后 Web 应用程序将 ajax 请求发送到与打印机交互的 Java 应用程序。最终用户需要能够使用简单的一键式安装程序来安装此 java 服务。
  • Web 应用程序直接在进行打印的机器上运行,因此是 localhost。

标签: java security ssl


【解决方案1】:

如果“真实”证书是指由受信任的 CA 签名的证书,那么我认为答案是您可能不能。我认为受信任的 CA 不会为您签发一份。

我上面链接的答案建议您通过获取 CA 证书来设置自己的 CA。其他替代方案是 127.0.0.1 的自签名证书,或调整您的 DNS 解析(例如,通过客户端计算机的“主机”文件),以便具有有效证书的某些名称解析为客户端计算机上的环回地址。


顺便说一句 - 关闭证书验证不是要走的路。最好将自签名证书添加到(例如)用户浏览器的受信任证书列表中。


如果我遇到您的情况,我想我会更改任何需要 HTTPS 来处理 127.0.0.1 上的请求的内容。请求不需要 HTTPS,或者将 IP 地址更改为客户端自己的 IP 地址。

【讨论】:

  • 可以在安装过程中以编程方式更改用户主机文件吗?还是我认为这会引发危险信号?
  • @LeeQuarella - 我不知道。我想这取决于病毒检查器。你试过了吗?
  • @LeeQuarella 如果程序在安装过程中尝试这样做,我会很合适。
  • @Deestan,我就是这么想的。是我还没试过的原因,只是感觉用户可能会生气。我的用户群不是最精明的,但我不想侮辱他们:-P。
【解决方案2】:

我尝试在客户端机器上安装自签名证书 - 但失败了。不记得是什么问题了。所以我关闭了客户端代码中的证书验证。

你可以阅读它here

【讨论】:

  • 这是浏览器在连接到我的 java 应用程序时抱怨证书。我认为关闭 java 应用中的验证不会对浏览器产生任何影响,是吗?
  • 如果是浏览器 - 是的。这无济于事。它只是关于java客户端。仅使用浏览器可能的方式 - 购买受信任的证书并安装在您的服务器上。
  • 正如问题所说,困境出现在哪里,服务器是本地主机。 localhost 不是限定域名,因此不会获得可信证书。