如何处理Android应用程序中的SSL(HTTPs)认证路径异常?
如果在连接到 SSL 服务器 (HTTPS) 的系统上运行由您创建的Java程序时,如果您没有被下面提到的异常所困扰,请准备好在您的开发生涯中的某个时候遇到糟糕的经历。
Exception: PKIX path construction failed: sun.security.provider.certpath.SunCertPathBuilder Exception: No valid certification path to the specified target could be found.
为了将上述问题联系起来,我们想强调一些您可能会创建除 Android、Tomcat 服务器和 JavaFX 之外的Java应用程序的场景。
- 为产品或公司开发机器人时。
- 一个 Android 应用程序,需要从服务器检索数据并将其放置在每个构建的资产文件夹中。
- 根据您的需要创建文件解析器。
- 我正在从事计算机视觉项目。
- 我正在从事机器学习项目。
- 制作Java库
GeekTip: If a Java program attempts to connect to a server protected by SSL (HTTPS sites), the above-mentioned exception may occur.
使用 SSL 进行身份识别和加密的服务器会提供已由可信赖的第三方(例如 Verisign、GoDaddy 和其他一些公司)验证的证书。浏览器或Java客户端可以使用此证书来确保它们与正确的站点(它声称的站点)而不是重定向的代理站点进行通信。如果我们使用浏览器访问一个站点,这个阶段非常明显,因为如果 SSL 证书不在浏览器的受信任存储中,它会提示我们添加它,它会被添加。但是,当我们使用Java程序访问安全站点时,这个阶段的 SSL 握手对用户是不可见的。
证书在哪里验证?
证书使用 JRE 的 trustStore 进行验证。这个 trustStore 位于 JDK 安装目录中,该目录被Java HOME ($ Java HOME/jre/lib/security) 引用,并且经常被称为“cacerts”。如果安全站点提供的证书存在于 JRE 的 trustStore 中,则会创建 SSL 连接;但是,如果证书不存在, Java将抛出异常(如上所述),我们需要将该证书添加到 trustStore 以解决该问题。
GeekTip: This issue is more frequent on servers that utilize the “Let’s Encrypt” SSL certificate. However, because we are open source enthusiasts, we will utilize it, as well because it is free.
该程序尝试使用 OkHttp 对 https://httpbin.org/get URL(httpbin 是一个开源项目)进行 API 调用,然后使用 Gson 将返回的 JSON 解析为Java POJO 模型类对象。我创建了一个 JsonParser 类来使解析变得简单和通用。现在我们已经建立了Java应用程序中可能出现此问题的场景,让我们看看如何解决它。如前所述,该站点的 SSL 证书必须添加到 JRE 的 trustStore。要将 SSL 证书添加到 JRE 的 trustStore,请按照下面概述的步骤进行操作。
第 1 步:获取站点的 SSL 证书
第一步是获取站点的 SSL 证书。为此,请启动终端并导航到保存证书的位置。证书存储在桌面目录中。
openssl s_client -connect :443 -servername >
要退出,请在命令后按 ctrl + z。在任何文本编辑器(例如 sublime)中查看文件的内容。它将包括发行机构的名称、密钥、加密技术和其他信息。
第 2 步:现在我们将证书,即 cacerts,放在密钥库中。运行下面的命令来完成这个
sudo keytool -import -keystore cacerts -alias -file
它会询问您两次密码,一次是 sudo,一次是密钥库。密钥库的默认密码是“changeit”。
Note: If prompted for a new password after entering the “changeit,” use the same “changeit” or change the password and remember it for the future.
按照此命令,它将验证证书,然后提示您进行确认。当提示“信任此证书”时,输入“y”。最后,它会输出“证书已上传到密钥库”。