quinta-feira, 24 de setembro de 2009

Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 4)

1. Overview

Trac é uma simples ferramenta, open source e de interface web para controle de mudanças em projetos de desenvolvimento de software. O objetivo do software é ajudar o desenvolvedor a rastrear essas mudanças, entender o porquê de cada uma e qual o seu impacto no projeto como um todo.

A finalidade desse documento não é falar sobre os recursos e funcionalidades da ferramenta (onde maiores detalhes podem ser encontrados no link http://pt.wikipedia.org/wiki/Trac), mas descrever o passo-a-passo necessário para instalar essa magnífica ferramenta e integrá-la com o repositório do subversion e ao VisualSVN Server.

No site official do VisualSVN (http://www.visualsvn.com/server/trac) é disponibilizado uma versão pré-configurada do Trac juntamente como o passo-a-passo necessário para integrá-lo ao VisualSVN Server. No entanto, apesar desse caminho ser relativamente mais simples, é provável haver situações que você necessite realizar upgrades, acréscimo/remoção de plugins, migração de banco de dados e outras tarefas que exigirá um conhecimento maior sobre o processo, os componentes instalados e suas funcionalidades.

Pensando nisso, esse documento não usará de atalhos ou simplificações e o passo-a-passo da instalação e integração da ferramenta Trac será detalhado de uma forma completa, descrevendo as razões para as respectivas escolhas.


2. Considerações
 
A ferramenta Trac foi desenvolvida na linguagem de programação Python e conta com uma gama variada de plugins. Os plugins também são desenvolvidos em Python. No entanto, é comum um determinado plugin suportar uma ou outra versão do Python, limitando seu uso.
 
Além disso, muitos plugins também só podem ser integrados a versões específicas do Trac.

Antes de iniciar a instalação dos softwares requisitos, é importante avaliar quais os plugins deseja instalar ao Trac de forma a escolher adequadamente a versão do Python e de outros softwares requisitos.


Passo 1 – Instalação do Python
 
A versão atual do Trac (0.11.5) requer a versão 2.3 até 2.6 do Python. A recomendação aqui é utilizar a versão 2.5 devido à maior compatibilidade e suporte por parte dos plugins e drivers.
 
Apesar de esse documento utilizar tal versão, novamente destaco a importância de avaliar a compatibilidade exigida pelos demais softwares/plugins que serão integrados.

Mais especificamente falando, será usado a versão 2.5 em vez da 2.5.4 (mais recente) porque um dos drivers necessários (mod_python 3.3.1) está, atualmente, disponível para tal release. Essa questão será novamente abordada em outro tópico.

A instalação pode ser baixada através do link: http://www.python.org/ftp/python/2.5/python-2.5.msi.

Por padrão, a instalação assume o diretório C:\Python25 como o local onde serão descompactados os arquivos. No entanto usaremos o path C:\Program Files\Python\.

O processo é simples bastando apenas avançar as abas da instalação (Next, Next, Finish).

Passo 1.1 – System Path
 
Nas variáveis de ambiente do Windows, acrescente o caminho da instalação do Python no System Path.
 
Também será necessário adicionar uma variável de ambiente “PYTHONHOME” com o caminho da instalação do Python.




Passo 2 – Instalação do SetupTools

O SetupTools é um coleção de ferramentas para o Python distutils que permite a criação e distribuição de pacotes Python mais facilmente.

Necessitaremos desse pacote para a instalação de plugins e, inclusive, a própria ferramenta Trac.

A instalação pode ser feita através de forma automática, utilizando a instalação binária, ou de forma manual.

Particularmente eu recomendo a instalação manual porque essa opção elimina a possibilidade de você instalar uma versão inadequada ou não suportada pela versão do Python. Nesse caso, será necessário baixar o bootstrap module e copia-lo para a pasta scripts, no diretório de instalação do Python (C:\Program Files\Python\Scripts).

$ cd c:\Program Files\Python
$ md Scripts
$ cd Scripts
$ ez_setup.py

O script ez_setup.py irá fazer o download e instalar a versão adequada do SetupTools.
O resultado da execução desse script deve ser semelhante à apresentada abaixo:

C:\Program Files\Python\scripts>ez_setup.py
Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9-py
2.5.egg
Processing setuptools-0.6c9-py2.5.egg
Copying setuptools-0.6c9-py2.5.egg to c:\program files\python\lib\site-packages
Adding setuptools 0.6c9 to easy-install.pth file
Installing easy_install-script.py script to C:\Program Files\Python\Scripts
Installing easy_install.exe script to C:\Program Files\Python\Scripts
Installing easy_install-2.5-script.py script to C:\Program Files\Python\Scripts
Installing easy_install-2.5.exe script to C:\Program Files\Python\Scripts

Installed c:\program files\python\lib\site-packages\setuptools-0.6c9-py2.5.egg
Processing dependencies for setuptools==0.6c9
Finished processing dependencies for setuptools==0.6c9

Como dito acima, pode-se optar pela instalação binária. Nesse caso, será necessário baixar a versão do SetupTools compatível com a versão do Python.

No link http://pypi.python.org/pypi/setuptools é possível encontrar a instalação binária for MS Windows.
Concluído o download, o processo de instalação é igualmente simples (Next, Next, Finish). A versão utilizada na criação desse tutorial é a 0.6c9 e foi baixada desse link.



Após a instalação, confirme a existência do subdiretório Scripts e, dentro dele, o arquivo easy_install.exe.

OBS: É necessário que seja dado permissão de administrador para a instalação (Run as Administrator).

Passo 2.1 – Path

Acrescente o subdiretório Scripts (C:\Program Files\Python\Scripts) no system path, igualmente como feito no passo 1.1.
 
 
Passo 3 – Instalação do Genshi

A instalação pode ser feita através do SetupTools ou através da instalação binária.
Em caso de ser feita através do SetupTools, basta abrir um prompt de comandos (aberto com privilégio de Administrador) e digitar:

$ easy_install Genshi



Se desejar a instalação binária, faça o download pelo link e instale-o normalmente (com privilégio de Administrador).

Também há outras formas. Se achar necessário, consulte esse site.

OBS: A imagem acima mostra a instação bem sucedida do Genshi utilizando o SetupTools. No entanto, após concluir toda as etapas de instalação e acessar o Trac via web browser, o módulo de interpretação do python (mod_python) notificou erro informando que o Genshi não estava instalado. O problema só foi solucionado utilizando a instalação binária.

 
Passo 4 – ClearSilver

O ClearSilver é uma linguagem neutra para system de template HTML. Sua instalação é opcional, mas é requerida para alguns plugins.

Durante a criação desse tutorial, tentou-se realizar a instalação através do comando “easy_install ClearSilver”. O SetupTools fez o download da versão 0.10.1, mas falhou ao instalar o pacote. A solução foi utilizar a url completa para o pacote de versão 0.10.4 para python 2.5.



Passo 5 – Instalando Banco de Dados

Será necessária a instalação de um banco de dados na qual o Trac usará para seu funcionamento. Atualmente é oferecido suporte ao SQLite, PostgresSQL e MySQL. Isso porque o Python possui drives para apenas esses três banco de dados, sendo o driver para MySQL ainda experimental.

Passo 5.1 – Drive para PostgresSQL

Para utilizar o PostgresSQL como gerenciador de banco de dados no Track, é necessário a instalação do driver pyPgSQL e do pacote mxDataTime e são detalhados nos sub-tópicos abaixo.

Apesar dos procedimentos de instalação ser simples, em diversos outros momentos onde optei por utilizar o PostgreSQL, enfrentei diversos problemas e conflitos. Por isso, sugiro o uso do SQLite que é bem mais flexível, principalmente em caso de migração.

Passo 5.1.1 – O gerenciador de banco de dados

Se você já possui o PostgreSQL instalado, pule essa etapa. Caso contrário acesse o link http://www.postgres.org/ e baixe a versão desejada.
Mas antes de fazer o download, leia o próximo tópico.

Passo 5.1.2 – Driver pyPgSQL

A versão do drive pyPgSQL a ser instada depende da versão do gerenciador de banco de dados e da versão do Python.
No link http://www.stickpeople.com/projects/python/win-psycopg/ você encontra uma tabela de downloads que, atualmente, disponibiliza a versão 2.0.12 para o Python 2.5 (usado nesse documento) e para o PostgreSQL 8.4.0 (link direto).

OBS.: A instalação binária deve ser executada com permissões de administrador.

Passo 5.1.3 – Instalando mxDateTime

O mxDateTime implementa novos tipos de objetos: DateTime, DateTimeDelta e RelativeDateTime e varias outras ferramentas destas for tornar fácil a conversar em formatos date/time. Esse pacote é uma exigência do drive pyPgSQL.
Com a instalação do SetupTools, basta executar o seguinte comando no prompt:

easy_install egenix-mx-base

Em caso de falha, é possível fazer o download da instalação binária (para download link aqui)

OBS.: Mais uma vez lembrando de que é requerida permissão de administrador para a instalação binária.

Passo 5.2 – Drive para SQLite

No caso de você optar pelo SQLite, o processo é mais simples.

Passo 5.2.1 – O gerenciador de banco de dados

Esse gerenciador de banco de dados é muito simples (nem mesmo requer um instalador).
a) Acesse o site oficial (http://www.sqlite.org/) e faça o download da versão for Windows mais recente. Atualmente a versão disponível é a 3.6.17 (link direto);
b) Crie uma pasta chamada “SQLite” em “C:\Program Files” e descompacte o arquivo dentro dessa pasta;
c) Por último, acrescente C:\Program Files\SQLite no path do sistema (semelhante ao tópico 1.1)
Uma outra sugestão, em vez de criar um diretório específico para o SQLite, você pode copia-lo para, por exemplo, o diretório de instalação do Python (que já está referenciado no system path).

