使用腾讯短信服务: 报错找不到有效证书

1. 腾讯提供方法: 将OpenJDK更换为OracleJDK;

此方法可解决腾讯证书解析错误问题.(在JVM参数增加: -Djavax.net.debug=ssl 可查看此错误信息)

2. 以下方法均来自Stack Overflow(链接:https://stackoverflow.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore)

报错信息: [TencentCloudSDKException]message: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 requestId:

  1. 将证书加入%JAVA_HOME%\lib\security\cacerts中(证书从网页获取,此处为腾讯API服务提供证书下载)
    使用命令: keytool -import -noprompt -trustcacerts -alias -file -keystore -storepass
  2. tomcat可能忽略了jre下的证书文件,需要手动挂载
    在代码中加入
    String certificatesTrustStorePath = “%JAVA_HOME%/jre/lib/security/cacerts”;
    System.setProperty(“javax.net.ssl.trustStore”, certificatesTrustStorePath);
    至此我的问题解决
    Tomcat 7 在Linux下会需要手动挂载,我们使用的国产Apusic服务器.

  1. webserver 只发送证书和中级CA,但是没有根CA
    在JVM中加参数解决此问题: -Dcom.sun.security.enableAIAcaIssuers=true

  2. 禁用SSL验证。适用于开发人员,但不建议用于生产
    可以通过编程方式禁用SSL验证。适用于开发人员,但不建议用于生产,因为您可能希望在那里使用“真正的”SSL验证,或者安装并使用自己的受信任密钥,然后仍然使用“真正的”SSL验证。

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public X509Certificate[] getAcceptedIssuers() {
    return null;
  }
}
             HttpsURLConnection conn = null;
             URL url = new URL(serviceUrl);
             conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  
                    // Create all-trusting host name verifier
             HostnameVerifier allHostsValid = new HostnameVerifier() {
               public boolean verify(String hostname, SSLSession session) {
                return true;
              }
            };
            conn.setHostnameVerifier(allHostsValid);
  1. 如果您的应用程序服务器是jboss,请尝试添加以下系统属性
    System.setProperty(“org.jboss.security.ignoreHttpsHost”,“true”);

  2. 升级JDK版本

  3. 以下为部分原话
    对我来说,在尝试连接到处理SSL的NGINX反向代理后面的进程时也出现了这个错误。
    原来问题是一个没有连接整个证书链的证书。当我添加中间证书时,问题就解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值