#java #java-8 #keystore
#java #java-8 #хранилище ключей
Вопрос:
Я использую eclipse и при попытке выполнить эту функцию получаю сообщение об ошибке ниже.
Я хочу отправить запрос GET вместе с сертификатом и ключом. Я могу загрузить сертификат в любом формате, так что это не проблема. Я знаю, что мне нужно добавить это в java keystone, но после попытки различных предложений я все еще не могу это исправить.
public String sendGET(String GET_URL, String authStringEnc) throws IOException {
try {
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("src/com/resources/ece-cyberark-cert.jks");
ks.load(fis, "5<@7wBj[Ht()~GRf".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "5<@7wBj[Ht()~GRf".toCharArray());
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
URL obj = new URL(GET_URL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
if (con instanceof HttpsURLConnection) {
((HttpsURLConnection)con)
.setSSLSocketFactory(sc.getSocketFactory());
}
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Authorization", "Basic " authStringEnc);
con.setRequestProperty("Content-Type", "application/json");
int responseCode = con.getResponseCode();
System.out.println("GET Response Code :: " responseCode " :: " GET_URL);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
con.disconnect();
// print result
return response.toString();
} else {
// return failed requests response code
return "GET request not worked :: GET Response Code :: " responseCode " :: GET_URL";
}
} catch (Exception e) {
e.printStackTrace();
return "Exceptionn";
}
}
Ниже приведена ошибка —
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:1946)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
Комментарии:
1. Вы инициализируете свой контекст SSL с помощью keymanager, но не с помощью доверительного менеджера. Менеджер ключей полезен, если вам нужно аутентифицировать вас (клиента) на сервере. Но здесь проблема возникает раньше, когда вы (клиент) пытаетесь аутентифицировать сервер (ваше исключение показывает это). Попробуйте загрузить сертификат сервера как доверенную запись в хранилище ключей, которое используется для создания TrustManager (второй аргумент SSLContext#init()).
2. даже после добавления сертификата с использованием импорта инструмента sudo key я все еще получаю ту же ошибку
Ответ №1:
Менеджеры ключей используются для аутентификации вас, HTTP-клиента, на HTTP-сервере. Но сначала для аутентификации сервера используются доверенные менеджеры. Если сертификат сервера не является доверенным в соответствии с «привязками доверия» среды выполнения по умолчанию, вам необходимо явно указать правильный корневой сертификат.
KeyStore trusted = ...; /* Initialize a trust store containing the non-standard CA. */
TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
tmf.init(trusted);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
...
Если вы не собираетесь использовать проверку подлинности клиента TLS, вам следует удалить всю KeyManager
связанную инициализацию.