Passo 5.2.2 – Drive pySQLite

É necessário instalar o drive pySQLite no Python. Essa instalação pode ser feita manualmente (recomendável) ou automática, através de uma instalação binária.
Se optar por fazer manualmente (processo mais simples) abra um prompt de comandos com privilégio de administrador e simplesmente digite o comando abaixo.

$ easy_install pysqlite

Além de mais simples e rápido, e modo remove a possibilidade de você instalar uma versão incompatível com a do Python.

A instalação binária pode ser encontrada nesse link. Deve observar que é necessário a instalar o drive correspondente à versão do Python que foi instalado, que nesse caso é a 2.5 (link direto).




Passo 6 – SVN Python

A instalação dos pacotes de acesso e gerenciamento do repositório svn no python é um dos requisitos obrigatórios e deve considerar a versão do servidor Apache que está instalado e também a versão do Python. E como esse tutorial é destinado a integrar o Trac no VisualSVN Server (mas especificamente a versão 2.0.6 do VisualSVN Server), então você deverá optar por uma instalação com suporte ao Apache 2.2.x.

Isso porque o VisualSVN Server (versão 2.0.6) é composto pelo Apache/2.2.13 (Win32) DAV/2 SVN/1.6.5 mod_ssl/2.2.13 OpenSSL/0.9.8k.

Esse pacote pode ser acrescentado ao Python através de uma instalação binária ou de forma manual (usando o SetupTools), mas deve-se adotar uma instalação compatível com a versão do Subversion (que nesse caso é a 1.6.5) e a versão do Python (2.5).

O instalador é encontrado no mesmo site do Subversion, descrito no tópico acima (http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100) ou pelo link direto.

OBS: É requerido “Run as administrator”.

Se preferir, pode fazer a instalação através do SetupTools:

$ easy_install -Z http://subversion.tigris.org/files/documents/15/46527/svn-python-1.6.5.win32-py2.5.exe


Passo 7 - Módulo mod_python

Esse módulo é particularmente necessário para o Apache HTTP Server e deve ser compatível com a versão do python e do próprio Apache instalado (v2.2.13 – VisualSVN Server).

