ssl сертификат выдаётся весной mvc - PullRequest
0 голосов
/ 24 января 2019

Я реализую код, который генерирует ошибку, которую я не понимаю. Я гуглю три дня назад безуспешно. Найдите ниже мой код:

Основной класс

package com.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test {

    public static void main(String[] args) throws IOException {

        URL url = new URL("https://qosic.net:8443/QosicBridge/user/deposit");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");

        String json = "{\"msisdn\": \"22967307747\",\"amount\": 2000,\"transref\": 56789,\"clientid\": QOS3P001}";

        OutputStream os = connection.getOutputStream();
        os.write(json.getBytes());
        os.flush();

        if(connection.getResponseCode() != 200){
            throw new RuntimeException("Failed : Http Error code "+connection.getResponseCode());
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        String output;
        System.out.println("Output from server....\n");
        while((output = reader.readLine()) != null){
            System.out.println(output);
        }       
    }
}

Error

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
    ... 13 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ... 19 more

Если кто-то сможет помочь понять, что я сделал неправильно, я буду очень признателен

Спасибо

1 Ответ

0 голосов
/ 24 января 2019
unable to find valid certification path to requested target

Вам необходимо предоставить хранилище ключей действительный сертификат для хоста (в данном случае qosic.net), к которому вы пытаетесь подключиться через https (ssl).

Вы можете инициализировать свой собственный контекст SSL, см. здесь для примеров.

Или вы можете игнорировать все сертификаты (которые взломаны, НЕ ДЛЯ ПРОИЗВОДСТВА) с этим кодом

@ Test public void test1 () генерирует исключение {

    CloseableHttpClient defaultHttpClient = HttpClients.createDefault();
    String uri = "https://localhost/healthcheck";
    try {
        defaultHttpClient.execute(new HttpGet(uri));
        fail();
    } catch (SSLHandshakeException e) {
        // do nothing
    }

    SSLContextBuilder builder = new SSLContextBuilder();
    builder.loadTrustMaterial(null, new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            return true;
        }
    });
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build());

    CloseableHttpClient customHttpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();
    CloseableHttpResponse response = customHttpClient.execute(new HttpGet(uri));
    assertEquals(200, response.getStatusLine().getStatusCode());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...