ServletRequest.getAttribute(«javax.servlet.request.X509Certificate») возвращает значение null

#ssl #openssl #x509certificate #apache-tomee

#ssl #openssl ( открытый ) #x509certificate #апачи-томи #openssl #apache-tomee

Вопрос:

У меня проблема с остановкой доставки, которая сводит меня с ума. Я надеюсь, что кто-нибудь из вас, экспертов, сможет помочь.

Я использую последнюю версию TomEE (1.6.0.2) и последнюю версию Java 8 (сборка 1.8.0_05-b13). Независимо от того, что я пытаюсь, следующая строка кода в моем HttpServlet всегда возвращает null.

 X509Certificate certs[] = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
  

Изначально я предположил, что неправильно указал имя атрибута, поэтому, чтобы диагностировать проблему, я решил взглянуть на полный список атрибутов, используя следующее:

 Enumeration<String> enums = request.getAttributeNames();
  

Однако это показало мне только два атрибута: один для набора шифров, а другой для силы ключа.

Я прочитал другие статьи и убедился, что мой соединитель был правильным и что у него был правильно установлен атрибут clientAuth. Вот соединитель:

 <Connector port="4449" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="true" sslProtocol="TLSv1.2"
           SSLCertificateFile="/etc/unipagos/certs/pay.crt"
           SSLCertificateKeyFile="/etc/unipagos/certs/pay.key"
           SSLVerifyClient="required"
           SSLHonorCipherOrder="true"
           ciphers="TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"/>
  

Соединение, похоже, работает, однако использование openssl s_client with -msg показывает, что сервер не запрашивает сертификат клиента.

Почему сервер не запрашивает сертификат клиента? Что я делаю не так?

Комментарии:

1. Вы пытались установить SSLCACertificateFile или SSLCACertificatePath ? Обычно они требуются при использовании аутентификации по сертификату клиента.

2. Позвольте мне попробовать их и посмотреть, работает ли это.

3. Ладно, вопрос… Я использую прямой TLS / SSL в Tomcat / TomEE и не использую Apache или mod_ssl. Учитывая это, по-прежнему ли применимы эти два варианта?

4. Да, вы используете протокол APR ( Http11AprProtocol ), поэтому вам следует обратиться к разделу APR руководства, который очень близок к mod_ssl параметрам (он даже ссылается на него).

5. Я добавил SSLCACertificateFile атрибут, указав его на двухуровневую цепочку сертификатов, и это не возымело никакого эффекта. 🙁 Есть идеи?

Ответ №1:

У меня есть рабочая конфигурация соединителя для tomee, и сервер запрашивает сертификат клиента. вы можете попробовать

 <Connector port="7443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                SSLProtocol="TLSv1.2"
                SSLVerifyClient="require"
                SSLCertificateFile="/opt/_cdrom_apache/certs/ec-dev-apr.pem"
                SSLCertificateKeyFile="/opt/_cdrom_apache/certs/ec-dev.key"
                SSLCACertificateFile="/opt/_cdrom_apache/certs/CA.pem"
               />