O site oficial (http://www.modpython.org/) redireciona para a página de download de módulos do Apache (http://httpd.apache.org/modules/python-download.cgi). A versão atual 3.3.1 é destinada ao Apache HTTP Server 2.0 e 2.2 (que é o nosso caso). Link direto.

Antes de fazer a instalação é recomendável criar uma pasta chamada “modules” no diretório de instalação do VisualSVN Server. Isso porque o instalador do mod_python irá solicitar, em um dado momento, que informe o diretório de instalação do Apache. No entanto, o VisualSVN Server tem uma estrutura de diretório levemente diferente da do Apache, e isso inclui não possuir a pasta “modules” para onde o instalador irá copiar o módulo mod_python.so.

$ cd c:\Program Files\VisualSVN Server\
$ md modules



OBS: Se após concluída todas as etapas de instalação do Trac ou em um upgrade for exibida a mensagem abaixo no web browser, isso é um forte indicativo de que necessite instalar/reinstalar o mod_python.

Warning: Can't synchronize with the repository (Unsupported version control system "svn": "No module named svn"). Look in the Trac log for more information.


Passo 8 – Trac

Passo 8.1 – Instalando o Track

Para instalar o Track você pode fazer através da instalação binária (), ou então através do SetupTools.
Através do SetupTools basta executar o comando abaixo no prompt de comandos.

$ easy_install Trac

Também pode-se utilizar o link do repositório subversion.

$ easy_install http://svn.edgewall.org/repos/trac/tags/trac-0.11



OBS: O prompt de comandos deve ser aberto com privilégios de administrador.

Vá até o diretório C:\Program Files\Python\Tools\Scripts e execute o comando:

$ cd C:\Program Files\Python\Tools\Scripts
$ python setup.py install


Passo 8.2 – Trac-Admin

O Trac environment é onde serão armazenadas as informações sobre Wiki pages, Tickets, Reports, Settings, etc. Um environment é basicamente um diretório que contém um arquivo de configuração específico juntamente com vários outros arquivos e diretórios.

Para exemplificação, nosso projeto será criado no caminho “D:\Repositories\Trac”. Esse diretório deve ser manualmente criado.

Criado o diretório, vamos criar um novo ambiente usando trac-admin:

$ trac-admin D:\Repositories\Trac\MyProject initenv

O trac-admin irá solicitar informações necessárias para criar o ambiente, tal como nome do projeto, string de conexão com a base de dados, repositório, ...

Para exemplificar usaremos o projeto “MyProject”. Assim, quando solicitado informe:

Passo 8.2.1 – Se estiver usando PostgresSQL

Project Name[My Project]: MyProject
Database connection string [sqlite:db/trac.db]: postgres://tracuser:tracpass@localhost:5432/trac
Repository type [svn]: svn
Path to repository [/path/to/repos]: D:\Repositories\SVN\MyProject



OBS: A string de conexão com o banco de dados especifica: O usuário tracuser, cuja senha é tracpass, tem acesso à base de dados trac cuja conexão é feita através o hostname localhost e porta 5432.

Tanto o usuário quanto a base de dados devem ser previamente criados pela ferramenta DB administrativa de sua preferência.

Passo 8.2.2 – Se estiver usando SQLite

Project Name[My Project]: MyProject
Database connection string [sqlite:db/trac.db]: sqlite:db/myproject.db
Repository type [svn]: svn
Path to repository [/path/to/repos]: D:\Repositories\SVN\MyProject



Passo 8.3 – Execução do Servidor Standalone

Após a criação do ambiente trac, você pode facilmente acessar a interface web através da execução do standalone server tracd.

$ tracd --port 8000 D:\Repositories\Trac\MyProject

No browser digite: http://127.0.0.1:8000/

Passo 8.4 – Firewall / Permissões para o Python

Quando você inicializar o servidor em modelo standalone pela primeira vez, o firewall do Windows 7 irá questiolá-lo sobre o tipo de permissão que o Python deverá receber.

Uma tela semelhante à imagem abaixo será exibida.



Marque das duas opções (como é mostrado na imagem) e clique no botão “Allow access”.

Passo 8.5 – Criando repositório svn

Ao acessar http://127.0.0.1:8000/MyProject/ pelo browser, provavelmente será exibida a seguinte mensagem:

Warning: Can't synchronize with the repository (D:/Repositories/SVN/MyProject does not appear to be a Subversion repository.). Look in the Trac log for more information.

Essa mensagem é porque o repositório svn (MyProject) não foi criado.

$ cd c:\Repositories
$ svnadmin create c:\Repositories\MyProject


Passo 9 – Configurando o VisualSVN Server

Esse capítulo é dedicado a configuração do VisualSVN Server para integrar a ferramenta Trac. E os passos abaixo foram descritos considerando a versão 2.0.7 do VisualSVN Server.
Essa versão utiliza o Apache 2.2.13 e o Subversion 1.6.5.

Passo 9.1 - Arquivo vsvnvars.bat

No arquivo vsvnvars.bat, localizado em C:\Program Files\VisualSVN Server\, acrescente uma linha contendo: set PYTHONHOME=c:\Program Files\Python

@echo off

set PYTHONHOME=c:\Program Files\Python

set PATH=%~dp0bin;%PATH%

IF "%1" == "" GOTO welcome
%*

GOTO end

:welcome
echo Welcome to VisualSVN Server command prompt!
echo Use 'svn help', 'svnadmin help' and 'svnlook help' for more information.
echo Type 'exit' to exit.
GOTO end

:end

Passo 9.2 - Configurando httpd-custom.conf

Em C:\Program Files\VisualSVN Server\conf, abra o arquivo httpd-custom.conf e acrescente no final as seguintes linhas:

LoadModule python_module modules/mod_python.so
LoadModule authz_user_module bin/mod_authz_user.so
<Location /trac>
  SetHandler        mod_python
  PythonInterpreter main_interpreter
  PythonHandler     trac.web.modpython_frontend
  PythonOption      TracEnvParentDir D:\Repositories\Trac
  PythonOption      TracUriRoot /trac
  PythonDebug       on

  AuthName          "Trac"
  AuthType          Basic
  AuthBasicProvider file
  AuthUserFile      "D:/Repositories/SVN/htpasswd"
  Require valid-user
</Location>

Agora basta resetar o VisualSVN Server.

quarta-feira, 23 de setembro de 2009

Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 3)


1. SVN Client / Tourtoise


O TortoiseSVN é desenvolvido pela Tigris.org, um consórcio que desenvolve soluções open source. Este software é classificado como "Windows Explorer Shell Extension", e uma vez instalado, acrescenta uma opção do menu contextual do Windows Explorer (menu exibido com o clique do botão direito do mouse) apresentando todas as tarefas de controle de versão poderá executar.

Essa ferramenta é muito prática, devido sua integração com o Windows Explorer. Se preferir, pode utilizar um client de linha de comando.

Esse documento não irá detalhar os recursos e funcionalidades do Tortoise, mas sim como configurar o sistema para utilizar o certificado client automaticamente.

Devido ao VisualSVN Server estar configurado para exigir uma conexão SSL e, consequentemente, solicitar um certificado de cliente, em toda operação que exigir leitura ou escrita no repositório svn, o tortoise irá apresentar um dialog solicitando que você informe o caminho onde o certificado client (arquivo .pfx) encontra-se e, posteriormente, a senha de proteção deste certificado.

Para evitar que tortoise sempre solicite o certificado será necessário modificar o arquivo de configuração do subversion (servers). Esse arquivo está localizado em %APPDATA%\Subversion sob o nome “servers” (não possui extenção).

O diretório %APPDATA% é relativo ao sistema operacional, ao idioma do sistema operacional e ao usuário logado. Por exemplo, se você estiver usando Windows XP, uma possível de localização é: C:\Documents and Settings\lovatof\Application Data\Subversion.

Em caso de dúvida, basta digitar %APPDATA% [ENTER] no Windows Explorer e ele expandirá essa variável de ambiente para o correspondente valor.

Abra o arquivo “servers” e localize a linha onde aparece “[groups]”.

O trecho abaixo é um exemplo de configuração que você pode utilizar como base.
[groups]
flovatosvn               = flovatosvn.myserver.com.br
local                    = localhost

[flovatosvn]
ssl-client-cert-file     = C:\Program Files\VisualSVN Server\bin\Cert\Fabius.pfx
ssl-client-cert-password = [minha senha]
ssl-trust-default-ca     = yes
http-compression         = yes
http-timeout             = 300

