Назад | Перейти на главную страницу

Аутентификация клиента Apache: браузер не отправляет сертификат, когда имя CA не соответствует регистру?

Используя Apache 2.4.

У нас есть два действительных сертификата CA, отличительные имена которых отличаются только регистром одного символа (скажем, CA1 с dn: cn = MyCA, O = myOrg и CA2 с dn: cn = MyCA, O = MyOrg).

Эти два сертификата находятся в файле, на который ссылается SSLCACertificateFile Директива Apache, поскольку нам необходимо аутентифицировать сертификаты клиентов, подписанные обоими центрами сертификации. Этого не происходит: доступ могут получить только браузеры с клиентскими сертификатами, подписанными CA1 или CA2, в зависимости от порядка сертификатов CA в файле. Итак, если только клиенты из CA1 могут аутентифицироваться, после переключения порядка в SSLCACertificateFile и перезагрузки Apache только клиенты из CA2 смогут аутентифицироваться.

Если мы выполним рукопожатие SSL openssl s_client -connect <server>:<port> -prexit, мы замечаем, что только одно из отличительных имен CA отправляется в списке принятых CA, а отправляемый dn зависит от порядка, в котором сертификаты CA находятся в SSLCACertificateFile. Это имеет смысл, поскольку вычисляемый хеш Openssl для двух выделенных имен одинаков, поскольку выделенные имена не должны быть чувствительны к регистру.

Но похоже, что браузер выполняет сопоставление с учетом регистра, вместо этого, поскольку в журналах Apache сертификат, установленный в браузере, не отправляется, когда «объявленный CA» - это CA1, а сертификат клиента подписан CA2, и наоборот. . Мы пробовали использовать Firefox в Windows и Linux, а также Internet Explorer и Chrome в Windows.

В противном случае браузер командной строки curl не имеет этой проблемы, когда мы вызываем URL-адрес https с сертификатом клиента и ключом в формате PEM.

Я бы сказал, что, не копаясь, вы не можете убедить браузеры выполнять здесь поиск без учета регистра. В случае простой веб-службы вы можете создать еще один VirtualHost, в котором распределены все клиенты (скажем, https://detect-cert.example.com).

Это будет означать, что клиент согласовывает TLS один раз, затем у него есть перенаправление, а затем еще одно согласование TLS.

VirtualHost detect-cert.example.com:

  • убедитесь, что вы принимаете optional_no_ca сертификаты из браузеров
  • нет SSLCACertificateFile
  • посмотрите на либо SSL_CLIENT_I_DN или SSL_CLIENT_CERT_CHAIN_<n> переменная окружения
  • перенаправить (HTTP 302) браузер на любой ca1clients.example.com или ca2clients.example.com

VirtualHost ca1clients.example.com:

  • убедись, что ты require сертификаты из браузеров
  • SSLCACertificateFile CA_lowercase.pem

VirtualHost ca2clients.example.com:

  • убедись, что ты require
  • SSLCACertificateFile CA_uppercase.pem

Но ваше веб-приложение должно поддерживать два доменные имена в то же время (например, через X-Forwarded-Host заголовок). Он никогда не должен сообщать браузеру, который вошел через ca2clients.example.com повторно войти через ca1clients.example.com. Еще одна трудность заключается в том, что пользователи обмениваются ссылками между собой (например, отправляют по электронной почте ссылки на некоторый контент).