Friday, January 29, 2010

CollabNet Subversion + SSL (Windows)

Хоть блог про какой-то непонятный .net, первый пост будет о svn.

Исходные данные: установленный и работающий под Windows CollabNet Subversion.
Задача: включить ssl и авторизацию с помощью клиентских сертификатов.

В интернете масса информации, как это делается, но каждый раз, когда я возвращаюсь к этому вопросу, ни один найденный FAQ не работает, а я уже все и позабыл, да и какой-то текстовый файлик, в котором я когда-то делал пометки как-чего, потерялся.
Так что напишу всё тут.
Кстати, есть один очень хороший FAQ, вот тут, но под линух, и вот если выполнить всё по пунктам - не работает.

В инструкции считается, что CollabNet Subversion установлен в директорию c:\Program Files\CollabNet\Subversion Server\

1. Открываем коммандную строку и переходим в директорию c:\Program Files\CollabNet\Subversion Server\httpd\conf
2. Создаём собственный доверенный сертификат - Certificate Authority

Выполняем
"c:\Program Files\CollabNet\Subversion
Server\httpd\bin\openssl.exe" req -new -newkey rsa:1024 -nodes -k
eyout ca.key -x509 -days 1000
-subj/C=RU/ST=Msk/L=Msk/CN=bla/emailAddress=yourmail@gmail.com
-out ca.crt -config openssl.cnf

Если в результате получили ошибку следующего вида
error on line -1 of c:\Program Files\CollabNet Subversion
Server\httpd\conf\open
ssl.cnf 2828:error:02001003:system library:fopen:No suchprocess:.\crypto\bio\bss_file.c
:126:fopen('c:\Program Files\CollabNet SubversionServer\httpd\conf\openssl.cnf','rb')
2828:error:2006D080:BIO routines:BIO_new_file:no such file:.\crypto\bio\bss_file.c:129:
2828:error:0E078072:configuration file routines:DEF_LOAD:no such file:.\crypto\conf\conf_def.c:197:
Играйтесь с дирректориями, причина - процедура не может найти файл openssl.conf
После выполнения команды в папке c:\Program Files\CollabNet\Subversion Server\httpd\conf появится 2 файла: ca.key и ca.crt
3. Генерируем клиентские сертификаты
3.1 Создаём запрос на создание клиентского сертификата.
Выполняем
"c:\Program Files\CollabNet\Subversion Server\httpd\bin\openssl.exe" req -new -newkey rsa:1024 -nodes -k eyout client01.key -subj /C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=grendaizer/emailAddress=semkaa@gmail.com -out client01.csr -config openssl.cnf

Если в результате получили ошибку следующего вида
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.++++++
.++++++
writing new private key to 'client01.
unable to find 'distinguished_name' in config
problems making Certificate Request
3700:error:0E06D06C:configuration file
routines:NCONF_get_string:no value:.\cryp
to\conf\conf_lib.c:329:group=req name=distinguished_name
Опять играйтесь с дирректориями, процедура не может найти файл openssl.conf
После выполнения команды в папке c:\Program Files\CollabNet\Subversion Server\httpd\conf появится 2 файла: client01.key и client01.csr

3.2 Подписываем запрос, созданный в пункте 3.1
3.2.1 Выполняем группу комманд для создания директорий и файлов, описанных в графе [CA] конфигурационного файла openssl.cnf
mkdir demoCA
mkdir demoCA\certs
mkdir demoCA\crl
mkdir demoCA\newcerts
copy con demoCA\index.txt /Y - нажмите Ctrl+Z, нажмите Enter
copy con demoCA\serial /Y - нажмите Ctrl+Z, нажмите Enter
copy con demoCA\crlnumber /Y - нажмите Ctrl+Z, нажмите Enter
echo 01 > demoCA\serial

3.2.2 Правим файл openssl.cnf
В разделе [ CA_default ]
certificate = ca.crt
private_key = ca.key
В разделе [ policy_match ]
organizationName = optional

3.2.3 Выполняем
"c:\Program Files\CollabNet\Subversion Server\httpd\bin\openssl.exe"
ca -config openssl.cnf -in client01
.csr -out client01.crt -batch
Возможные ошибки:
1. wrong number of fields on line 1 (looking for field 6, got 1, '' left) - файл index.txt не пустой
После выполнения команды появится файл client01.crt.
Это клиентский сертификат, по умолчанию он действителен год от даты создания.
Мне сейчас лень искать параметры, отвечающие за период валидности сертификати, да и когда его срок истечет, по идее, ничего с доступом не случиться (кстати, а как сделать так, чтобы доступ закрылся?).
Ну и если будет желание перееиздать клиентский сертификат через год, тут надо будет почитать как работать с базой данных сертификатов (в openssl.exe я нашёл только параметр -updatedb).

4. Созданный сертификат надо передать клиенту.
Можно или обычными методами, или же упаковать его, защитив паролем (меняйте параметр pass)
"c:\Program Files\CollabNet\Subversion Server\httpd\bin\openssl.exe" pkcs12 -export -in client01.crt -in
key client01.key -certfile ca.crt -out client01.p12 -passout pass:111111

В результате будет создан файл client01.p12 который необходимо передать клиенту.

5. Конфигурация CollabNET Subversion для работы с ssl.
5.1 Правим файл httpd.conf
1. Убрать символ # в строке #LoadModule ssl_module modules/mod_ssl.so
2. В строке ServerName localhost:80 меняем порт на 443 - ServerName localhost:443
3. Убрать символ # в строке #Include conf/extra/httpd-ssl.conf
4. В директиву добавляем следующие строки:
SSLCACertificateFile "c:\Program Files\CollabNet\Subversion Server\httpd\conf\ca.crt"
SSLVerifyClient require
SSLRequireSSL
5.2 Редактируем файл httpd-ssl.conf (папка extra)
В директиве VirtualHost, если необходимо, правим значения следующих параметров:
1. ServerName
2. ServerAdmin
3. ErrorLog
4. TransferLog
5. DocumentRoot - выставить аналогично файлу httpd.conf
Выставить значения следующих параметров:
1. SSLCertificateFile - указываем путь к ca.crt ("c:\Program Files\CollabNet\Subversion Server\httpd\conf\ca.crt")
2. SSLCertificateKeyFile - указываем путь к ca.key ("c:\Program Files\CollabNet\Subversion Server\httpd\conf\ca.key")
3. CustomLog - выставить реальный путь, а то при запуске сервиса будет ругаться
4. SSLVerifyClient require - разкомментарить

Запускаем сервис CollabNetSubversionApache.