[local]
ssl-client-cert-file     = C:\Program Files\VisualSVN Server\bin\Cert\Fabius.pfx
ssl-client-cert-password = [Minha Senha]
ssl-trust-default-ca     = yes
http-compression         = yes
http-timeout             = 300


Em “[groups]” foi acrescentado a definição de dois grupos (flovatosvn e local). Isso significa que quando o svn client (no caso o tortoise) for acessar um repositório svn utilizando o endereço localhost (por exemplo: https://localhost:8443/svn) deverá ser utilizado as configurações do grupo “local”. O mesmo vale para o grupo “flovatosvn”.

O item “ssl-client-cert-file” define a localização completa do certificado de cliente que deve ser utilizado para a autenticação. Nesse caso, modifique esse parâmetro para refletir a condição definida em seu ambiente de trabalho.

O item “ssl-client-cert-password” é utilizado para armazenar a senha de proteção do certificado. Particularmente eu não recomendo ignorar esse item de configuração por questões de segurança. No entanto, se não for especificado o tortoise irá solicitar tal senha sempre que um acesso ao repositório for realizado.


2. PHP

O suporte ao PHP é um requisito para o funcionamento do WebSVN que será abordado no capítulo abaixo. Além disso, o uso do PHP pode estender à outros frameworks ou mesmo implementações internas.

As etapas abaixos descreve o que deve ser feito a instalação/configuração do PHP5 no Windows 7 com foco ao VisualSVN Server, no entanto esse mesmo passo-a-passo pode ser utilizado (como uma ou outra diferença) para a instalação em outra versão do MS Windows e/ou com foco no Apache.

    2.1 Instalação
No site http://br.php.net/ você encontra informações mais detalhadas sobre o PHP. No nosso tutorial utilizaremos a versão mais recente e estável disponível (verão 5.2.11). Se desejar, faça o download pelo link direto.

Crie uma pasta chamada “PHP” em %ProgramFiles% (C:\Program Files\PHP) e descompacte a instalação para essa pasta.

    2.2 Configurando o PHP
a) No diretório de instalação do PHP (%ProgramFiles%\PHP), copie o arquivo php5ts.dll para a pasta bin do diretório de instalação do VisualSVN Server (%ProgramFiles%\VisualSVN Server\bin). Se você preferir pode copiá-lo para a pasta system32 do Windows (%WINDIR%\system32) como a maioria dos tutoriais recomendam.
A finalidade é tornar acessível tal arquivo acrescentando-o em um local “visível” ao servidor http(s). Não cheguei a testar, mas acredito que simplesmente acrescentando a pasta C:\Program Files\PHP no system path tenha o mesmo efeito.

b) Também no diretório de instalação do PHP você encontra o arquivo “php.ini”. Abra-o e localize a linha onde aparece extension_dir = “./” e modifique para extension_dir = “c:/Program Files/PHP/ext/”, que é o caminho complato do diretório onde ficam as extensões do php (GD, MySQL, Postgres, ...).

c) Caso você tenha instalado MySQL, PostgresSQL, ou outro banco de dados e deseje acessá-los) via PHP, localize, por exemplo, a linha onde aparece ;extension=php_mysql.dll e remova o caracter ponto-e-vírgula (;). Esse caracter tem funcionalidade de comentário (assim como // ou /* */ em C/C++ ou { } em Delphi, ...).
Nesse exemplo, é acrescentado suporte ao MySQL, mas há diversas outras extensões que também estão comentadas, bastando remover o caracter de comentário (;).

d) Seguindo o passo anterior, habilite suporte ao módulo “php_openssl.dll”.

e) O arquivo de configuração do PHP (php.ini) possui muitos parâmetros que permite a customização. Assim, depois de feitas as devidas alterações, salve o arquivo e mova-o para a pasta "conf" do diretório de instalação do VisualSVN (C:\Program Files\VisualSVN\conf).
Aqui a situação é a mesma, o objetivo é tornar o arquivo "visível" ao servidor web. Se preferir, pode mover o php.ini para o diretório de instalação do Windows (%WINDIR%), como é recomendado pela maioria dos guias de instalação.

    2.3. Suporte ao PHP no VisualSVN Server
No arquivo httpd-custom.conf, acrescente as seguintes linhas:
LoadModule php5_module "C:/Program Files/PHP/php5apache2_2.dll"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# configure the path to php.ini
PHPIniDir "C:/Program Files/PHP"

No arquivo httpd.conf, localize a linha onde aparece “<ifmodule dir_module>” e modifique a instrução Directoryindex como aparece abaixo.
<ifmodule dir_module>
    DirectoryIndex index.html index.php default.php main.php
</ifmodule>

Isso fará com que o servidor reconheça os arquivos index.php, default.php e main.php a um diretório aberto. Apesar desses nomes de arquivos serem largamente utilizado, não é obrigatório que utilize-os, você pode incluir inicio.php ou qualquer outro nome de sua escolha.

    2.4 Testando o PHP no browser
Acrescentado a configuração acima listada, é necessório um reset o VisualSVN Server para que este inicialize o PHP.

a) Para verificar se o PHP está sendo carregado e funcionando corretamente, crie um arquivo com extensão .php (exemp: info.php) com o seguinte conteúdo:

<? phpinfo(); ?>

b) Salve esse arquivo na pasta "htdocs" do VisualSVN (%ProgramFiles\VisualSVN Server\htdocs).

c) Em seguida, abra um webbrowser e digite: https://localhost:8443/info.php. Se tudo correr bem, deve se exibido uma tela com as informações sobre a configuração do PHP:


3. WebSVN

O WebSVN, como o próprio nome sugere, é um solução open source que permite a navegação no repositório svn através de uma interface web.

É uma solução cuja proposta se assemelha em muito com ao do VisualSVN Server (no quesito web browser), mas possui uma interface melhorada e com vários recursos.

