- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个必须调用两个网络服务的服务器。 Web 服务具有相同的 CA 证书 (PKCS12)。
第一个通过 GET 接收请求,另一个通过 SOAP 调用接收请求。
遵循为 GET 请求创建连接的部分代码
InputStream inputStream = null;
// is https protocol?
if (url.getProtocol().toLowerCase().equals("https")) {
trustAllHosts();
// create connection
HttpsURLConnection httpsUrlConnection = null;
if(proxy != null){
httpsUrlConnection = (HttpsURLConnection) url.openConnection(proxy);
} else {
httpsUrlConnection = (HttpsURLConnection) url.openConnection();
}
// set the check to: do not verify
httpsUrlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
setHeaders(httpsUrlConnection, headers);
//set del certificato
log.debug("set certificate for get...");
File cerp12 = new File(Utils.getWebAppLocalPath(),"WEB-INF"+String.valueOf(File.separatorChar)+PropConfig.getProperty("cer.p12"));
((HttpsURLConnection) httpsUrlConnection).setSSLSocketFactory(security(cerp12,PropConfig.getProperty("cer.pwd")));
httpsUrlConnection.connect();
inputStream = httpsUrlConnection.getInputStream();
} else {
HttpURLConnection httpUrlConnection = null;
if(proxy != null){
httpUrlConnection = (HttpURLConnection) url.openConnection(proxy);
} else {
httpUrlConnection = (HttpURLConnection) url.openConnection();
}
setHeaders(httpUrlConnection, headers);
inputStream = httpUrlConnection.getInputStream();
}
in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = in.readLine()) != null) {
result.append(inputLine);
}
这部分是针对 SOAP 请求的
InputStream inputStream = null;
// is https protocol?
if (url.getProtocol().toLowerCase().equals("https")) {
trustAllHosts();
// create connection
HttpsURLConnection httpsUrlConnection = null;
if(proxy != null){
httpsUrlConnection = (HttpsURLConnection) url.openConnection(proxy);
} else {
httpsUrlConnection = (HttpsURLConnection) url.openConnection();
}
// set the check to: do not verify
httpsUrlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
setHeaders(httpsUrlConnection, headers);
//set del certificato
log.debug("set certificate for get...");
File cerp12 = new File(Utils.getWebAppLocalPath(),"WEB-INF"+String.valueOf(File.separatorChar)+PropConfig.getProperty("cer.p12"));
((HttpsURLConnection) httpsUrlConnection).setSSLSocketFactory(security(cerp12,PropConfig.getProperty("cer.pwd")));
httpsUrlConnection.connect();
inputStream = httpsUrlConnection.getInputStream();
} else {
HttpURLConnection httpUrlConnection = null;
if(proxy != null){
httpUrlConnection = (HttpURLConnection) url.openConnection(proxy);
} else {
httpUrlConnection = (HttpURLConnection) url.openConnection();
}
setHeaders(httpUrlConnection, headers);
inputStream = httpUrlConnection.getInputStream();
}
in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = in.readLine()) != null) {
result.append(inputLine);
}
代码几乎相同
对于 GET 请求我没有问题,但是对于 SOAP 请求 httpsUrlConnection.connect();
抛出 PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
最佳答案
以下是如何为 HTTPS 连接创建 ssl 上下文。
SSLSocketFactory socketFactory = createSSLContext().getSocketFactory();
HttpsURLConnection connection = (HttpsURLConnection) (url).openConnection();
connection.setSSLSocketFactory(socketFactory);
以及创建 SSL 上下文的方法。请注意,它从 .pem 文件(x509 格式)加载根服务器证书,从 .p12(pkcs12 格式)加载客户端证书。如果服务器不需要客户端证书,请为 key 管理器传递 null。如果服务器证书由权威机构颁发,且已位于 $JRE_HOME/lib/security/cacerts 中,则将 null 作为信任管理器传递。
还有一点需要注意:在 .pem 文件中,您应该将根证书存储在服务器证书的 PKIX 路径中。例如,github.com 该站点具有 PKIX 路径 CN = github.com
-> CN = DigiCert High Assurance EV CA-1
-> CN = DigiCert High保证 EV 根 CA
-> CN = GTE CyberTrust 全局根
。因此,您存储GTE CyberTrust Global Root
private final SSLContext createSSLContext()
throws NoSuchAlgorithmException, KeyStoreException,
CertificateException, IOException,
UnrecoverableKeyException, KeyManagementException {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(Config.getString(Config.KEYSTORE_PATH)));
} catch (Exception ex) {
throw new IOException("not found keystore file: " Config.getString(Config.KEYSTORE_PATH), ex);
}
try{
keyStore.load(fis, Config.getString(Config.KEYSTORE_PASSWORD).toCharArray());
}finally {
IOUtils.closeQuietly(fis);
}
CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream in = new FileInputStream(Config.getString(Config.HTTPS_SERVER_CERT));
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(null);
try {
X509Certificate cacert = (X509Certificate) cf.generateCertificate(in);
trustStore.setCertificateEntry("alias", cacert);
} finally {
IOUtils.closeQuietly(in);
}
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(trustStore);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, Config.getString(Config.KEYSTORE_PASSWORD).toCharArray());
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
return sslContext;
}
关于java - SOAP - PKIX 路径构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15138660/
我已将所有插件设置为与 Maven 一起使用,但是当我尝试编译我的 Maven 项目时 使用以下命令 mvn clean install -Dmaven.test.skip=true 我在 cmd
我正在构建一个必须调用两个网络服务的服务器。 Web 服务具有相同的 CA 证书 (PKCS12)。 第一个通过 GET 接收请求,另一个通过 SOAP 调用接收请求。 遵循为 GET 请求创建连接的
我正在尝试使用java通过gmail发送邮件但我遇到了一些异常(exception)代码如下: public static void send_java_mail() throws IOExcept
这个问题在这里已经有了答案: Resolving javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExce
我今天注意到,我的服务拒绝 API 证书。它不是自签名证书,而是 let's encrypt 颁发的证书。我发现它在浏览器和一些在线证书检查工具中看起来不错。它上周一直运行良好 - 但不知何故在周末停
我正在尝试用 Java 下载 https url 的内容,但什么时候出现此错误。 PKIX path building failed: sun.security.provider.certpath.S
我们运行标准的 Linux、Apache、Tomcat、Java 堆栈。 一个多月前,我们遇到了一个问题,我们连接的其中一项服务在一夜之间更新了他们的数字证书,这打破了信任链。我们收到错误消息 sun
在此先感谢您的帮助。 我针对部署到非安全内部 QA 环境的 API 在 Java TestNG 中开发了一套 API 测试。最近,这个应用程序被重新部署到一个新的、安全的环境中。发生这种情况时,我开始
我刚刚为我们的域购买了一个新的通配符 ssl 证书,因为我们的旧证书即将到期。我已将它安装在我们的 cas 服务器和我们的应用程序服务器上,但是我在我们的应用程序服务器上得到以下堆栈跟踪: Messa
很抱歉打开另一个相同主题的问题,但我认为这个子问题会使 other one 膨胀被遗忘。 我遇到了提到的错误消息,它非常不具体(至少对我而言)。调试输出显示证书已加载,然后仅显示提到的错误。我用自己的
报错问题如图: 仔细看报错问题后发现,这个错误的主要原因是: ValidatorException:PKIX path building failed : sun.security.provi
我一直在寻找关于 的一些解决方案javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCe
我正在运行 wso2 中的 Playground2 示例 post ,当我提交获取访问 token 的表单时出现以下错误 javax.net.ssl.SSLHandshakeException: su
我正在尝试使用 jhipster 生成基于角度的应用程序,但当我尝试运行 ./mvnw 时,PKIX 路径构建失败。下面我附上了我的应用程序生成步骤和错误日志。我使用的是 macOS Mojave,节
我正在尝试 flutter 和 react-native(我是初学者开发人员),我必须为我的公司构建一个小型原型(prototype),但我无法通过“运行我的第一个应用程序”这一步由于证书错误(详见下
我突然遇到一个问题场景是我在 selenium 中有 TestNG 项目,当我在执行测试用例后执行测试用例时,我使用 gmail smpt 和端口 465 调用在另一个类“SendMail.java”
我有一组用 Java 编写的“包装器”服务,运行在 AWS 上的 Tomcat 8 上,它们调用客户端的一组 MIME 服务。当我尝试调用他们的服务时,我得到一个 SSLHandshakeExcept
在将我的应用程序从 Windows 2000 迁移到 Windows 2008 R2 Server 后,我花了将近一周的时间才让我的应用程序正常运行。 过程: 已安装 Java JDK 1.7.0_2
我目前正在尝试将我的 spring boot 微服务连接到 keycloak,以验证来自前端的所有 token 并验证用户。为此,我将 keycloak 适配器用于 spring boot。这是我第一
我正在使用 Liferay 和 eclipse,并使用加密套接字 (SSL) 运行客户端/服务器模型。 目前,当我以批处理模式运行应用程序时,我的应用程序运行客户端/服务器连接正常,但是当我尝试在 E
我是一名优秀的程序员,十分优秀!