Обеспечение проверки клиента в Apache только для конкретного клиентского certificateа

Я хочу, чтобы мой веб-server Apache принимал SSL-соединения ТОЛЬКО, ЕСЛИ клиент представляет собой специальный certificate клиента SSL. Другими словами, разрешен только один клиент, и он ДОЛЖЕН использовать конкретный клиентский certificate (который у меня также есть).

Этот certificate клиента (назовем его «MyClientCertificate») является обычным certificateом PEM, выпущенным CA (назовем его «MyCA»), для которого у меня также есть его certificate.

Вот как я настроил свой виртуальный хост Apache для этой цели (я сообщаю только parameters, связанные с проверкой клиента SSL):

SSLVerifyClient require SSLCACertificatePath /etc/ssl/certs SSLCACertificateFile /etc/ssl/client/MyClientCertificate.pem SSLCADNRequestFile /etc/ssl/client/MyClientCertificate.pem SSLVerifyDepth 1 

Объяснения вариантов (или моих намерений хотя бы …):

  • с «SSLVerifyClient require» Я принуждаю Apache всегда выполнять проверку клиента и отклонять connection, если он не работает
  • / etc / ssl / certs содержит certificateы PEM MyCA (правильно установленные в системе с требуемым processом hashирования + symlinking), если те из всех известных CA могут Apache распознать
  • с SSLCACertificateFile Я добавляю certificate MyClientCertificate в list certificateов CA в / etc / ssl / certs, как доверенный certificate сам по себе, и с SSLCADNRequestFile Я говорю, что мой server должен requestить только этот certificate (и только это) для клиента, а не весь list certificateов CA в SSLCACertificatePath + SSLCACertificateFile
  • с «SSLVerifyDepth 1» Я говорю, что разрешенный certificate клиента подписывается центром сертификации, который среди тех, кто распознается serverом (в SSLCACertificatePath)

Это, похоже, сработало: Apache требует certificateа клиента, отказывается от соединения, если указанный certificate клиента не предоставляется и принимает его, если он есть. Однако недавно клиент (поставщик для меня) решил изменить свой клиентский certificate с новым (назовем его MyNewClientCertificate.pem) с 2048-битным encryptionм вместо 1024-битной глубины старого. Проблема заkeyается в следующем:

  • поставщик говорит, что он изменил свой клиентский certificate и что теперь он использует новый certificate для аутентификации
  • поставщик уверенно заявляет, что представляет собой JUST новый certificate, а не как новый, так и старый
  • Я еще не изменил свою конфигурацию Apache (следовательно, мой Apache по-прежнему настроен на request старого certificateа)
  • НО мой Apache принимает клиентские подkeyения поставщика без каких-либо проблем! Я бы ожидал, что он начless сбой, пока я не изmenu его конфигурацию, чтобы replace ссылки MyClientCertificate.pem с MyNewClientCertificate.pem

Новый certificate выдается одним и тем же CA старого. Поставщик предлагает, что моя configuration Apache, вероятно, принимает все подkeyения от клиентов, которые представляют certificate, выданный этим ЦС, вместо того, чтобы выполнять совпадение с самим certificateом клиента.

Если это так, что я делаю неправильно в своей конфигурации? Должен ли я снизить значение SSLVerifyDepth до 0? (но разве это не означает, что certificate должен быть подписан сам по себе?) Или мне нужно что-то изменить в директивах SSLCACertificateFile / SSLCADNRequestFile?

Поскольку эта система находится в processе производства, у меня less возможности выполнять все тесты, о которых я могу думать, но я должен попытаться сделать целенаправленные изменения, чтобы как можно быстрее get правильный результат. Вот почему я был бы признателен за любую помощь по этой теме.

Вы можете сопоставить определенный клиентский certificate, используя директиву SSLRequire чтобы соответствовать полному SSLRequire Subject или только части CN из certificateа клиента:

 SSLRequire %{SSL_CLIENT_S_DN} eq "C=AU, ST=Some-State, L=Springfield, O=ServerFault.com, OU=Moderators, CN=HBruijn/[email protected]" SSLRequire %{SSL_CLIENT_S_DN_CN} eq "HBruijn/[email protected]" 

Используйте openssl x509 -in client.crt -text чтобы отобразить строку Subject.

Более полная configuration будет:

 SSLVerifyClient none SSLCACertificateFile conf/ssl.crt/ca.crt SSLCACertificatePath conf/ssl.crt <Directory /usr/local/apache2/htdocs/secure/area> SSLVerifyClient require SSLVerifyDepth 5 SSLOptions +FakeBasicAuth SSLRequireSSL SSLRequire %{SSL_CLIENT_S_DN_CN} eq "HBruijn/[email protected]" </Directory> 
  • Почему у меня возникают проблемы с просмотром веб-websiteов HTTPS только с использованием Chrome только в сети моего работодателя?
  • Отсутствует значок «Сертификаты serverа» в IIS8
  • Значение строки ssl_ciphers на nginx.conf
  • SSLRequire множественная validation OU
  • Подстановочный знак * .localhost SSL с Nginx и Chrome
  • Перемещение serverов и IP-адресов изменится. Должны ли быть повторно выпущены и установлены certificateы SSL?
  • Сертификат SSL для Starfield Wildcard не надежен во всех browserах
  • Как восстановить certificate из резервной копии
  • «SSL_ERROR_INTERNAL_ERROR_ALERT» Использование Let's Encrypt & Nginx
  • http-трафик, показывающий другую директорию, чем https-трафик на apache
  • Ошибки SSL-certificateа для определенных browserов. Как узнать, какие функции SSL не поддерживаются старыми browserами, на которых основан мой website?
  • Давайте будем гением компьютера.