系统需要访问微信支付,需要用到证书,另外需要访问一个保险接口,也需要用到证书。 结果总是出现证书冲突。
第一个调用的就可以顺利通过。
如果第一个调用微信支付,微信支付可以通过,但是保险接口就不能用了,报找不到证书。
如果第一个调用保险接口,微信支付接口就报找不到证书。访问微信支付接口的部分代码:
try { // 代码如下:修改证书路径跟密码即可 KeyStore keyStore = KeyStore.getInstance("PKCS12");
String cert_path = magicHelper.getProperty("wx.CERT");
String password = magicHelper.getProperty("wx.PARTNER"); FileInputStream instream = new FileInputStream(new File(
cert_path == null ? "E://temp//zcb//apiclient_cert.p12"
: cert_path)); keyStore.load(instream, password.toCharArray()); instream.close(); SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, password.toCharArray()).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
访问保险接口的:
String chinaLifeKeyPath = magicHelper.getProperty("chinalifekey.path");
System.setProperty("javax.net.ssl.trustStore",
chinaLifeKeyPath+"server.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "12345678");
// System.setProperty("javax.net.ssl.keyStore",
// "D:/temp/chezhan.jks");
System.setProperty("javax.net.ssl.keyStore",
chinaLifeKeyPath+"eshop_test.pfx");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStorePassword", "123456"); System.setProperty("https.protocols", "TLSv1,SSLv3");
请各位大拿指导!

解决方案 »

  1.   

    在调用前,直接做一个环境变量的清理即可:
    //清理掉环境变量
    System.out.println("清理掉环境变量");
    System.clearProperty("javax.net.ssl.trustStore");
    System.clearProperty("javax.net.ssl.trustStorePassword");
    // System.setProperty("javax.net.ssl.keyStore", "D:/temp/chezhan.jks");
    System.clearProperty("javax.net.ssl.keyStore");
    System.clearProperty("javax.net.ssl.keyStoreType");
    System.clearProperty("javax.net.ssl.keyStorePassword");

    System.clearProperty("https.protocols");
      

  2.   

    大哥,你这样解决了吗?我情况跟你一模一样!我是在访问第二个接口的时候清理了环境变量,可是微信支付后执行的话还是拿不到prepar_id
      

  3.   

    我现在如果先调用微信支付的API,另一个接口就会报错。也像您这样清除了环境变量,但还是没用。求解大哥!!!
      

  4.   

    然后再问一下您,我在调用微信支付统一下单API发送post请求时读取的apiclient_cert.p12证书文件,我加上您的这些代码跟之前没有差别。还是报错:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    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 target 
    求解
      

  5.   

    我也遇到过证书冲突的情况  但是最后还是没有办法解决   最后还是被迫自己封装了另一个接口调用的方式  采用http请求才解决的
    不知道这种请款有没有彻底的比较好的解决办法
    这样就可以采用已经封装好的jar依赖    而不是还要自己冲头到尾写一遍