terça-feira, 28 de julho de 2015

Criando certificados digitais para um ambiente de desenvolvimento/testes

A primeira vez que a gente precisa de um ambiente de desenvolvimento habilitado para SSL a gente nunca esquece.

Cerificados digitais criam uma certa confusão pra quem não está acostumado com eles. E frequentemente o material disponível a respeito é bastante extenso e cheio de detalhes excruciantes. Demais pra quem quer apenas dar o primeiro passo e ter uma ambiente pra testar uma aplicação.

O Que São Certificados Digitais


O Certificado Digital é um mecanismo pelo qual conteúdo pode ser digitalmente assinado. Mais especificamente, ele associa uma identidade (a "pessoa" a quem o certificado pertence) a uma chave pública (e a essa chave púbilca corresponde uma chave privada, usada pelo possuidor do certificado para assinar o conteúdo).

Os certificados são emitidos e assinados por uma Autoridade Certificadora. A própria autoridade certificadora possui um certificado digital e uma chave privada com os quais ela assina todos os outros certificados emitidos por ela.

A maioria dos computadores traz pré-instalada uma série de certificados digitais dessas autoridades. Assim, quando você acessa um site (por exemplo, google.com), é possível verificar se o certificado usado por esse site foi emitido para a "identidade" google.com, e se esse certificado foi assinado por uma autoridade confiável. Esse processo é conhecido como Chain Trust (em alusão à cadeia de certificados usados para assinar outros certificados).

Durante o processo de desenvolvimento, frequentemente nos deparamos com cenários onde precisamos que nossas aplicações estejam preparadas para rodar em ambientes seguros (por exemplo, um webservice que será chamado via https). Para os ambientes de desenvolvimento e testes, pode ser conveniente usar certificados auto-assinados em vez de certificados adquiridos das autoridades certificadoras.

Certificados Auto-Assinados (Self-signed Certificates)


O truque, nesse caso, é criarmos nós mesmos um certificado digital e instalar esse certificado no ambiente de desenvolvimento para ser reconhecido como uma autoridade certificadora confiável. Assim, podemos usar esse certificado para assinarmos nós mesmos certificados que serão tratados, nesse ambiente, como confiáveis (daí o "auto-assinado").

É importante notar que isso cria uma brecha de segurança importante! Qualquer pessoa de posse do seu certificado poderá assinar outros certificados que serão tradados, dentro desse ambiente, como confiáveis.

Como você não vai querer que alguém consiga se passar pelo seu banco, provedor de e-mail... Ou enfim, qualquer outro agente com o qual você comunique informação sensível, é indicado proteger suas chaves privadas com uma senha forte (forte MESMO, leve isso a sério!). Além disso, remova o certificado auto-assinado da lista de certificados confiáveis assim que seus testes terminarem.

E nunca é demais lembrar: NUNCA USE CERTIFICADOS AUTO-ASSINADOS NUM AMBIENTE DE PRODUÇÃO.

A configuração de um ambiente SSL de desenvovlimento envolve os seguintes passos:

Passo 1: Criando a Autoridade Certificadora


Abra o prompt de comando do Visual Studio (como administrador). Navegue até o diretório onde você quer armazenar seus certificados de teste e faça a seguinte chamada ao programa makecert.exe:

makecert -n "CN=DevTestAuthority" -cy authority -a sha1 -sv "DevTestAuthority.pvk" -r "DevTestAuthority.cer"

Os parâmetros que passamos para o makecert quando emitimos esse certificado são:



-n: A identidade (ou nome) do detentor do certificado. Para um website, deve corresponder exatamente ao domínio do site.
-cy authority: Especifica que estamos criando um certificado para uma autoridade certificadora
-a sha1: Especifica o algoritmo de criptografia empregado (SHA1, nesse caso)
-sv: A chave privada que será utilizada. Caso não exista a chave privada especificada, uma nova será criada.
-r: Emite um certificado auto-assinado, ou seja, nenhum outro certificado será usado pra assinar este. Ele será a "raiz" da cadeia de certificados
DevTestAuthority.cer: O nome do arquivo do certificado

Ao executar esse comando pela primeira vez, será pedida uma senha para a chave privada. Lembre de fornecer uma senha forte!

