В Groovy, как вы используете ca.pem при создании URL-соединения? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть веб-сервис, который я хочу отправить. С помощью curl я могу сделать это:

curl --cacert ~/ca.pem [...]

, который отлично работает.

В Groovy я делаю это:

def post = new URL("$endpoint").openConnection()
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.setRequestProperty("Authorization", "Bearer $token")
post.getOutputStream().write(json.getBytes("UTF-8"))

Последняя строка завершается с:

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

Существует ли простой способ настройки моего сертификата (который настраивается пользователем)? Это не связано с обстрелами?

Я видел этот ответ: https://stackoverflow.com/a/48173910/675083 Но относится ли это ко мне и действительно ли это сложно?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Java работает только с хранилищами ключей.

и ваш ca.pem Я думаю, это сертификат.

вы должны поместить его в стандартное хранилище java, расположенное здесь:

$JAVA_HOME/jre/lib/security/cacerts 

или вы можете преобразовать свой сертификат в pkcs12 хранилище ключей с помощью openssl и установить его как хранилище доверенных сертификатов java при запуске:

java -Djavax.net.ssl.trustStore=path_to_pksc12 \
  -Djavax.net.ssl.trustStorePassword=changeit \
  -Djavax.net.ssl.trustStoreType=pksc12 \
  ...

но если вы хотите сделать это динамически, это будет так сложно, как вы обнаружили

0 голосов
/ 02 мая 2019

Я нашел этот код, который работал:

def nullHostnameVerifier = [
            verify: { hostname, session -> true }
        ]
        HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier)

        def is = new File(cacertPath).newInputStream() // *** how to close?

        TrustManager[] trustManagers = null;
        char[] password = null; // Any password will work.
        KeyStore caKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        caKeyStore.load(null, password);
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(is);
        if (certificates.isEmpty()) {
            throw new IllegalArgumentException("expected non-empty set of trusted certificates");
        }
        int index = 0;
        certificates.each {
            String certificateAlias = "ca" + Integer.toString(index++);
            caKeyStore.setCertificateEntry(certificateAlias, it);
        }
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(caKeyStore);
        trustManagers = trustManagerFactory.getTrustManagers();

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustManagers, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...