首页 > 解决方案 > 当我所拥有的只是提供的 PEM 格式的证书和出现故障的默认信任库时,如何使用 Java 发出安全的 HTTP 请求?

问题描述

我正在编写一个 Web 服务,它接受一个请求,针对外部 Web 服务验证请求的承载令牌,使用存储过程从加密数据库中检索请求的信息,使用提供的密钥解密数据,并将数据作为 JSON 返回. 相当标准的东西,尽管我在请求身份验证方面遇到了一个绝对令人抓狂的问题。

针对外部身份验证服务的身份验证在我的开发机器上运行良好,但是当我将其部署到生产环境时,所有请求都因证书无效错误而被拒绝。我通过使用 curl 手动发出请求来确认这一点,这显示了同样的问题。然后,生产环境的所有者提供了 PEM 格式的证书(实际上是同一个文件中的两个证书)。使用 curl 和此证书发出的请求运行良好,因此我像往常一样使用 keytool 将此证书添加到默认信任库中。这并没有解决错误,我在发出证书错误的请求时一直崩溃。

当涉及到 Java 证书时,我已经尝试了所有我知道如何做的事情,我创建了一个自定义信任库并将 JVM 指向它,我什至将已知良好的信任库从我的开发机器移植到相同的目录作为导出的 JAR 并以trustStore编程方式将属性设置为指向它,但绝对没有成功。为了允许进行一些测试,我做了旧的“安装一个允许一切通过的信任管理器”,它解决了这个问题,但显然只有一个完整的疯子才会将该代码投入生产,所以我不能把它按原样投入生产。

我完全被难住了。我开始认为有一些奇怪的环境问题正在发生,如果我在 macOS 上开发时生产服务器正在运行 Centos 是否相关。请求和响应的框架是 Spring Boot。我正在以通常的方式提出请求javax.net.ssl.HttpsURLConnection。对此问题的任何建议将不胜感激。

标签: javalinuxsslcertificatetruststore

解决方案


推荐阅读