Я пишу программу, которая должна отправлять данные в вебапи с помощью 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));
}