Tôi đang tích hợp với Tài khoản người bán được gọi là CommWeb và tôi đang gửi một bài đăng SSL tới URL của họ (https://migs.mastercard.com.au/vpcdps). Khi tôi cố gắng gửi bài, tôi nhận được ngoại lệ sau đây:Xây dựng đường dẫn PKIX không thành công khi thực hiện kết nối SSL
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Mã (mà tôi đã không viết, và điều đó đã tồn tại trong codebase của chúng tôi) mà thực hiện các bài viết là:
public static HttpResponse sendHttpPostSSL(String url, Map<String, String> params) throws IOException {
PostMethod postMethod = new PostMethod(url);
for (Map.Entry<String, String> entry : params.entrySet()) {
postMethod.addParameter(entry.getKey(), StringUtils.Nz(entry.getValue()));
}
HttpClient client = new HttpClient();
int status = client.executeMethod(postMethod);
if (status == 200) {
StringBuilder resultBuffer = new StringBuilder();
resultBuffer.append(postMethod.getResponseBodyAsString());
return new HttpResponse(resultBuffer.toString(), "");
} else {
throw new IOException("Invalid response code: " + status);
}
}
Tài liệu về tích hợp Tài khoản người bán không nói gì về chứng chỉ. Họ đã cung cấp một số mẫu JSP mã mà dường như mù quáng chấp nhận chứng chỉ:
<%! // Define Static Constants
// ***********************
public static X509TrustManager s_x509TrustManager = null;
public static SSLSocketFactory s_sslSocketFactory = null;
static {
s_x509TrustManager = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; }
public boolean isClientTrusted(X509Certificate[] chain) { return true; }
public boolean isServerTrusted(X509Certificate[] chain) { return true; }
};
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new X509TrustManager[] { s_x509TrustManager }, null);
s_sslSocketFactory = context.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
...
...
// write output to VPC
SSLSocket ssl = (SSLSocket)s_sslSocketFactory.createSocket(s, vpc_Host, vpc_Port, true);
ssl.startHandshake();
os = ssl.getOutputStream();
// get response data from VPC
is = ssl.getInputStream();
...
...
%>
webapp của chúng tôi có một keystore, và tôi đã cố gắng bổ sung thêm giấy chứng nhận (mà tôi xuất khẩu từ firefox) bằng cách sử dụng lệnh keytool
, nhưng điều đó không làm việc và tôi gặp lỗi tương tự. Tôi đã thử các giải pháp trên web (nhập khóa và sử dụng System.setProperty
) nhưng điều đó có vẻ như là loại clunky và nó không hoạt động (đã cho tôi một NoSuchAlgorithmError
). Bất kỳ trợ giúp được đánh giá cao!
http://stackoverflow.com/questions/21076179/pkix-path-building-failed-and-unable-to-find-valid-certification-path-to-requ/36427118#36427118 – MagGGG