Acesse o site oficial (http://www.websvn.info/) para obter maiores detalhes.
 
    3.1 Instalação
O processo de instalação é muito simples.

Faça o download a versão mais recente (http://www.websvn.info/download/ ) e descompacte o arquivo para uma pasta qualquer dentro de htdocs do VisualSVN (%ProgramFiles\VisualSVN Server\htdocs).

Se preferir pode deixar o diretório com o nome da pasta contida no arquivo de instalação (websvn-2.2.1), mas sugiro renomeá-lo para websvn.

    3.2. Configurando o acesso ao WebSVN
Caso deseje posteriormente utilizar o WebSVN acrescente o trecho abaixo no final do arquivo (https.conf) ou, o mais recomendado, acrescente as linhas abaixo no arquivo httpd-custom.conf.
<location /websvn/>

    SVNListParentPath  on
    SVNParentPath      "D:/Repositories/SVN/"
    SVNIndexXSLT       "/svnindex.xsl"

    AuthName           "Subversion Web Browsing"
    AuthType           Basic
    AuthBasicProvider  file
    AuthUserFile       "D:/Repositories/SVN/htpasswd"
    AuthzSVNAccessFile "D:/Repositories/SVN/authz"

    Require valid-user
</location>

OBS: O WebSVN faz uso do php para o sincronismo com o svn, além da construção dinâmica das próprias páginas. Sendo assim, é necessário que o PHP esteja instalado, conforme descrito no capítulo anterior.

Agora, resete o VisualSVN Server (ou Apache) e digite no browser: https://localhost:8443/websvn/.

Provavelmente irá aparecer a seguinte mensagem:

File "includes\config.php" does not exists, please create one. The example is located under "includes\distconfig.php"

Em %ProgramFiles%\VisualSVN Server\htdocs\websvn\include, você encontrará um arquivo chamado “distconfig.php”, faça uma cópia desse arquivo com o nome “config.php”.

Abra o arquivo config.php e acrescente a linha “$config->parentPath('D:\\Repositories\\svn');”. Logicamente, se o repositório svn em sua máquina não está localizado em D:\Repositories\svn, altere para refletir o caminho correto.

Salve o arquivo; volte ao browser e tente novamente. Voai lá.

segunda-feira, 14 de setembro de 2009

Windows 7 + VisualSVN Server + OpenSSL + TortoiseSVN + Trac (Parte 2)


1. Certificado Digital – OpenSSL

Esse tutorial descreverá como configurar o VisualSVN Server para utilizar certificados digitais e assegurar que não haja acessos indevidos.

O objetivo é ter um certificado digital para cada usuário possibilitando o acesso dos mesmos ao repositório svn.

Para a criação desses certificados digitais será utilizado a ferramenta OpenSSL que já vem incluso na instalação do VisualSVN Server.

    1.1. Preparando o Ambiente

Antes de iniciar a criação dos certificados será necessário preparar um ambiente configurando-o adequadamente.

Como o openssl será utilizado e é uma ferramenta de linha de comandos, utilizaremos o prompt de comandos para a execução dos scripts necessários.

Para isso, abra um prompt de comandos com permissões de administrador (necessário no Windows Vista/7) e vá até o diretório bin da instalação do VisualSVN (provavelmente em C:\Program Files\VisualSVN Server\bin).

    1.1.1. Estrutura de Diretórios/Arquivos

    a) Dentro do diretório bin deve-ser criar a seguinte estrutura de diretórios:
Você pode criar essa estrutura de diretórios com o Windows Explorer ou com o próprio prompt de comandos.

    b) Crie um arquivo chamado Serial (sem extensão) com o conteúdo “01” (sem as aspas duplas) e grave-o no diretório .\Cert\demoCA\.
    c) Crie um arquivo chamado Index.txt (vazio) gravando-o no diretório .\Cert\demoCA\.

O script MS-DOS Batch abaixo cria a estrutura de diretórios.

@ECHO OFF

IF NOT EXIST "%ProgramFiles%\VisualSVN Server\bin" GOTO VSVN_NO_EXIT

SET VSVN=%ProgramFiles%\VisualSVN Server\bin

IF NOT EXIST "%VSVN%\Cert" GOTO BIN_CLEAR
    DEL /S /Q /F "%VSVN%\Cert\*.*" > .\Log.txt
    CHOICE /N /C:Y /T:1 /D:Y > .\Log.txt
    RD /S /Q "%VSVN%\Cert"
:BIN_CLEAR

MD "%VSVN%\Cert"
MD "%VSVN%\Cert\demoCA"
MD "%VSVN%\Cert\demoCA\certs"
MD "%VSVN%\Cert\demoCA\crt"
MD "%VSVN%\Cert\demoCA\newcerts"
MD "%VSVN%\Cert\demoCA\private"
ECHO 01>"%VSVN%\Cert\demoCA\serial"
@ECHO OFF>"%VSVN%\Cert\demoCA\index.txt"

COPY .\openssl.config "%VSVN%\Cert" > .\Log.txt
COPY .\genCA.bat "%VSVN%\Cert" > .\Log.txt
COPY .\genClient.bat "%VSVN%\Cert" > .\Log.txt
COPY .\genServer.bat "%VSVN%\Cert" > .\Log.txt

DEL /Q .\Log.txt

%SystemDrive%
CD "%ProgramFiles%\VisualSVN Server\bin\Cert"
GOTO FIM

:VSVN_NO_EXIT
ECHO Diretório "%ProgramFiles%\VisualSVN Server\bin" não existente.

:FIM


    1.1.2. Script de configuração

Crie um arquivo chamado openssl.config no diretório .\Cert\ com o conteúdo abaixo:

File: openssl.config
#EXTENSION SYNTAX.
#ver arquivo openssl-extensions-sintaxe.txt
#
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
#

# This definition stops the following lines choking if HOME isn't
# defined.

HOME                           = .
RANDFILE                       = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
#oid_file                      = $ENV::HOME/.oid

oid_section                    = new_oids

# To use this configuration file with the "-extfile" option of the
# "openssl x509" utility, name here the section containing the
# X.509v3 extensions to use:
# extensions                   =
# (Alternatively, use a configuration file that has only
# X.509v3 extensions in its main [= default] section.)


[ new_oids ]
# We can add new OIDs in here for use by 'ca' and 'req'.
# Add a simple OID like this:
#testoid1=1.2.3.4
# FAKE OIDS CRIADOS A PARTIR DO OBJ_ID_KP DA PKIX (ver objects.h):

OBJ_id_kp                      = 1.3.6.1.5.5.7.3
fake_oid_user_type1            = ${OBJ_id_kp}.999
fake_oid_user_type2            = ${OBJ_id_kp}.998

# Or use config file substitution like this:
# testoid2               = ${testoid1}.5.6


####################################################################

[ ca ]
default_ca = CA_default # The default ca section

####################################################################

[ CA_default ]

dir                            = ./demoCA # Where everything is kept
certs                          = $dir/certs # Where the issued certs are kept
crl_dir                        = $dir/crl # Where the issued crl are kept
database                       = $dir/index.txt # database index file.
new_certs_dir                  = $dir/newcerts # default place for new certs.

certificate                    = $dir/cacert.pem # The CA certificate
serial                         = $dir/serial # The current serial number
crl                            = $dir/crl.pem # The current CRL
private_key                    = $dir/private/cakey.key # The private key
RANDFILE                       = $dir/private/.rand # private random number file

x509_extensions                = serv_cert # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.

name_opt                       = ca_default # Subject Name options
cert_opt                       = ca_default # Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy


# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# (descomentei apesar do que esta dito acima):

crl_extensions                 = crl_ext

default_days                   = 365 # how long to certify for
default_crl_days               =  30 # how long before next CRL
default_md                     = md5 # which md to use.
preserve                       =  no # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)

policy                         = policy_match

# For the CA policy

