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:
- 将证书加入%JAVA_HOME%\lib\security\cacerts中(证书从网页获取,此处为腾讯API服务提供证书下载)
使用命令: keytool -import -noprompt -trustcacerts -alias -file -keystore -storepass - tomcat可能忽略了jre下的证书文件,需要手动挂载
在代码中加入
String certificatesTrustStorePath = “%JAVA_HOME%/jre/lib/security/cacerts”;
System.setProperty(“javax.net.ssl.trustStore”, certificatesTrustStorePath);
至此我的问题解决
Tomcat 7 在Linux下会需要手动挂载,我们使用的国产Apusic服务器.
-
webserver 只发送证书和中级CA,但是没有根CA
在JVM中加参数解决此问题: -Dcom.sun.security.enableAIAcaIssuers=true -
禁用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);
-
如果您的应用程序服务器是jboss,请尝试添加以下系统属性
System.setProperty(“org.jboss.security.ignoreHttpsHost”,“true”); -
升级JDK版本
-
以下为部分原话
对我来说,在尝试连接到处理SSL的NGINX反向代理后面的进程时也出现了这个错误。
原来问题是一个没有连接整个证书链的证书。当我添加中间证书时,问题就解决了。