Passo 2: Instalando o Certificado Recém Criado Para Uma Autoridade Certificadora Confiável


Em Iniciar > Executar, busque por mmc.exe.



Agora, no menu "File > Add/Remove Snap-In"



Escolha "Certificates" e clique na seta para a direita para adicionar este Snap-In



Na sequência, uma janela de diálogo solicitará para qual computador você deseja gerenciar os certificados. Deixe selecionada a opção "Local Computer" e clique em "Finish".

Você verá o painel abaixo. Agora, vamos adicionar nosso certificado a "Trusted Root Certification Authorities", para que ele passe a ser reconhecido em nosso computador local como o certificado de uma autoridade certificadora confiável. Então, poderemos usar este certificado para assinar nossos certificados de desenvolvimento.

Clique com o botão direito sobre Trusted Root Certification Authorities > All Tasks > Import. Isso abrirá o diálogo para importar nosso certificado. Siga os passos na tela, e quando perguntado sobre o arquivo do certificado, escolha o arquivo DevTestAuthority.cer que criamos usando a ferramenta makecert:





Após isso, nosso certificado será exibido na lista de autoridades confiáveis.



Agora podemos emitir nossos certificados de desenvolvimento e assiná-los com nossa Autoridade Certificadora.

Passo 3: Emitir um Certificado e Assiná-lo com a Autoridade Certificadora


Para isso, voltarmeos ao markecert com o seguinte comando:

makecert -n "CN=seudominio.com" -ic "DevTestAuthority.cer" -iv "DevTestAuthority.pvk" -a sha1 -sky exchange -pe -sv "meudominio.com Private Key.pvk" "meudominio.com.cer"



Durante, você será perguntando sobre a senha do "Issuer" (emissor, ou autoridade certificadora), que é a senha que usamos para criar o certificado anterior. Também será pedida uma senha para a chave privada do certificado que estamos criando agora. Novamente, escolha uma senha forte.

Dessa vez, alguns dos parâmetros são um pouco diferentes dos que usamos para criar o certificado da Autoridade Certificadora:

-n: O nome do certificado. No caso de websites, é o nome do domínio (ex: meudominio.com)
-ic: O certificado que usaremos como Autoridade Certificadora, para assinar o novo certificado
-iv: O arquivo que contém a chave-privada da autoridade certificadora (foi criado no passo anterior)
-a sha1: O algoritmo de criptografia. Estamos usando sha1 neste exemplo
-sky exchange: Especifica que nosso certificado pode fazer troca de chaves (key exchange)
-pe: Especifica que a chave privada do certificado será exportável
-sv: A chave privada que será usada (ou criada, caso ainda não exista)
meudominio.com.cer: O nome do arquivo que conterá o certificado

Passo 4: Instalação do Certificado Auto-Assinado


O último passo será combinar a chave privada e o certificado recém criados num único arquivo PFX, usando a ferramenta pvk2pfx:

pvk2pfx -pvk "meudominio.com Private Key.pvk" -spc "meudominio.com.cer" -pfx "meudominio.com.pfx" -pi SenhaDaPrivateKey

Usando os seguintes parâmetros:

-pvk: O arquivo da chave privada do certificado
-spc: O arquivo do certificado que será colocado no arquivo PFX
-pfx: O nome do arquivo PFX que será criado
-pi: A senha da chave privada do certificado (a mesma que você usou quando criou o certificado usando o makecert).



Agora, basta importar o arquivo PFX criado para sua Store local de certificados, um procedimento parecido com o que usamos para importar o certificado da Autoridade Certificadora. Veja abaixo os passos:

Abra o assistente de importação, dessa vez na guia "Personal" em vez de "Trusted Root Certification Authorities":


Os passos serão os mesmos de antes, mas em vez de escolher o arquivo .cer, dessa vez vamos importar o arquivo de extensão .pfx:


O assistente perdirá a senha do certificado. Conclua os passos do assisnte e PRONTO! Agora você tem uma autoridade certificadora confiável e um certificado emitido por ela para uso no seu ambiente de testes e desenvolvimento :)


Nenhum comentário:

Postar um comentário