[ policy_match ]
countryName                    = supplied
stateOrProvinceName            = optional
organizationName               = optional
organizationalUnitName         = optional
commonName                     = supplied
emailAddress                   = optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.

[ policy_anything ]
countryName                    = optional
stateOrProvinceName            = optional
localityName                   = optional
organizationName               = optional
organizationalUnitName         = optional
commonName                     = supplied
emailAddress                   = optional

####################################################################

[ req ]
default_bits                   = 1024
default_keyfile                = privkey.key
distinguished_name             = req_distinguished_name
attributes                     = req_attributes
x509_extensions                = v3_ca # The extentions to add to the self signed cert

# Passwords for private keys if not present they will be prompted for
# input_password                 = secret
# output_password                = secret


# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
# so use this option with caution!

string_mask                    = nombstr

# req_extensions = v3_req # The extensions to add to a certificate request


[ req_distinguished_name ]
countryName                    = Country Name (2 letter code)
countryName_default            = BR
countryName_min                = 2
countryName_max                = 2

stateOrProvinceName            = State or Province Name (full name)
stateOrProvinceName_default    = Rio Grande do Sul
localityName                   = Locality Name (eg, city)
localityName_default           = Porto Alegre
0.organizationName             = Organization Name (eg, company)
0.organizationName_default     = My Company LTDA

# we can do this but it is not needed normally :-)
#1.organizationName              = Second Organization Name (eg, company)
#1.organizationName_default      = World Wide Web Pty Ltd


organizationalUnitName         = Organizational Unit Name (eg, section)
organizationalUnitName_default = Security

commonName                     = Common Name (eg, YOUR name)
commonName_default             = My CA
commonName_max                 = 64
emailAddress                   = Email Address
emailAddress_default           = email@server.com
emailAddress_max               = 64

# SET-ex3 = SET extension number 3


[ req_attributes ]
challengePassword              = A challenge password
challengePassword_min          = 4
challengePassword_max          = 20
unstructuredName               = An optional company name

[ serv_cert ]
# These extensions are added when 'ca' signs a request.

# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

basicConstraints               = CA:FALSE

# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.

# This is OK for an SSL server.
# nsCertType = server

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email

# and for everything including object signing:
# nsCertType = client, email, objsign

# under ASN.1, the 0 bit would be encoded as 80

nsCertType                     = 0x40

# This will be displayed in Netscape's comment listbox.

nsComment                      = "OpenSSL Generated Certificate"

keyUsage                       = keyEncipherment, dataEncipherment, keyAgreement

# PKIX recommendations harmless if included in all certificates.

subjectKeyIdentifier           = hash
authorityKeyIdentifier         = keyid,issuer:always

# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move

# Copy subject details
# issuerAltName=issuer:copy

# Netscape extensions:

nsCaRevocationUrl              = http://www.cryptsoft.com/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName


# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)

crlDistributionPoints          = URI:https://flovato.sytes.net:8443/crl.crl

#opcional, extended key usage que pode ser usada num WEB-server:

extendedKeyUsage               = serverAuth, codeSigning, emailProtection

#ABAIXO ex. como seria para um ocsp server:
#extendedKeyUsage              = serverAuth, 1.3.6.1.5.5.7.48.1.5
#ABAIXO para um usuario normal



[ cli_cert1 ]
# obs- Esta secao usa fake_oid_user_type1 no extendedKeyUsage

basicConstraints               = CA:FALSE
nsComment                      = "OpenSSL Generated Certificate"
subjectKeyIdentifier           = hash
authorityKeyIdentifier         = keyid,issuer:always
keyUsage                       = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement

# This is the link where to get the latest CRL

crlDistributionPoints          = URI:https://flovato.sytes.net:8443/crl.crl

#extended key usage para um usuario client

extendedKeyUsage               = clientAuth, codeSigning, emailProtection



[ cli_cert2 ]
# obs- Esta secao usa fake_oid_user_type2 no extendedKeyUsage

basicConstraints               = CA:FALSE
nsComment                      = "OpenSSL Generated Certificate"
subjectKeyIdentifier           = hash
authorityKeyIdentifier         = keyid,issuer:always
keyUsage                       = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement

# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)

crlDistributionPoints          = URI:https://flovato.sytes.net:8443/crl.crl

#extended key usage para um usuario client

extendedKeyUsage               = clientAuth, codeSigning, emailProtection


[ v3_req ]
# Extensions to add to a certificate request

basicConstraints               = CA:FALSE
keyUsage                       = nonRepudiation, digitalSignature, keyEncipherment


[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.


subjectKeyIdentifier           = hash
authorityKeyIdentifier         = keyid:always,issuer:always

# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.

basicConstraints               = CA:true

# This is the link where to get the latest CRL (obs - da erro se algum nao estiver online?)

crlDistributionPoints          = URI:https://flovato.sytes.net:8443/crl.crl

# This is the link where we can get the issuer certificate
# issuerAltName                = URI:https://flovato.sytes.net:9999/certificado_ca.crt

# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
# keyUsage                     = cRLSign, keyCertSign

# Some might want this also
# nsCertType                   = sslCA, emailCA

# Include email address in subject alt name: another PKIX recommendation
# subjectAltName               = email:copy
# Copy issuer details
# issuerAltName                = issuer:copy

# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints             = critical, DER:30:03:01:01:FF



[ crl_ext ]
# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.

# issuerAltName                = issuer:copy

authorityKeyIdentifier         = keyid:always,issuer:always


[ usr_cert ]
basicConstraints               = CA:FALSE
subjectKeyIdentifier           = hash
authorityKeyIdentifier         = keyid,issuer:always
nsComment                      = "OpenSSL Generated Certificate"
subjectAltName                 = email:copy
issuerAltName                  = issuer:copy


    1.2. Criando o Certificado da Certificadora

Para que os certificados dos usuários e do servidor possam ser assinados, é necessário criar um certificado auto-assinado. Para isso, vá até o diretório .\Cert\ e execute as etapas abaixo:

    a) Criação do par de chaves RSA

..\openssl genrsa -out chave_privada_ca.key 1024

    b) Copie o arquivo chave_privada_ca.key para .\demoCA\private\

copy chave_privada_ca.key .\demoCA\private\cakey.key

    c) Criação do certificado Root

..\openssl req -new -x509 -config openssl.config -key chave_privada_ca.key -out certificado_ca.pem -days 3650

    d) Copie o certificado para .\demoCA\

copy certificado_ca.pem .\demoCA\cacert.pem

Obs.: O par de chaves RSA da certificadora não está protegido.


    1.2.1. Script

Abaixo está um exemplo de shell script um pouco mais elaborado e possibilitando a definição de um password de proteção para as chaves RSA.

File: genCA.bat
@ECHO OFF

ECHO [1/4] - CRIANDO PAR DE CHAVES RSA DA CERTIFICADORA
ECHO ***********************************************
IF "%1" == "" GOTO RSA_NOPASS
..\openssl genrsa -des -passout pass:%1 -out chave_privada_ca.key 1024 2> log.txt
GOTO RSA_FIM

