Le développement du chemin PKIX a échoué lors de la connexion SSL
Je suis l'intégration avec un Compte Marchand appelé CommWeb et je suis en envoyant un SSL post à leur URL (https://migs.mastercard.com.au/vpcdps). Lorsque j'essaie d'envoyer le post, j'obtiens l'exception suivante:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Le code (que je n'ai pas écrit, et qui existe déjà dans notre base de code) qui effectue le post est:
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);
}
}
La documentation pour le Compte du Marchand l'intégration ne dit rien sur les certificats. Ils ont fourni des exemples de code JSP qui semble accepter aveuglément les certificats:
<%! //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();
...
...
%>
Notre webapp a un magasin de clés, et j'ai essayé d'ajouter le certificat (que j'ai exporté à partir de firefox) à l'aide de la keytool
de commande, mais cela ne fonctionne pas et j'ai eu le même message d'erreur. J'ai essayé des solutions sur le web (de l'importation de la clé et à l'aide de System.setProperty
) mais qui semble sorte de maladroit et ça ne fonctionne pas (m'a donné un NoSuchAlgorithmError
). Toute aide est appréciée!
source d'informationauteur Vivin Paliath
Vous devez vous connecter pour publier un commentaire.
Évidemment le valicert classe 3 certificat d'autorité de certification n'est pas dans votre défaut truststore (ce qui est probablement le fichier cacerts dans votre JRE lib/security répertoire, mais voir le JSSE documentation pour l'histoire complète).
Vous pourriez ajouter ce certificat dans le fichier cacerts, mais je ne le recommande pas. Au lieu de cela, je pense que vous devriez créer votre propre fichier truststore (qui peut être une copie du fichier cacerts) et ajouter le valicert autorité de certification racine. Ensuite pointer vers ce fichier avec le
javax.net.ssl.trustStore
système de la propriété.