Здание пути PKIX перестало работать при устанавливании связи SSL

Я интегрируюсь с Торговым счетом под названием CommWeb, и я отправляю сообщение SSL в их URL (https://migs.mastercard.com.au/vpcdps). Когда я пытаюсь отправить сообщение, я получаю следующее исключение:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Код (то, которое я не записал, и это уже, существует в нашей кодовой базе), который выполняет сообщение:

public static HttpResponse sendHttpPostSSL(String url, Map params) throws IOException {
    PostMethod postMethod = new PostMethod(url);
    for (Map.Entry 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);
    }
}

В документации для интеграции Торгового счета ничто не говорится о сертификатах. Они действительно предоставляли некоторый демонстрационный код JSP, который, кажется, вслепую принимает сертификаты:

<%! // 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();
...
...
%>

Наше веб-приложение имеет keystore, и я пытался добавить сертификат (который я экспортировал из Firefox), использование keytool команда, но это не работало, и я получил ту же ошибку. Я попробовал решения в сети (импорт ключа и использование System.setProperty) но это кажется довольно неуклюжим, и это не работало (дал мне a NoSuchAlgorithmError). Любая справка ценится!

17
задан Vivin Paliath 18 February 2010 в 17:35
поделиться

1 ответ

Очевидно, сертификат CA valicert класса 3 отсутствует в вашем хранилище доверенных сертификатов по умолчанию (который, вероятно, является файлом cacerts в вашем каталоге JRE lib / security, но полную информацию см. В документации JSSE ).

Вы можете добавить этот сертификат в файл cacerts, но я не рекомендую это делать. Вместо этого, я думаю, вам следует создать свой собственный файл хранилища доверенных сертификатов (который может быть копией файла cacerts) и добавить к нему корневой ca valicert. Затем укажите на этот файл системное свойство javax.net.ssl.trustStore .

14
ответ дан 30 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: