Wons' Blog

个人博客

Android程序猿


回首向来萧瑟处,也无风雨也无晴

Java https服务器证书认证问题解决方案

Java https连接的”unable to find valid certification path to requested target”,”PKIX path building failed”错误

问题原因

这个问题的是由于Java自带的根证书库中不包含HTTPS服务器上的根证书,因此无法得到认证。

解决方案

比较容易实现的方案有两种:

  1. 导入服务器证书到本地Java环境
  2. 代码中忽略证书信任问题

由于第二种方案会导致安全性问题,因此并不推荐。

证书导入注意事项

将服务器的根证书导入到Java运行环境的根证书库中,能解决对应的服务器https连接问题。

实现方式是使用$JAVA_HOME/jre/bin下的keytool工具将服务器端的证书添加到jre/lib/security/cacerts文件中。 需要注意的是:

  1. 确定当前Java程序所用的java运行环境jre的路径(可能为jdk下的jre,也可能是单独的jre)。
  2. 确定有jre/lib/security/cacerts文件的写入权限(可以用管理员权限运行keytool)。

详细步骤:

1. 获取服务器端的证书文件

可以使用浏览器打开服务器网站页面,然后导出证书文件,假设导出的证书文件为test.crt 。

2. 生成keystore文件

利用keytool生成密钥文件keystore:

keytool -importcert -noprompt -trustcacerts -alias test -file test.cer -keystore ~/mykeystore

这里会要求设置口令,设置后请记住口令 。

3. 导入证书到Java运行时环境

将证书导入jre/lib/security/cacerts:

keytool -importkeystore -srckeystore ~/keystore -destkeystore [path_to_jre]/lib/security/cacerts

会要求输入目标密钥库口令(也就是jre/lib/security/cacerts 的口令,默认是changeit或者changeme),以及源密钥库口令(之前设置的口令).

最后会显示是否导入成功。如果成功则重启Java程序。

最近的文章

浅析 C++ 调用 Python 模块

作为一种胶水语言,Python 能够很容易地调用 C 、 C++ 等语言,也能够通过其他语言调用 Python 的模块。Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python 模块。具体的文档参考官方指南:Embedding Python in Another Application调用方法1 链接到 Python 调用库Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windows 下为 python27.lib)。使用之...…

Python继续阅读
更早的文章

Python爬虫:自动登录与验证码识别

在用爬虫爬取网站数据时,有些站点的一些关键数据的获取需要使用账号登录,这里可以使用requests发送登录请求,并用Session对象来自动处理相关Cookie。另外在登录时,有些网站有时会要求输入验证码,比较简单的验证码可以直接用pytesser来识别,复杂的验证码可以依据相应的特征自己采集数据训练分类器。以CSDN网站的登录为例,这里用Python的requests库与pytesser库写了一个登录函数。如果需要输入验证码,函数会首先下载验证码到本地,然后用pytesser识别验证码后...…

Python继续阅读