Я написал службу весенней загрузки с поддержкой SSL. Я хочу извлечь открытый ключ сертификата клиента из http-запроса при вызове службы.
Я пытаюсь с httpServletRequest.getAttribute("javax.servlet.request.X509Certificate");
который дает ноль.
Если я попробую httpServletRequest.getAttribute("javax.servlet.request.ssl_session_mgr");
Это дает мне SSLSession внутри объекта JSSESupport, который содержит локальный сертификат, но он является частным, и я не могу извлечь сертификат.
Ниже приведена моя конфигурация SSL (application.properties):
server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
Ниже приведен код клиента, который я написал для отправки сертификата в свое приложение:
public void testSeervice(){
char[] passphrase = "changeit".toCharArray(); //password
KeyStore keystore = KeyStore.getInstance("JKS");
//KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(new FileInputStream("D:\\Projects\\certvalidator\\src\\main\\resources\\ssl-server.jks"), passphrase); //path
//TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); //instance
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
SSLContext context = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
SSLSocketFactory sf = context.getSocketFactory();
URL url = new URL("https://localhost:8443/validate");
HttpsURLConnection httpsCon = (HttpsURLConnection) url.openConnection();
httpsCon.setSSLSocketFactory(sf);
httpsCon.setRequestMethod("GET");
System.out.println("Response Message is " + httpsCon.getResponseMessage());
}
Спасибо за ответ. Я хочу получить доступ к сертификату клиента. Я также попытался добавить KeyManageFactory, но все равно не смог получить сертификат клиента. 'KeyManager[] keyManagers = kmf.getKeyManagers(); context.init(keyManagers, trustManagers, null);'
Сначала вам нужно настроить сервер так, чтобы он требовал аутентификацию клиента. Посмотрите вокруг что-то вроде «нужна клиентская аутентификация» и передайте конфигурацию ssl на стороне сервера с помощью диспетчера доверия. Я не помню достаточно весенней загрузки наизусть, чтобы дать ответ, но это должно помочь вам начать.
Я бы посоветовал вам взглянуть на stackoverflow.com/questions/33808603/…
Да, согласно вашему комментарию, я пропустил настройку сервера для аутентификации клиента. Я настроил хранилище доверенных сертификатов и отправил действительное хранилище доверенных сертификатов через клиент. Теперь он работает, как ожидалось. Спасибо. ☺️




Насколько я помню,
.getAttribute("javax.servlet.request.X509Certificate")используется для доступа к сертификату клиент в случае двусторонней связи SSL. Представленный вами клиентский код не инициализируетKeyManagerFactory, что, как правило, доказывает, что вы используете односторонний SSL (только сервер «аутентифицирует» себя для клиента, в то время как сервер не запрашивает учетные данные для клиента). В таком сценарии.getAttribute("javax.servlet.request.X509Certificate")будет возвращать значение NULL, это нормально. Вы хотите вместо этого получить доступ к сертификату сервер?