Я использую Nginx с uWSGI для обслуживания Mercurial; он выполняет базовую аутентификацию через SSL (Nginx является терминатором SSL; он не передается Hg), но из-за ограниченной безопасности базовой аутентификации даже через SSL, как обсуждалось в разных местах, включая этот сайт, я хочу разрешить пользователи также могут подключаться к клиентским сертификатам, что, например, поддерживает TortoiseHg.
ssl_verify_client optional;
...
map $ssl_client_s_dn $ssl_client_s_dn_cn
{
default "";
~/CN=(?<CN>[^/]+) $CN;
};
...
location /
{
uwsgi_pass unix:/run/uwsgi/app/hgweb/socket;
include uwsgi_params;
uwsgi_param SERVER_ADDR $server_addr;
uwsgi_param REMOTE_USER $ssl_client_s_dn_cn;
#uwsgi_param REMOTE_USER $remote_user;
#auth_basic "Mercurial repositories";
#auth_basic_user_file /srv/hg/.htpasswd;
}
Поэтому я рассматриваю CN как имя пользователя. Но как мне сделать откат к базовой аутентификации, когда нет сертификата клиента (и предпочтительно нет, когда сертификат есть, но его проверка не удалась — в этом случае просто ошибка)? В найденном мной примере это достигается за счет того, что отдельный блок сервера прослушивает другой порт, чего я хочу избежать: https://github.com/winne27/nginx-cert-and-basic-auth/blob/master/nginx-example.conf
Кроме того, в некоторых примерах я видел следующие проверки в location
; они необходимы? if ($ssl_client_verify != SUCCESS) { return 496; }
if ($ssl_client_s_dn_cn !~ "^[a-z0-9]{1,10}$") { return 496; }
Учитывая http://wiki.nginx.org/IfIsEvil, я решил, что лучше не использовать if
.
if
. И если вы собираетесь добавить это в свой серверный блок:if ($ssl_client_verify != SUCCESS) { return 496; }
рассмотрите возможность использованияssl_verify_client on;
вместо необязательных. - person Capilé   schedule 25.05.2015