Как сделать почтовый запрос на веб-интерфейс https? - PullRequest
0 голосов
/ 20 сентября 2019

Я пишу программу, которая должна отправлять данные в вебапи с помощью https Post.Мне предоставлен файл .pem, который, по словам провайдера, мне понадобится для подключения к API.Теперь я застрял в создании правильного почтового запроса с этим файлом сертификата.Кто-нибудь может помочь?

И ниже я до сих пор получаю, и он работает, но натолкнулся на

java.security.cert.CertificateException: нет альтернативных имен субъекта вsun.security.util.HostnameChecker.matchIP

Я искал это исключение.Некоторые говорят, что я должен использовать доменное имя вместо IP-адреса в моем коде.Тем не менее, API, который мне предоставили, только в форме IP.Я также проверяю CN в файле .pem.Это также в форме IP вместо формы домена.

    public void httpPost(String json) throws Exception {
    System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
    InputStream stream = getClass().getClassLoader().getResourceAsStream("test.pem");
    File targetFile = new File("test_cert.pem");
    try {
        FileUtils.copyInputStreamToFile(stream, targetFile);
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
    try {
        //String key;
        System.out.println("SSL");
        SSLSocketFactory sf = getSocketFactoryPEM(targetFile);
        URL url = new URL("https://xxxxxxx");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty("Content-Length", String.valueOf(json.getBytes().length));
        conn.setSSLSocketFactory(sf);
        conn.getOutputStream().write(json.getBytes());
        conn.getOutputStream().flush();
        conn.getInputStream().close();
        System.out.println("Send message.");
        BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

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

        conn.disconnect();
        System.out.println("Got response.");

    } catch (MalformedURLException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }

}

protected static SSLSocketFactory getSocketFactoryPEM(File file) throws Exception {
    byte[] certAndKey = FileUtils.readFileToByteArray(file);

    byte[] certBytes = parseDERFromPEM(certAndKey, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----");

    X509Certificate cert = generateCertificateFromDER(certBytes);                

    KeyStore keystore = KeyStore.getInstance("JKS");
    keystore.load(null);
    keystore.setCertificateEntry("cert-alias", cert);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(keystore, "123456".toCharArray());

    KeyManager[] km = kmf.getKeyManagers(); 

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(km, null, null);

    return context.getSocketFactory();
}

protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) {
    String data = new String(pem);
    String[] tokens = data.split(beginDelimiter);
    tokens = tokens[1].split(endDelimiter);
    return DatatypeConverter.parseBase64Binary(tokens[0]);        
}

protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");

    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));      
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...