我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JAVA客户端导入证书来访问HTTPS的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JAVA客户端导入证书来访问HTTPS的方法

JAVA客户端导入证书来访问HTTPS的方法

方法一(修改cacerts文件)


java 把证书都放在了 D:\jdks\1.8\jre\lib\security 这个路径下的cacerts 文件里面。

我们进入jdk/bin这个路径,使用keytool工具。


输入以下命令 keytool -import -aliias [证书名字] -keystore [cacerts路径] -file [证书地址] 即可。

keytool -import -alias clientkey -file C:\ssl\xxx.pem -keystore D:\jdks\1.8\jre\lib\security\cacerts -trustcacerts

如果是自己的网站可以从服务商那里下载,如果是别人的网站那么需要从浏览器导出。

image-20230207132720104

或者到方法二那里通过代码生成证书。


接下来输入密钥口令:changeit 。提示是否信任证书的时候输入y,即可成功导入。

img


后续注意:

最后需要注意的是,证书是有时间限制的。记得看下证书的到期时间,下次还是需要更新的。

删除原来的证书,更新新证书的方法:

展示所有证书
keytool -list -keystore cacerts

删除指定证书
keytool -delete -alias akazam_email -keystore cacerts

重新添加新证书
keytool -import -alias akazam_email -file akazam_email.cer -keystore cacerts -trustcacerts


原文:用HttpClient请求对方网站数据报unable to find valid certification path to requested target_xfjs

方法二(新增jssecacerts证书文件)

首先也是下载访问的SSL站点的证书。

写一个安全程序专门用于获取安全证书:

 import java.io.*;import java.net.URL; import java.security.*;import java.security.cert.*; import javax.net.ssl.*; public class InstallCert {     public static void main(String[] args) throws Exception {    String host;    int port;    char[] passphrase;    if ((args.length == 1) || (args.length == 2)) {        String[] c = args[0].split(":");        host = c[0];        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);        String p = (args.length == 1) ? "changeit" : args[1];        passphrase = p.toCharArray();    } else {        System.out.println("Usage: java InstallCert [:port] [passphrase]");        return;    }     File file = new File("jssecacerts");    if (file.isFile() == false) {        char SEP = File.separatorChar;        File dir = new File(System.getProperty("java.home") + SEP            + "lib" + SEP + "security");        file = new File(dir, "jssecacerts");        if (file.isFile() == false) {        file = new File(dir, "cacerts");        }    }    System.out.println("Loading KeyStore " + file + "...");    InputStream in = new FileInputStream(file);    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());    ks.load(in, passphrase);    in.close();     SSLContext context = SSLContext.getInstance("TLS");    TrustManagerFactory tmf =        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    tmf.init(ks);    X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];    SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);    context.init(null, new TrustManager[] {tm}, null);    SSLSocketFactory factory = context.getSocketFactory();     System.out.println("Opening connection to " + host + ":" + port + "...");    SSLSocket socket = (SSLSocket)factory.createSocket(host, port);    socket.setSoTimeout(10000);    try {        System.out.println("Starting SSL handshake...");        socket.startHandshake();        socket.close();        System.out.println();        System.out.println("No errors, certificate is already trusted");    } catch (SSLException e) {        System.out.println();        e.printStackTrace(System.out);    }     X509Certificate[] chain = tm.chain;    if (chain == null) {        System.out.println("Could not obtain server certificate chain");        return;    }     BufferedReader reader =        new BufferedReader(new InputStreamReader(System.in));     System.out.println();    System.out.println("Server sent " + chain.length + " certificate(s):");    System.out.println();    MessageDigest sha1 = MessageDigest.getInstance("SHA1");    MessageDigest md5 = MessageDigest.getInstance("MD5");    for (int i = 0; i < chain.length; i++) {        X509Certificate cert = chain[i];        System.out.println            (" " + (i + 1) + " Subject " + cert.getSubjectDN());        System.out.println("   Issuer  " + cert.getIssuerDN());        sha1.update(cert.getEncoded());        System.out.println("   sha1    " + toHexString(sha1.digest()));        md5.update(cert.getEncoded());        System.out.println("   md5     " + toHexString(md5.digest()));        System.out.println();    }     System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");    String line = reader.readLine().trim();    int k;    try {        k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;    } catch (NumberFormatException e) {        System.out.println("KeyStore not changed");        return;    }     X509Certificate cert = chain[k];    String alias = host + "-" + (k + 1);    ks.setCertificateEntry(alias, cert);     OutputStream out = new FileOutputStream("jssecacerts");    ks.store(out, passphrase);    out.close();     System.out.println();    System.out.println(cert);    System.out.println();    System.out.println        ("Added certificate to keystore 'jssecacerts' using alias '"        + alias + "'");    }     private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();     private static String toHexString(byte[] bytes) {    StringBuilder sb = new StringBuilder(bytes.length * 3);    for (int b : bytes) {        b &= 0xff;        sb.append(HEXDIGITS[b >> 4]);        sb.append(HEXDIGITS[b & 15]);        sb.append(' ');    }    return sb.toString();    }     private static class SavingTrustManager implements X509TrustManager {     private final X509TrustManager tm;    private X509Certificate[] chain;     SavingTrustManager(X509TrustManager tm) {        this.tm = tm;    }     public X509Certificate[] getAcceptedIssuers() {        throw new UnsupportedOperationException();    }     public void checkClientTrusted(X509Certificate[] chain, String authType)        throws CertificateException {        throw new UnsupportedOperationException();    }     public void checkServerTrusted(X509Certificate[] chain, String authType)        throws CertificateException {        this.chain = chain;        tm.checkServerTrusted(chain, authType);    }    } }

