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