Невозможно найти действительный путь сертификации для запрошенной цели, попытка использовать API SMS через запрос https - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь отправить SMS с номера java с помощью API.

Мне просто нужно сделать https-запрос с параметрами, записанными в URL.

https://notificame.claro.com.hn/api/http/send_to_contact?msisdn504999999=&message=mymessage&api_key=00000&id=000

Если я скопирую полученный URL и вставлю его прямо в браузер, он отправит SMS.

У меня есть рабочий код, использующий это на PHP, но я нужно, чтобы он работал на JAVA

Я пробовал это:

try 
    {
        HttpsURLConnection con;
        URL url = new URL(pre_url); 
        con = (HttpsURLConnection) url.openConnection();
        System.out.println(url.getContent());

    } catch (MalformedURLException ex) {
        Logger.getLogger(crearUsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(crearUsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
    }

, но я получаю эту ошибку:

Severe:   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
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)...

Я также выполнил некоторые инструкции, используя keytool добавить сертификат с .cer в cacerts, но безуспешно. У меня есть две папки, jdk1.8.0_131 и jre1.8.0_131, поэтому я уже пробовал установить сертификат на обе. По-прежнему безуспешно.

Это код, который выполняет для меня работу на PHP:

function enviarMensaje($cel, $solicitud, $id){     
$mensaje="My message";
$url = "https://notificame.claro.com.hn/api/http/send_to_contact?msisdn=504".$cel."&message=".$mensaje."&api_key=MyAppiKey&id=".$id;
$url = str_replace(" ", "%20", $url);
file($url);
echo $url."<br />\n";   

}

Мне просто нужно что-то простое вроде этого. Я работаю над JSF2.2, используя Primefaces

Или, может быть, какой-нибудь способ вызвать простой код php прямо из java.

Помогите, пожалуйста.

1 Ответ

0 голосов
/ 10 августа 2020

После нескольких дней с той же проблемой я, наконец, получил решение, которое могло бы сработать для некоторых из вас.

Уловка состоит в том, чтобы создать TrustManager, чтобы он мог игнорировать все материалы SSL.

Я добавил этот код:

// Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

после этого любое подключение к URL-адресу HTTPS будет работать.

Я нашел решение здесь: https://nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...