В конце концов, я пишу здесь, потому что я плохо борюсь с apache, SSL / TLS и аутентификацией сертификата клиента, которая должна использовать серийный номер сертификата для ограничения доступа к определенному вызову API.
лучше пояснить некоторые детали:
Пользователь должен иметь доступ:
https: // {host} / apiv3xx / s? test без каких-либо проблем и ограничений, но для следующего URL:
https: // {хост} / apiv3xx / x? action = login & user = blablabla для выполнения звонка требуется сертификат клиента. Думал реализовать следующее решение:
<Location /apiv3xx>
SetEnv api 1
SSLOptions +StdEnvVars -ExportCertData
SSLVerifyClient optional
SSLVerifyDepth 10
</Location>
и, кроме того, некоторые правила перезаписи для управления логикой:
RewriteCond %{REQUEST_URI} ^/apiv3xx/ [NC]
RewriteCond %{QUERY_STRING} action=log([^&]*)?(?=&|$) [NC,OR]
RewriteCond %{QUERY_STRING} action=adm([^&]*)?(?=&|$) [NC,OR]
RewriteCond %{QUERY_STRING} action=ctc([^&]*)?(?=&|$) [NC]
RewriteCond %{SSL:SSL_CLIENT_M_SERIAL} !(01000000000140AAD72ACCXXXXXX|02000000000140BAD37F1XXXXXXX)
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$
RewriteRule (.*) - [F,L]
Итак ... моя проблема сейчас проста: я не получаю серийный номер из запроса и, по логике, Условия не выполняются.
Я много дней бродил по Интернету в поисках решения и нашел только этот старый статья (из которого я в конце концов вычитаю свое решение), но оно кажется бесполезным.
Запишите сеанс SSL с помощью WireShark, затем проверьте протокол SSL ALERT. Это поможет вам разобраться в переговорах. Включите отладку SSL на сервере apache. Убедитесь, что сервер Apache запрашивает у клиента повторное согласование сеанса и что клиент отправляет сертификат. При необходимости вы также можете расшифровать сеанс, если у вас есть ключ RSA и сертификат сервера.
Также на клиенте вы должны сделать доверенным сервер. В противном случае клиент не отправит сертификат.
Также обратите внимание, что протокол SSL / TLS был изменен из-за ошибки повторного согласования. Клиенты и серверы, использующие разные версии протокола, несовместимы. Видеть: CVE-2009-3555
Возможно, вам потребуется включить:
SSLOptions +OptRenegotiate