java访问https连接报错 unable to find valid certification path to requested target

1、报错原因

用浏览器可以正常访问,用httpclient不可以,是因为javaSSL证书校验失败,即java验证对方HTTPS证书时找不到完整的信任链。而浏览器对比java,会自动补全中间证书、使用系统的信任库、有更宽松的兼容策略。

若在开发的调试过程中,可以采用以下方法跳过验证。

复制代码
public class SSLUtil {
    public static void ignoreSSL() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() { return null; }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                }
        };

        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());

        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
    }
}

//方法调用

SSLUtil.ignoreSSL();

2、解决方法

(1) 下载证书

访问https连接,在浏览器左侧会发现安全锁的标志,点击安全锁弹出如图对话框:

点击连接安全之后,点击图中证书标志,之后导出证书到本地。

(2) 导入到java库

在cmd或者powerShell中使用以下命令导入证书,导入过程中会显示是否信任此证书,输入y后回车即可。

复制代码
keytool -import -alias XXX //文件命名
-file XXXX.crt //已下载的证书文件
-keystore "XXX\jre\lib\security\cacerts" //java的秘钥库文件
-storepass changeit //默认密码

导入成功后再次连接验证发现无报错。

相关推荐
ITxiaobing20232 小时前
中国公司海外广告投放的 IP 地址库选型:从“查归属”到“验真实”的工程视角
网络·网络协议·tcp/ip
明天也要努力学习7 小时前
TCP 协议的相关特性
网络·网络协议·tcp/ip
SHENGWEI胜为8 小时前
局域网出现 IP 地址冲突怎么办?如何从 ARP 表定位故障设备
网络协议·tcp/ip·php
2401_873479408 小时前
源IP告警太多用什么工具分层?ASN与风险评分操作指南
网络·网络协议·tcp/ip
张赐荣11 小时前
sslx: 一个检测、查看 HTTPS 证书信息的跨平台单文件命令行工具
网络协议·http·https
辛迪聊物业数字化11 小时前
物业费收缴率从68%提升到97%落地复盘:中小物业收费系统选型避坑指南
人工智能·嵌入式硬件·物联网·网络协议·系统架构
80s77712 小时前
态住宅IP在跨境电商防关联中的技术应用
网络·网络协议·tcp/ip
XiYang-DING12 小时前
【WebSocket】文本帧Text Frame
网络·websocket·网络协议
Novproxy_Z12 小时前
代理 IP 黑白名单体系搭建:自动标记风控 IP,减少封号
网络·网络协议·tcp/ip
RacentCLM12 小时前
HTTPS只在登录时有用?关于TLS的误解讲清
数据库·网络协议·https