【问题标题】:Authentication based on Certificates and IP基于证书和 IP 的身份验证
【发布时间】:2025-12-22 06:45:11
【问题描述】:

有没有办法让 java web 应用程序通过 http 请求获取有关安装在计算机上的安全证书的信息,并在计算机上安装特定证书时选择性地授予访问权限。

基本上要求是,Web 应用程序应仅接受来自公司笔记本电脑的请求,否则必须使用适当的错误文本拒绝访问。

(这些可能是计算机上安装了某些证书的 win 笔记本电脑,也可能来自一组特定的静态 ip。)

【问题讨论】:

    标签: java certificate ip-address http-authentication


    【解决方案1】:

    是的,这可以使用 HTTPS 客户端证书。确切的设置和配置取决于您的应用程序服务器和特定要求,但常见的情况是您创建公司内部 CA(认证机构)来颁发可能仅限于特定客户端 IP 地址的客户端证书并配置您的应用程序服务器的HTTPS 连接器需要客户端证书并信任您自己的 CA 颁发的证书。

    正确配置完成后,客户端证书可通过 servlet 请求属性提供给 Web 应用程序:

    X509Certificate[] certificates = (X509Certificate[])
        request.getAttribute("javax.servlet.request.X509Certificate");
    

    【讨论】:

      【解决方案2】:

      正如 jambjo 所说 - 您绝对可以通过 HTTPS 获得客户端证书,如他所描述的那样使用客户端身份验证。如果您将来需要以不同的方式重新配置网络,我建议通过静态 IP,证书更难被欺骗,并且具有更大的灵活性。

      其他一些想法:

      • 几乎所有应用程序服务器都允许您设置受信任的证书存储 - 您的应用程序将为 HTTPS 客户端身份验证接受的 CA 证书列表。将此限制为提供客户端证书的 CA - 内部公司 CA 或证书提供者。
      • 内部 CA 或 CA 提供商的选择是公司的选择。内部 CA 需要人力来设置和维护,CA 提供商将花费您每个证书的费用。有一个折衷点,您自己制作证书会更便宜,但在您达到该点之前,CA 提供商可能会更便宜。
      • 如果您有内部 CA,并且您的规则是“任何公司机器(具有证书)都可以访问此应用程序”,那么您的工作将在应用程序服务器中的受信任 CA 列表中完成,因为您知道公司 CA不会用于公司内部人员以外的任何人。
      • 如果您有 CA 提供商,您可能需要进一步限制访问控制并使用提供的代码 jambjo 来获取证书并查看其中的信息。通常,主题 DN(专有名称)中有一个组织 (O) 和组织单元 (OU) 组件,它们会告诉您是哪个组织生成了此证书。您应该能够检查以确保您拥有公司计算机。
      • 如果您知道您的 CA 提供商绝不会将您公司的 O 和 OU 名称透露给公司成员以外的任何人,那么进行 O 和 OU 检查是可行的。如果不是这种情况,您可能需要检查后端数据存储(如 LDAP 目录),以确保您知道用户或用户的机器。
      • 还可以将机器的 IP 地址链接到证书 - 通常在构建证书时使用 SubjectAltName(主题备用名称)。我不推荐它,因为如果您更改机器的 IP 地址,您将需要一个新证书。就您的目的而言,它似乎不必要地复杂。

      【讨论】:

      • 感谢您提供详细信息 lakshmi。按照您所说的,我想在我的本地为此创建一个 poc。我有 tomcat 和 glassfish(带有 netbeans)。现在看来我需要很多进一步的信息才能在这方面取得进展! a) 我如何为我的测试目的创建证书。 b) 如何在我的个人笔记本电脑上安装它。 c) 我认为我上面提到的服务器不支持 HTTPS,那么有任何已知的开源解决方案吗? d)此外,我将不得不找出如何将证书添加到服务器最终最终用于此 poc。 (这个问题我会留到以后)
      • 让我们看看... a) OpenSSL 是一个工具,可以让您创建自签名证书。你也可以用它来做一个测试 CA。 b)您需要生成证书和密钥对。我知道 Open SLL 将允许 PKCS12 格式。从那里,大多数浏览器都有一个证书上传过程。 c) tomcat 绝对支持 HTTPS,tomcat.apache.org/tomcat-4.0-doc/ssl-howto.html。如果 Glassfish 不这样做,我会感到惊讶。设置服务器时,您需要设置“客户端身份验证”。 d) 服务器需要 CA 证书,但不需要最终实体。通常是一劳永逸的操作。