:RSA_NOPASS
..\openssl genrsa -out chave_privada_ca.key 1024 2> log.txt

:RSA_FIM
IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [2/4] - Copiando Chaves RSA para .\demoCA\private\
ECHO ***********************************************
COPY chave_privada_ca.key .\demoCA\private\cakey.key /y 1>> log.txt

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [3/4] - CRIANDO CERTIFICADO ROOT
ECHO ***********************************************
ECHO Sugestão: Country.: BR
ECHO           State...: Rio Grade do Sul
ECHO           Locality: Porto Alegre
ECHO           Company.: Empresa LTDA
ECHO           Unit....: TI
ECHO           Common N: Minha CA
ECHO           Email...: email@servidor.com
ECHO -----------------------------------------------

IF "%1" == "" GOTO CA_NOPASS
..\openssl req -new -x509 -config openssl.config -key chave_privada_ca.key -passin pass:%1 -out certificado_ca.pem -days 3650
GOTO CA_EXIT

:CA_NOPASS
..\openssl req -new -x509 -config openssl.config -key chave_privada_ca.key -out certificado_ca.pem -days 3650

:CA_EXIT
IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [4/4] - Copiando certificado para .\demoCA\
ECHO ***********************************************
COPY certificado_ca.pem .\demoCA\cacert.pem /y 1>> log.txt

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... Sucesso. Certificado criado.
GOTO FIM


:FIM


    1.3. Criando o Certificado do Servidor

Durante a instalação do VisualSVN Server um certificado é automaticamente gerado. Este certificado é utilizado para as conexões https.

Um novo certificado deverá ser criado e assinado pela “certificadora” que foi criada.

    a) Criação do par de chaves RSA

..\openssl genrsa -out server.key 1024

    b) Criação de uma requisição de certificado

..\openssl req -new -config openssl.config -key server.key -out server.req

    c) Assinando a requisição com o certificado da “certificadora”

..\openssl ca -config openssl.config -extensions usr_cert -out server.pem -in server.req

    d) Exportando o certificado criado para um .cer

..\openssl x509 -in server.pem -out server.cer -outform PEM


    1.3.1. Script

Abaixo está um exemplo de shell script (.bat).

File: genServer.bat
@ECHO OFF
IF "%1" == "" GOTO SINTAXE

ECHO [1/5] - CRIANDO PAR DE CHAVES RSA DO SERVIDOR
ECHO ***********************************************
..\openssl genrsa -out %1.key 1024 2> log.txt

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [2/5] - CRIANDO REQUISIÇÃO DE CERTIFICADO PARA SERVIDOR
ECHO **************************************************
ECHO Sugestão: Country.: BR
ECHO           State...: Rio Grade do Sul
ECHO           Locality: Porto Alegre
ECHO           Company.: Empresa LTDA
ECHO           Unit....: TI
ECHO           Common N: SVNServer
ECHO           Email...: email@server.com
ECHO -----------------------------------------------
..\openssl req -new -config openssl.config -key %1.key -out %1.req

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [3/5] - ASSINANDO A REQUISIÇÃO DE CERTIFICADO DO SERVIDOR
ECHO **************************************************
..\openssl ca -config openssl.config -extensions usr_cert -out %1.pem -in %1.req

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [4/5] - EXPORTANDO CERTIFICADO (.CER)
ECHO **************************************************
..\openssl x509 -in %1.pem -out %1.cer -outform PEM

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [5/5] - GERANDO CERTIFICADO + PRIVATE KEY (.P12)
ECHO **************************************************
copy %1.key + %1.cer %1.p12 1>> log.txt

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... Sucesso. Certificado do servidor criado.

GOTO FIM

:SINTAXE
ECHO genServer [Filename]

:FIM


    1.3.2. Usando o novo certificado de servidor

Criado o novo certificado, agora se deve configurar o VisualSVN Server para utilizá-lo.

    a) Caso o servidor svn esteja rodando, pare a execução do serviço. Isso é feito no console de gerenciamento do VisualSVN Server através da opção Stop, que é disponibilizada no menu de contexto ou através do menu Action;


    b) Copie os arquivos server.key e Server.cer, para o subdiretório certs do diretório de instalação do VisualSVN Server (provavelmente C:\Program Files\VisualSVN Server\certs);


    c) Localize no arquivo de configuração do VisualSVN Server (httpd.conf) as outra opção que especificam o certificado a chave privada do certificado digital padrão (server.pem) e substitua pelos arquivos anteriormente copiados.

Para isso basta editar httpd.conf modificando as linhas:

SSLCertificateFile certs/server.pem
SSLCertificateKeyFile certs/server.pem
por
SSLCertificateFile certs/server.cer
SSLCertificateKeyFile certs/server.key

    1.4. Criando os Certificados dos Usuários

A criação dos certificados de usuários é muito semelhante à criação do certificado de servidor.

    a) Criação do par de chaves RSA

..\openssl genrsa -out cliente.key 1024

    b) Criação de uma requisição de certificado

..\openssl req -new -config openssl.config -key cliente.key -out cliente.req

    c) Assinando a requisição com o certificado da “certificadora”

..\openssl ca -config openssl.config -extensions cli_cert1 -out cliente.pem -in cliente.req

    d) Exportando o certificado para o formato PFX

..\openssl pkcs12 -export -clcerts -in cliente.pem -inkey cliente.key -out cliente.pfx

OBS: O certificado no formato pkcs12 (.pfx) deve ser instalado no browser do cliente.


    1.4.1. Script

File: genClient.bat
@ECHO OFF
IF "%1" == "" GOTO SINTAXE

ECHO [1/4] - CRIANDO PAR DE CHAVES RSA DO CLIENTE
ECHO ***********************************************
..\openssl genrsa -out %1.key 1024 2> log.txt

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [2/4] - CRIANDO REQUISIÇÃO DE CERTIFICADO PARA O CLIENTE
ECHO **************************************************
ECHO Sugestão: Country.: BR
ECHO           State...: Rio Grade do Sul
ECHO           Locality: Porto Alegre
ECHO           Company.: Empresa LTDA
ECHO           Unit....: Developer
ECHO           Common N: Fabius
ECHO           Email...: flovato@empresa.com.br
ECHO -----------------------------------------------
..\openssl req -new -config openssl.config -key %1.key -out %1.req

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [3/4] - ASSINANDO O CERTIFICADO DO CLIENTE
ECHO **************************************************
..\openssl ca -config openssl.config -extensions cli_cert1 -out %1.pem -in %1.req

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... OK


ECHO [4/4] - EXPORTANDO O CERTIFICADO NO FORMATO PFX
ECHO **************************************************
..\openssl pkcs12 -export -clcerts -in %1.pem -inkey %1.key -out %1.pfx

