Не удалось получить сертификат в HttpServletRequest - httpServletRequest.getAttribute("javax.servlet.request.X509Certificate") дает ноль

Я написал службу весенней загрузки с поддержкой 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());

}

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

GPI 22.01.2019 17:58

Спасибо за ответ. Я хочу получить доступ к сертификату клиента. Я также попытался добавить KeyManageFactory, но все равно не смог получить сертификат клиента. 'KeyManager[] keyManagers = kmf.getKeyManagers(); context.init(keyManagers, trustManagers, null);'

Lalit Thakare 22.01.2019 18:07

Сначала вам нужно настроить сервер так, чтобы он требовал аутентификацию клиента. Посмотрите вокруг что-то вроде «нужна клиентская аутентификация» и передайте конфигурацию ssl на стороне сервера с помощью диспетчера доверия. Я не помню достаточно весенней загрузки наизусть, чтобы дать ответ, но это должно помочь вам начать.

GPI 22.01.2019 18:56

Я бы посоветовал вам взглянуть на stackoverflow.com/questions/33808603/…

GPI 23.01.2019 11:47

Да, согласно вашему комментарию, я пропустил настройку сервера для аутентификации клиента. Я настроил хранилище доверенных сертификатов и отправил действительное хранилище доверенных сертификатов через клиент. Теперь он работает, как ожидалось. Спасибо. ☺️

Lalit Thakare 23.01.2019 11:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
1 796
0

Другие вопросы по теме