Я хочу, чтобы мой веб-сервер Apache принимал SSL-соединения, ТОЛЬКО ЕСЛИ клиент представляет себя с определенным клиентским сертификатом SSL. Другими словами, разрешен только ОДИН клиент, и он ДОЛЖЕН использовать определенный клиентский сертификат (который у меня тоже есть).
Этот сертификат клиента (назовем его «MyClientCertificate») является обычным сертификатом PEM, выпущенным центром сертификации (назовем это "MyCA"), для которого у меня, в свою очередь, есть его сертификат.
Вот как я настроил свой виртуальный хост Apache для этой цели (я сообщаю только о параметрах, связанных с проверкой клиента SSL):
SSLVerifyClient require
SSLCACertificatePath /etc/ssl/certs
SSLCACertificateFile /etc/ssl/client/MyClientCertificate.pem
SSLCADNRequestFile /etc/ssl/client/MyClientCertificate.pem
SSLVerifyDepth 1
Пояснения из вариантов (или, по крайней мере, из моих намерений ...):
Это похоже сработало: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставлен, и принимает его, если он есть.m добавляя сертификат MyClientCertificate в список сертификатов CA в / etc / ssl / certs, как доверенный сертификат сам по себе, и с помощью SSLCADNRequestFile я говорю, что мой сервер должен запрашивать только этот сертификат (и только он) клиенту, не весь список сертификатов CA в SSLCACertificatePath + SSLCACertificateFile
Это казалось для работы: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставлен, и принимает его, если он есть.m добавляя сертификат MyClientCertificate в список сертификатов CA в / etc / ssl / certs, как доверенный сертификат сам по себе, и с помощью SSLCADNRequestFile я говорю, что мой сервер должен запрашивать только этот сертификат (и только он) клиенту, не весь список сертификатов CA в SSLCACertificatePath + SSLCACertificateFile
Это казалось для работы: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставлен, и принимает его, если он есть.я говорю, что мой сервер должен запрашивать у клиента только этот сертификат (и только его), а не весь список сертификатов CA в SSLCACertificatePath + SSLCACertificateFile
Казалось, что это сработало: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставлен, и принимает его, если он есть.я говорю, что мой сервер должен запрашивать у клиента только этот сертификат (и только его), а не весь список сертификатов CA в SSLCACertificatePath + SSLCACertificateFile
Казалось, что это сработало: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставлен, и принимает его, если он есть.m, говоря, что разрешенный сертификат клиента подписан ЦС, который входит в число тех, которые распознаются сервером (в SSLCACertificatePath)
Это похоже сработало: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставляется и примите это, если это так.m, говоря, что разрешенный сертификат клиента подписан ЦС, который входит в число тех, которые распознаются сервером (в SSLCACertificatePath)
Это похоже сработало: Apache требует сертификат клиента, отклоняет соединение, если указанный сертификат клиента не предоставляется и примите это, если это так. Однако недавно клиент (который является для меня поставщиком) решил сменить свой сертификат клиента на новый (назовем его MyNewClientCertificate.pem) с 2048-битным шифрованием вместо 1024-битной глубины старого. Проблема заключается в следующем:
Новый сертификат выдается тем же ЦС, что и старый. Поставщик предполагает, что моя конфигурация Apache, вероятно, принимает все подключения от клиентов, которые представляют сертификат, выданный этим ЦС, вместо того, чтобы выполнять сопоставление с самим сертификатом клиента.
Если это так, то что я делаю неправильно в моем конфигурация? Следует ли мне снизить SSLVerifyDepth до 0? (но разве это не говорит о том, что сертификат должен быть самоподписанным?) Или мне нужно что-то изменить в директивах SSLCACertificateFile / SSLCADNRequestFile?
Поскольку эта система находится в производстве, у меня нет возможности выполнять все тесты, которые я могу придумать, но я должен попытаться внести целенаправленные изменения, чтобы получить правильный результат как можно быстрее. Вот почему я был бы признателен за любую помощь по этой теме.
Вы можете сопоставить конкретный сертификат клиента, используя директиву SSLRequire
для сопоставления с полным DN субъекта или только с частью CN из сертификата клиента:
SSLRequire %{SSL_CLIENT_S_DN} eq "C=AU, ST=Some-State, L=Springfield, O=ServerFault.com, OU=Moderators, CN=HBruijn/emailAddress=hbruijn@serverfault.com"
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "HBruijn/emailAddress=hbruijn@serverfault.com"
Используйте openssl x509 -in client.crt -text
для отображения строки темы.
Более полная конфигурация будет выглядеть так:
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/emailAddress=hbruijn@serverfault.com"
</Directory>