IF NOT %ERRORLEVEL% == 0 GOTO FIM
ECHO ... Sucesso. Certificado do cliente %1 criado.

GOTO FIM

:SINTAXE
ECHO genServer [Filename]

:FIM


2. Opções de configuração do Apache

Antes de configurarmos o Apache (VisualSVN Server) é importante conhecer para que serve e como utilizar algumas das muitas opções de configuração do Apache.

Esse documento se valerá de uma situação simples para o uso de certificados digitais/SSL. No entanto, é provável que configurações mais elaboradas sejam necessárias com o passar do tempo, e conhecer um pouco mais sobre tais opções certamente ajudará.

SSLEngine             : Habilita/Desabilita o módulo SSL.
SSLProtocol           : Tipos de protocolos SSL aceitos.
SSLCipherSuite        : Tipos de ciphers utilizados na negociação
SSLVerifyClient       : Determina a exigência de um certificado de cliente.
SSLVerifyDepth        : Nível de validação do certificado do cliente.
SSLCACertificateFile  : Certificado a ser utilizado para validar o cliente.
SSLCACertificatePath  : Caminho contendo todos os CA aceitas pelo servidor.
SSLCertificateFile    : Certificado do servidor.
SSLCertificateKeyFile : Chave privada do certificado do servidor.
SSLCARevocationFile   : Lista de certificadoras revogadas.
SSLCARevocationPath   : Caminho contendo todos os CA revogados pelo servidor.
SSLOptions +StdEnvVars: Exporta variáveis de ambiente para o PHP
SSLRequireSSL         : Obriga conexão SSL (HTTPS).
SSLRequire            : Permite especificar requisitos para a conexão.


3. Configurando o VisualSVN Server/Apache

Após a criação dos certificados digitais (CA, Server e Client) o VisualSVN Server deverá ser configurado para que o mesmo passe a utiliza-los e a requisitar autenticação nos acessos feitos.

Como já mencionado no tópico 1.3.2, deve-se substituir o certificado utilizado pelo VisualSVN pelo novo certificado que foi gerado nas etapas anteriores.

Além disso, acesse o arquivo httpd.conf (em C:\Program Files\VisualSVN Server\conf\). Localize as seguintes linhas:

<location ⁄svn⁄>    DAV svn

    SVNListParentPath  on
    SVNParentPath      "D:/Repositories/"
    SVNIndexXSLT       "/svnindex.xsl"

    AuthName           "Subversion Repositories"
    AuthType           Basic
    AuthBasicProvider  file
    AuthUserFile       "D:/Repositories/htpasswd"
    AuthzSVNAccessFile "D:/Repositories/authz"

    require valid-user
    SSLRequireSSL
</location>

A opção “SSLRequireSSL” instrui o servidor Apache a requerer conexão SSL (HTTPS). E a opção “require valid-user”, como o próprio nome sugere, exige a identificação de um usuário válido (cuja lista está definida pela opção “AuthUserFile”).

    3.1. Permissão a todos os browsers

Por default, o VisualSVN Server vem configurado para permitir conexões apenas do Internet Explorer. No arquivo https.conf, localizado no subdiretório conf, comente (#) as linhas referentes a opção SetEnvIf. Isso permitirá que outros web browsers também possam acessar o repositório.

<IfModule ssl_module>
    SSLEngine on

    SSLRandomSeed startup  builtin
    SSLRandomSeed connect  builtin
    SSLPassPhraseDialog    builtin
    SSLSessionCache        "shm:C:/Repositories/ssl_scache"
    SSLSessionCacheTimeout 300
    SSLMutex default

    SSLCertificateFile     certs/server.cer
    SSLCertificateKeyFile  certs/server.key
    SSLProtocol            -ALL +SSLv3 +TLSv1
    SSLCipherSuite         ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM

#   SetEnvIf User-Agent ".*MSIE.*" \
#            nokeepalive ssl-unclean-shutdown \
#            downgrade-1.0 force-response-1.0
</IfModule>

    3.2. Solicitação de Certificado de Cliente

O exemplo abaixo acrescenta quatro itens de configuração que instrui o servidor Apache.

<IfModule ssl_module>
    SSLEngine on

    SSLRandomSeed startup  builtin
    SSLRandomSeed connect  builtin
    SSLPassPhraseDialog    builtin
    SSLSessionCache        "shm:C:/Repositories/ssl_scache"
    SSLSessionCacheTimeout 300
    SSLMutex default

    SSLVerifyClient         require
    SSLVerifyDepth          1
    SSLCACertificateFile    certs/cacert.pem
    SSLOptions              +StdEnvVars


    SSLCertificateFile     certs/server.cer
    SSLCertificateKeyFile  certs/server.key
    SSLProtocol            -ALL +SSLv3 +TLSv1
    SSLCipherSuite         ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM

#   SetEnvIf User-Agent ".*MSIE.*" \
#            nokeepalive ssl-unclean-shutdown \
#            downgrade-1.0 force-response-1.0
</IfModule>


4. Acessando Repositório SVN via WebBrowser
Concluído a configuração do VisualSVN Server, tente acessar o repositório SVN via web browser.


Provavelmente será exibido uma tela semelhante a imagem acima (case esteja utilizando o IExplorer como webbroser). Essa falha é um indicativo que não há um certificado de cliente instalado e, nesse caso, crie um certificado de cliente conforme descrito no tópico 1.4 e instale-o no web browser.

Criado o certificado com o openssl, o processo de instalação é trivial, bastando um duplo clique sobre o arquivo .pfx e um wizard de importação será apresentado. Como é exibido na imagem abaixo.


 
O wizard também irá solicitar a senha de proteção da chave privada. Essa é a “phase” informada no processo de criação do certificado (imagem abaixo).


É recomendado habilitar a opção “Enable strong private key protection”.

Também recomendo marcar a opção “Mark this key as exportable” a qual será útil caso você perca seu arquivo .pfx, possibilitando exporta-lo do web browser.

 
Após a instalação do certificado de cliente no web browser, tente acessar o repositorório svn novamente (https://localhost:8443/svn).


Um novo dialog (Windows Security) será apresentado solicitando que escolha o certificado que deve ser utilizado para a autenticação (conexão SSL - HTTPS). Observe a imagem abaixo.

 
Se tudo correr bem, o browser irá apresentar uma notificação (warning) de segurança questionando a autenticidade do certificado.
 
Essa mensagem é exibida porque o certificado não foi emitido por uma certificadora “conhecida”. Ignore essa notificação e pressione o botão “Continue”.
   
Em seguida o servidor irá browser irá solicitar a identificação do usuário.

Você deve informar um usuário e senha que foi previamente cadastrado no console de gerenciamento do VisualSVN Server.

Enfim, após a entrada de um usuário e senha válido, será apresentado a página padrão VisualSVN Server listando todos os repositórios.