В настоящее время я пишу приложение JAVA, которое получает запросы AJAX от сервера PHP.
Я использую сокеты для этого, и он отлично работает с HTTP-запросами.
Но теперь я хотел бы сделать то же самое с HTTP-запросами.
Поэтому я создал хранилище ключей с использованием сертификата и ключа RSA на сайте:
openssl pkcs12 -export -in <path_to_website_cert> -inkey <path_to_website_rsa_key> -out keystore.p12 -name website -CAfile <path_to_ca_cert> -caname root
Затем я преобразовал это в JKS:
keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass password -alias website
Я также добавил сертификат в trustStore:
keytool -import -file <path_to_website_cert> -alias website -keystore <path_to_my_jdk>\jre\lib\security\cacerts
Вот код, который я использую для запуска моего сервера в моем приложении JAVA:
public void lancer_serveur_https() {
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStore", "C:/Users/f.guibert/Documents/Cert/incafu.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore", "C:/Users/f.guibert/Documents/Cert/trustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
try {
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket ss = (SSLServerSocket) ssf.createServerSocket(this.port);
while(true) {
try {
SSLSocket s = (SSLSocket) ss.accept();
s.setEnabledCipherSuites(s.getSupportedCipherSuites());
OutputStream out = s.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while (((line = in.readLine()) != null) && (!("".equals(line)))) {
System.out.println(line);
}
out.close();
in.close();
s.close();
} catch(Exception e) {
e.printStackTrace();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
После всех этих шагов, когда мой запрос AJAX отправлен, я получил эту ошибку с JAVA:
java.net.SocketException: Software caused connection abort: recv failed
И ошибка в моей веб-консоли (вкладка «Сеть») о том, что сертификат действителен только для домена:
*.mydomain.com, with error code SSL_ERROR_BAD_CERT_DOMAIN.
Я действительно застрял с этим, потому что я не знаю, что я делаю неправильно. Я думаю, что есть кое-что, что я неправильно понял с keyStore и trustStore, но не могу найти что.
Задача ещё не решена.
Других решений пока нет …