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

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

Я использую последнюю версию 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 с -msg показывает, что сервер не запрашивает сертификат клиента.

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


person Paul    schedule 01.07.2014    source источник
comment
Вы пробовали установить SSLCACertificateFile или SSLCACertificatePath? Обычно они нужны вам при использовании аутентификации по сертификату клиента.   -  person Bruno    schedule 01.07.2014
comment
Позвольте мне попробовать их и посмотреть, работает ли это.   -  person Paul    schedule 01.07.2014
comment
Хорошо, вопрос ... Я использую прямой TLS / SSL в Tomcat / TomEE и не использую Apache или mod_ssl. Учитывая это, применимы ли эти два варианта?   -  person Paul    schedule 01.07.2014
comment
Да, вы используете протокол APR (Http11AprProtocol), поэтому вам следует обратиться к разделу APR в руководстве, который очень близок к параметрам mod_ssl (он даже ссылается на него).   -  person Bruno    schedule 02.07.2014
comment
Я добавил атрибут SSLCACertificateFile, указав его на двухуровневую цепочку сертификатов, и это не повлияло. :( Любые идеи?   -  person Paul    schedule 02.07.2014
comment
Обычно вам не нужна цепочка, просто набор сертификатов CA, которые вы готовы принять (хотя вы можете иметь промежуточные сертификаты, если хотите). Возможно, стоит попробовать без APR, напрямую с соединителями Java (вам нужно будет преобразовать ваш ключ + сертификат в хранилище ключей, PKCS12 может быть самым простым).   -  person Bruno    schedule 02.07.2014
comment
Я ищу такой же ответ. @ Пол, ты получил ответ?   -  person Pramod    schedule 31.08.2017


Ответы (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"
               />
person user2709937    schedule 02.08.2018