将代码保存为InstallCert.java文件,并通过javac InstallCert.java 命令编译Java程序

执行 java InstallCert hostname 命令,如:java InstallCert 192.168.1.137:8443(要访问的目标程序的IP地址和端口)或者是java InstallCert baidu.com:443,然后会看到如下信息:

java InstallCert ecc.fedora.redhat.comLoading KeyStore /usr/jdk/instances/jdk1.5.0/jre/lib/security/cacerts...Opening connection to ecc.fedora.redhat.com:443...Starting SSL handshake... javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)at InstallCert.main(InstallCert.java:63)Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)at sun.security.validator.Validator.validate(Validator.java:203)at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)... 7 moreCaused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)... 13 more Server sent 2 certificate(s): 1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US   Issuer CN=Certificate Shack, O=example.com, C=US   sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7   md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54 2 Subject CN=Certificate Shack, O=example.com, C=US   Issuer CN=Certificate Shack, O=example.com, C=US   sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6   md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68 Enter certificate to add to trusted keystore or 'q' to quit: [1]

直接输入1,然后会在相应的目录下产生一个名为‘jssecacerts’的证书,将证书copy到$JAVA_HOME/jre/lib/security目录下,

或者通过执行:

System.setProperty("javax.net.ssl.trustStore", "D:\\UTA\\DOC_E_Health_XML\\Keystore\\jssecacerts

重启程序即可解决

来源:解决 sun.security.validator.ValidatorException: PKIX path building failed

来源地址:https://blog.csdn.net/qq_34626094/article/details/128917682

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JAVA客户端导入证书来访问HTTPS的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JAVA客户端导入证书来访问HTTPS的方法

JAVA客户端导入证书来访问HTTPS的方法 方法一(修改cacerts文件) 1、 java 把证书都放在了 D:\jdks\1.8\jre\lib\security 这个路径下的cacerts 文件里面。 我们进入jdk/bin这个路径
2023-08-16

Linux下OpenSSL客户端中使用req命令来生成证书的操作方法

这篇文章给大家介绍Linux下OpenSSL客户端中使用req命令来生成证书的操作方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。openssl req 用于生成证书请求,以让第三方权威机构CA来签发,生成我们需要的
2023-06-12

“由于这台计算机没有终端服务器客户端访问许可证远程会话终段”的解决方法

由于Windows2003默认仅支持2个终端用户的登陆。当“终端连接超出了最大连接”的情况出现导致不能登录时,可以:1、在另外一台Windows2003的机器上运行“tsmmc.msc”,打开
2023-05-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录