Ich bin mit einem Händlerkonto namens CommWeb integriert und sende einen SSL-Post an ihre URL (https://migs.mastercard.com.au/vpcdps). Wenn ich versuche, die Post zu senden, erhalte ich die folgende Ausnahme:PKIX-Pfadaufbau fehlgeschlagen, während SSL-Verbindung hergestellt wird
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Der Code (was ich nicht schreiben, und das existiert schon in unserer Code-Basis), die die Post durchführt, ist:
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);
}
}
Die Dokumentation zur Merchant Account-Integration sagt nichts über Zertifikate aus. Sie haben einige Beispiele JSP-Code bereitzustellen, die blind Zertifikate zu akzeptieren scheint:
<%! // 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();
...
...
%>
Unsere Webapp einen Schlüsselspeicher haben, und ich versuchte, das Hinzufügen des Zertifikats (was ich von firefox exportierte) mit dem keytool
Befehl, aber das tat es nicht Arbeit und ich habe den gleichen Fehler. Ich habe versucht, Lösungen im Internet (Importieren des Schlüssels und mit System.setProperty
), aber das scheint irgendwie klobig und es hat nicht funktioniert (gab mir eine NoSuchAlgorithmError
). Jede Hilfe wird geschätzt!
http://stackoverflow.com/questions/21076179/pkix-path-building-failed-and-unable-to-find-valid-certification-path-to-requ/36427118#36427118 – MagGGG