Редактировать: у меня была также эта "проблема", решение и объяснение которой находится внизу текста .
Казалось, что nginx не поддерживает промежуточные сертификаты.Мои сертификаты созданы самостоятельно: (RootCA самоподписан, IntrermediateCA1 подписан RootCA и т. Д.)
RootCA -> IntermediateCA1 -> Client1
RootCA -> IntermediateCA2 -> Client2
Я хочу использовать в nginx «IntermediateCA1», чтобы разрешить доступ к сайту только владельцу «Client1»«Certificate.
Когда я помещаю в файл« ssl_client_certificate »с IntermediateCA1 и RootCA и устанавливаю« ssl_verify_depth 2 »(или более), клиенты могут войти на сайт, используя сертификат Клиент1 и Клиент2 (должен только Клиент1).Тот же результат получается, когда я помещаю в файл "ssl_client_certificate" только RootCA - оба клиента могут войти в систему.
Когда я помещаю в файл "ssl_client_certificate" только IntermediateCA1 и установите "ssl_verify_depth 1" (или "2" или более - неважно), невозможно войти в систему, я получаю ошибку 400. И в режиме отладки я вижу журналы:
verify:0, error:20, depth:1, subject:"/C=PL/CN=IntermediateCA1/emailAddress=cert@asdf.com",issuer: "/C=PL/CN=RootCA/emailAddress=cert@asdf.com"
verify:0, error:27, depth:1, subject:"/C=PL/CN=IntermediateCA1/emailAddress=cert@asdf.com",issuer: "/C=PL/CN=RootCA/emailAddress=cert@asdf.com"
verify:1, error:27, depth:0, subject:"/C=PL/CN=Client1/emailAddress=cert@asdf.com",issuer: "/C=PL/CN=IntermediateCA1/emailAddress=cert@asdf.com"
(..)
client SSL certificate verify error: (27:certificate not trusted) while reading client request headers, (..)
Я вещьэто ошибкаПротестировано на Ubuntu, nginx 1.1.19 и 1.2.7-1 ~ dotdeb.1, openssl 1.0.1.Я вижу, что в nginx 1.3 есть еще несколько вариантов использования клиентских сертификатов, но я не вижу решения этой проблемы.
В настоящее время единственный способ разделить клиентов 1 и 2 - создать два самоподписанных RootCA,но это только обходной путь ..
Редактировать 1: Я сообщил об этой проблеме здесь: http://trac.nginx.org/nginx/ticket/301
Редактировать 2 " * Хорошо, это не ошибка, это особенность;) *
Я получаю ответ здесь: http://trac.nginx.org/nginx/ticket/301 Это работает , вы должны только проверить, чтоВаш ssl_client_i_dn - это (. Вместо эмитента вы можете использовать также тему сертификата или то, что вы хотите от http://wiki.nginx.org/HttpSslModule#Built-in_variables
. Так работает проверка сертификата: сертификат должен быть проверен до доверенного корня.Если цепочка не может быть построена для доверенного корня (не промежуточного) - проверка не пройдена. Если вы доверяете корню - все сертификаты, подписанные им, прямо или косвенно, будут успешно проверены.
Ограничение глубины проверки может бытьиспользуется, если вы хотите ограничить клиента• Сертификаты только для непосредственно выданных сертификатов, но это больше о предотвращении DoS, и, очевидно, его нельзя использовать для ограничения проверки только промежуточным1 (но не промежуточным2).
Здесь вам нужен слой авторизации , основанный на результатах проверки - то есть вы можете захотеть проверить, что издатель сертификата клиента является промежуточным1.Простейшим решением было бы отклонить запросы, если DN эмитента не совпадает с разрешенным, например, что-то вроде этого (полностью не проверено):
[Отредактируйте мной, он корректно работает в моей конфигурации]
server {
listen 443 ssl;
ssl_certificate ...
ssl_certificate_key ...
ssl_client_certificate /path/to/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
if ($ssl_client_i_dn != "/C=PL/CN=IntermediateCA1/emailAddress=cert@asdf.com") {
return 403;
}
}