В связи с этим, были произведены некоторые изменения в конфигах Apache:
- Были прописаны сертификаты
- По умолчанию прописанный Location, я заменил на Directory, добавив два параметра
Параметр SSLVerifyClient optional позволяет не обязательно использовать сертификат. При таком подходе, при установлении соединения с Apache, браузер будет предлагать использовать сертификат. И, если последний не установлен, разрешит работать без него.<VirtualHost *:443> DocumentRoot /var/hg/ SSLEngine on SSLCertificateFile /etc/apache2/ssl/file.cert SSLCertificateKeyFile /etc/apache2/ssl/file.key SSLCACertificateFile /etc/apache2/ssl/file.cert SSLCARevocationFile /etc/apache2/ssl/file.crl WSGIScriptAlias / /var/hg/hgweb.wsgi <Directory> AuthType Basic AuthName "Mercurial repositories" AuthUserFile /var/hg/hgusers Require valid-user SSLVerifyClient optional SSLOptions +FakeBasicAuth </Directory> </VirtualHost>
Параметр SSLOptions +FakeBasicAuth эмулирует базовую аутентификацию Апача, реализуемую обычно посредством файлов типа htpasswd. В этом случае, файл все-таки будет использоваться, только вместо имени пользователя, надо хранить в файле параметры, зашитые в сертификат при его создании. Получить требуемую строку можно командой:
openssl x509 -noout -subject -in /etc/apache2/ssl/client-certs/client_certificate_1.crt
Результат работы команды будет примерно такой:
subject= /C=RU/ST=Moscow/L=Kolomna/O=pc-mania/OU=IT/CN=pc-mania/emailAddress=user@domain.org
Все, что будет после subject= и есть требуемая строка.
Далее надо зашить эту строку в файл /var/hg/hgusers, прописанный у нас в конфиге. Зашивать надо так:
/C=RU/ST=Moscow/L=Kolomna/O=pc-mania/OU=IT/CN=pc-mania/emailAddress=user@domain.org:xxj31ZMTZzkVA
То есть, берем эту строку, вставляем ее в новую строчку файла, ставим после двоеточие и добавляем xxj31ZMTZzkVA. Последнее удивительное сочетание символов есть ни что иное, как md5 от слова password. Это, по всей видимости, константа, так как к паролю, собственно, сертификата не имеет никакого отношения.
При этом, по-прежнему, можно в этом файле использовать стандартные пароли типа
user:xxj31ZMTZzkVA
Пользователи смогут войти на сайт по простому паролю, а также, при помощи сертификата, не вводя пароль.
Осталось только настроить клиент Mercurial-а, чтобы он передавал эти данные серверу:
Ищем файл mercurial.ini. В Windows 7 он располагается по пути примерно такому: c:\users\пользователь\mercurial.ini. У меня такого файла не было - пришлось создавать.
[auth] rep1.prefix = secure.example.org rep1.key = path/to/file.key rep1.cert = path/to/file.cert rep1.schemes = https
В примере:
- rep1 - наименование репозитория. Используется только для того, чтобы объединить несколько параметров в одну группу, если надо прописать несколько репозиториев сразу.
- prefix - адрес сервера, хранящего репозиторий.
- key - путь к приватному пользовательскому ключу
- cert - путь к пользовательскому сертификату