Você está na página 1de 14

Apesar dos custos para emisso de certificados digitais ICP-Brasil estarem cada vez mais em

conta, os gastos ainda podem inviabilizar projetos em empresas de pequeno ou mdio porte,
onde as prioridades muitas vezes so outras. Mas possvel criar uma Infra-estrutura de
Chaves Pblicas prpria a custo zero e prover um nvel de segurana bem prximo daquele
alcanado com certificados ICP-Brasil. Veja alguns detalhes sobre a lgica por trs de uma ICP
e, no fim, um script que fiz a fim de facilitar a emisso de certificados!
Superficialmente falando, o funcionamento de uma ICP baseia-se inteiramente em
criptografias assimtricas. Cada entidade, seja ela a Autoridade Certificadora, um usurio ou
servidor, tem sua chave pblica e sua chave privada a fim de garantir sua identidade ou ler
mensagens a ela endereadas. Cada certificado emitido para um usurio ou servidor deve ser
assinado por uma Autoridade Certificadora, cujo certificado garante a autenticidade daqueles
que forem emitidos por ela.
Portanto, para criar uma ICP prpria, o primeiro passo da empresa criar sua Autoridade
Certificadora. Para isso, deve-se criar uma chave privada que ser usada para assinar todos os
certificados emitidos pela AC, inclusive o dela. De posse da chave privada da AC, j possvel
criar oCertificado da AC para ser instalado nos navegadores, servidores de Internet e onde
mais for necessrio verificar a autenticidade dos certificados emitidos pela Autoridade
Certificadora.
Depois de criar a AC, j possvel emitir certificados digitais para usurios e servidores. Esses
certificados podero ser usados para atividades como prover conexes HTTPS, assinar
documentos(sem valor jurdico, mas pode ter valor interno normatizado na empresa),
identificar o usurio etc. Para gerar um certificado, o usurio deve primeiramente criar
sua chave privada. Com ela, o usurio faz uma requisio de certificado que, depois de
assinada pela AC, gera um certificado digital pronto para uso. Entretanto, para importar esse
certificado num navegador, deve-se export-lo para o formato PKCS12.
Apesar de parecer um tanto quanto complicado, devemos ter em mente que todas essas
assinaturas, validaes, codificaes e decodificaes no passam de criptografias
assimtricas. Um certificado de Autoridade Certificadora s reconhece os certificados emitidos
por sua chave privada porque h neles um conjunto de dados codificados por ela que s
podem ser decodificados pela chave pblica, contida no certificado. semelhante ao que
acontece na emisso de requisio de certificado e em todas as outras situaes.
Pondo a mo na massa, fiz o script abaixo para automatizar o processo de implantao de uma
Infra-estrutura de Chaves Pblicas. Vale ressaltar que os certificados emitidos so
considerados do tipo A1 e que a chave privada da Autoridade Certificadora deve ser mantida
em local extremamente seguro. Tambm importante dizer que o script foi feito no Ubuntu
10.10 com o OpenSSL instalado. Logo, apesar de funcionar em quase todas as distribuies,
desde que tenha o OpenSSL.
Num prximo post, falarei como usar uma ICP para montar uma pgina onde o usurio possa
ser identificado nica e exclusivamente com seu certificado digital.

#!/bin/bash
# Variaveis de uso geral
FUNCAO="0"
Arquivo=$(basename $0)
#
# Funcao que exibe ajuda sobre uso do script
#
function Uso()
{
echo "
-------------------------------------------------------------------------$Arquivo v0.3 - Autor: Pericles Luz <pericles.luz@gmail.com>"
echo "
Uso:
Para criar a chave da AC Raiz:
$Arquivo -1 [-p <nome>] [-b <bits>]
-p nome do arquivo para a chave privada da AC Raiz, sem extensao
-b numero de bits da chave privada
Se nao for informado o numeros de bits da chave, sera usado 4096
Para criar o certificado da AC Raiz:
$Arquivo -2 [-p <nome>] [-c <nome>] [-v <validade>]
-p nome do arquivo para a chave privada da AC Raiz, sem extensao
-c nome do arquivo para o certificado da AC Raiz, sem extensao
-v validade, em dias, do certificado da AC Raiz
Se nao for informado o numero de dias da validade, sera usado
3650(10 anos)
Para criar uma chave privada de usuario:
$Arquivo -3 [-k <nome>] [-r <nome>] [-b <bits>]
-k nome do arquivo para a chave privada do usuario, sem extensao
-b numero de bits da chave privada
Se nao for informado o numeros de bits da chave, sera usado 4096
Para criar uma requisicao de certificado:
$Arquivo -4 [-k <nome>] [-r <nome>]
-k nome do arquivo para a chave privada do usuario, sem extensao
-r nome do arquivo para a requisicao de certificado, sem
extensao
Para assinar o certificado:
$Arquivo -5 [-r <nome>] [-f <nome>] [-v <validade>] [-p <nome>] [c <nome>]
-r nome do arquivo para a requisicao de certificado, sem
extensao
-f nome do arquivo para o certificado do usuario, sem extensao
-v validade, em dias, do certificado da AC Raiz
-p nome do arquivo para a chave privada da AC Raiz, sem extensao
-c nome do arquivo para o certificado da AC Raiz, sem extensao
Se nao for informado o numero de dias da validade, sera usado
730(2 anos)
Para exportar o certificado para PKCS12 a fim de ser usado no
navegador:
$Arquivo -6 [-k <nome>] [-f <nome>] [-x <nome>]
-k nome do arquivo para a chave privada do usuario, sem extensao
-f nome do arquivo para o certificado do usuario, sem extensao
-x nome do arquivo para o certificado do PKCS12, sem extensao

Para fazer tudo de uma vez:


$Arquivo -0 ou apenas $Arquivo
- As opcoes sao as mesmas acima
------------------------------------------------------------------------------$Arquivo -h (mostra help)
"
exit -1
}
#
# Cria chave privada da Autoridade Certificadora
#
function CriaChaveRaiz
{
if [ "$BITS" = "" ]
then
BITS=4096
fi
if [ $BITS -ne 1024 ] && [ $BITS -ne 2048 ] && [ $BITS -ne 4096 ]
then
BITS=4096
fi
if [ "$ARQ_CP" = "" ]
then
ARQ_CP="cp-raiz"
fi
echo "----------------------------------------------------------"
echo "Criando chave privada para Autoridade Certificadora Raiz"
echo "----------------------------------------------------------"
echo "Executando comando: openssl genrsa -des3 -out $ARQ_CP.key
$BITS"
echo "----------------------------------------------------------"
echo "Informe uma senha quando for solicitado."
echo "----------------------------------------------------------"
echo "Tecle <ENTER> para continuar..."
read
openssl genrsa -des3 -out $ARQ_CP.key $BITS
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_CP.key ]
then
echo "$Arquivo - Erro gerando a chave privada da AC Raiz!"
Uso
fi
}
#
# Cria o certificado para a Autoridade Certificadora
#
function CriaCertificadoRaiz
{
if [ "$ARQ_CP" = "" ]
then
ARQ_CP="cp-raiz"
fi
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_CP.key ]

then
echo "$Arquivo - Chave privada da AC Raiz nao encontrada!"
Uso
fi
if [ "$ARQ_CERT" = "" ]
then
ARQ_CERT="cert-raiz"
fi
if [ "$VALIDADE" = "" ]
then
VALIDADE=3650
fi
if [ $VALIDADE -lt 1 ]
then
VALIDADE=3650
fi
echo "----------------------------------------------------------"
echo "Criando certificado para Autoridade Certificadora Raiz"
echo "----------------------------------------------------------"
echo "Executando comando: openssl req -new -x509 -days $VALIDADE key $ARQ_CP.key -out $ARQ_CERT.crt"
echo "----------------------------------------------------------------------"
echo "Este comando gerara o certificado da AC Raiz."
echo "Voce devera informar a senha da chave privada e, em seguida,"
echo "serao solicitados outros dados, para os quais sugiro:"
echo "Country Name: BR"
echo "State or Province: Seu estado, por exemplo, Minas Gerais"
echo "Organization Name: O nome de sua empresa"
echo "Organizational Unit Name: Nao precisa preencher, mas sugiro
Registro"
echo "Common Name: Identificara sua AC, sugiro AC da Empresa"
echo "Email Address: Seu email"
echo "Tecle <ENTER> para continuar..."
echo "----------------------------------------------------------------------"
read
openssl req -new -x509 -days $VALIDADE -key $ARQ_CP.key -out
$ARQ_CERT.crt
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_CERT.crt ]
then
echo "$Arquivo - Erro gerando o certificado da AC Raiz!"
Uso
fi
}
#
# Cria chave privada de usuario ou servidor
#
function CriaChaveUsuario
{
if [ "$BITS" = "" ]
then
BITS=4096
fi
if [ $BITS -ne 1024 ] && [ $BITS -ne 2048 ] && [ $BITS -ne 4096 ]
then
BITS=4096

fi
if [ "$ARQ_CPU" = "" ]
then
ARQ_CPU="cp-usuario"
fi
echo "----------------------------------------------------------"
echo "Criando chave privada para Usuario ou Servidor"
echo "----------------------------------------------------------"
echo "Executando comando: openssl genrsa -des3 -out $ARQ_CPU.key
$BITS"
echo "----------------------------------------------------------"
echo "Informe uma senha quando for solicitado."
echo "----------------------------------------------------------"
echo "Tecle <ENTER> para continuar..."
read
openssl genrsa -des3 -out $ARQ_CPU.key $BITS
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_CPU.key ]
then
echo "$Arquivo - Erro gerando a chave privada do usuario!"
Uso
fi
}
#
# Cria requisicao de certificado de usuario ou servidor
#
function CriaRequisicao
{
if [ "$ARQ_CPU" = "" ]
then
ARQ_CPU="cp-usuario"
fi
# Se o arquivo nao foi encontrado
if [ ! -e $ARQ_CPU.key ]
then
echo "$Arquivo - Chave privada do usuario nao encontrada!"
Uso
fi
if [ "$ARQ_REQU" = "" ]
then
ARQ_REQU="req-usuario"
fi
echo "----------------------------------------------------------"
echo "Criando requisicao de certificado para usuario ou servidor"
echo "----------------------------------------------------------"
echo "Executando comando: openssl req -new -key $ARQ_CPU.key -out
$ARQ_REQU.csr"
echo "----------------------------------------------------------------------"
echo "Este comando gerara uma requisicao de certificado."
echo "Voce devera informar a senha da chave privada e, em seguida,"
echo "serao solicitados outros dados, para os quais sugiro:"
echo "Country Name: BR"
echo "State or Province: Seu estado, por exemplo, Minas Gerais"
echo "Organization Name: O nome de sua empresa"
echo "Organizational Unit Name: Nao precisa preencher, mas sugiro
Registro"

echo "Common Name: Nome do usuario ou FQDN do servidor"


echo "Email Address: Seu email"
echo "A challenge password: Deixe em branco"
echo "An optional company name : Deixe em branco"
echo "Tecle <ENTER> para continuar..."
echo "----------------------------------------------------------------------"
read
openssl req -new -key $ARQ_CPU.key -out $ARQ_REQU.csr
if [ ! -e $ARQ_REQU.csr ]
then
echo "$Arquivo - Erro gerando a requisicao de certificado do
usuario!"
Uso
fi
}
#
# Assinar requisicao, criando certificado de usuario ou servidor
#
function AssinaRequisicao
{
if [ "$VALIDADE" = "" ]
then
VALIDADE=730
fi
if [ "$ARQ_CP" = "" ]
then
ARQ_CP="cp-raiz"
fi
if [ ! -e $ARQ_CP.key ]
then
echo "$Arquivo - Chave da AC Raiz nao encontrada!"
Uso
fi
if [ "$ARQ_REQU" = "" ]
then
ARQ_REQU="req-usuario"
fi
if [ ! -e $ARQ_REQU.csr ]
then
echo "$Arquivo - Requisicao nao encontrada!"
Uso
fi
if [ "$ARQ_CERT" = "" ]
then
ARQ_CERT="cert-raiz"
fi
if [ ! -e $ARQ_CERT.crt ]
then
echo "$Arquivo - Certificado da AC Raiz nao encontrado!"
Uso
fi
if [ "$ARQ_CERTU" = "" ]
then
ARQ_CERTU="cert-usuario"
fi

echo "----------------------------------------------------------"
echo "Assinando requisicao e gerando certificado"
echo "----------------------------------------------------------"
echo "Executando comando:"
echo " openssl x509 -req -in $ARQ_REQU.csr -out $ARQ_CERTU.crt -sha1
-CA $ARQ_CERT.crt -CAkey $ARQ_CP.key -CAcreateserial -days $VALIDADE"
echo "----------------------------------------------------------"
echo "Informe uma senha quando for solicitado."
echo "----------------------------------------------------------"
echo "Tecle <ENTER> para continuar..."
read
openssl x509 -req -in $ARQ_REQU.csr -out $ARQ_CERTU.crt -sha1 -CA
$ARQ_CERT.crt -CAkey $ARQ_CP.key -CAcreateserial -days $VALIDADE
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_CERTU.crt ]
then
echo "$Arquivo - Erro gerando assinando requisicao!"
Uso
fi
}
#
# Assinar requisicao, criando certificado de usuario ou servidor
#
function ExportaPKCS12
{
if [ "$ARQ_CPU" = "" ]
then
ARQ_CPU="cp-usuario"
fi
if [ ! -e $ARQ_CPU.key ]
then
echo "$Arquivo - Chave do usuario nao encontrada!"
Uso
fi
if [ "$ARQ_CERTU" = "" ]
then
ARQ_CERTU="cert-usuario"
fi
if [ ! -e $ARQ_CERTU.crt ]
then
echo "$Arquivo - Certificado do usuario nao encontrado!"
Uso
fi
if [ "$ARQ_PKCS12" = "" ]
then
ARQ_PKCS12="cert-usuario"
fi
echo "----------------------------------------------------------"
echo "Exportando certificado para PKCS12"
echo "----------------------------------------------------------"
echo "Executando comando:"
echo " openssl pkcs12 -export -in $ARQ_CERTU.crt -inkey $ARQCPU.key
-name \"Certificado do usuario\" -out $ARQ_PKCS12.p12"
echo "----------------------------------------------------------"
echo "Informe a senha da chave do usuario quando for solicitado."
echo "E uma senha a ser usada na importacao do certificado para"

echo "o navegador."


echo "----------------------------------------------------------"
echo "Tecle <ENTER> para continuar..."
read
openssl pkcs12 -export -in $ARQ_CERTU.crt -inkey $ARQ_CPU.key -name
'"Certificado do usuario"' -out $ARQ_PKCS12.p12
# Se o arquivo nao foi gerado
if [ ! -e $ARQ_PKCS12.p12 ]
then
echo "$Arquivo - Erro exportando certificado!"
Uso
fi
}
# Definindo opcoes
while getopts "h0123456p:c:f:k:e:v:b:x:" OPT; do
case $OPT in
"h") Uso;;
"p") ARQ_CP=$OPTARG;;
"c") ARQ_CERT=$OPTARG;;
"f") ARQ_CERTU=$OPTARG;;
"k") ARQ_CPU=$OPTARG;;
"e") ARQ_REQU=$OPTARG;;
"v") VALIDADE=$OPTARG;;
"b") BITS=$OPTARG;;
"x") ARQ_PKCS12=$OPTARG;;
"1") FUNCAO="1";;
"2") FUNCAO="2";;
"3") FUNCAO="3";;
"4") FUNCAO="4";;
"5") FUNCAO="5";;
"6") FUNCAO="6";;
*) echo "opcao desconhecida";
exit 1;;
esac
done
# Executando os procedimentos
case $FUNCAO in
"1") CriaChaveRaiz;;
"2") CriaCertificadoRaiz;;
"3") CriaChaveUsuario;;
"4") CriaRequisicao;;
"5") AssinaRequisicao;;
"6") ExportaPKCS12;;
"0") CriaChaveRaiz;
CriaCertificadoRaiz;
CriaChaveUsuario;
CriaRequisicao;
AssinaRequisicao;
ExportaPKCS12;;
*) echo "Opcao indefinida";
exit 1;;
esac
exit 0

Receba as novidades do site via RSS


Segurana, software livre
Posts Relacionados
Crypto - Aplicativo para Android
Primeiros passos em assembly
Entendendo a partilha de senhas - parte final
Entendendo a partilha de senhas - parte II
Entendendo a partilha de senhas

Submarino.com.br

20 Comentrios

Jos Rosa
maro 11th, 2011 on 9:43

Pricles,
Mais uma vez voc desmistifica a tecnologia, at para ns que trabalhamos com isso h anos.
Parabns !
ab, Jos Rosa.
Responder

Marcus Aurelius
maro 11th, 2011 on 10:43

Muito til! Parabns e obrigado!


J conhecia os conceitos bsicos, mas tem coisa que eu s entendo mesmo depois de ver os comandos,
hehe!
Responder

Pricles Luz
maro 11th, 2011 on 10:47

Marcus,

Fico feliz que tenha gostado. Nos prximos posts falarei mais sobre o assunto e espero que possa lhe
ser til.
Muito obrigado!
Responder

Jos Lus
maro 23rd, 2011 on 17:13

Muito interessante, Pricles. Isso extremamente til para identificar mquinas conectadas por uma rede
insegura, como a internet.
Uma vez que no est inserida na ICP-Brasil, essa certificao ser reconhecida por outras
organizaes?
Responder

Pricles Luz
maro 23rd, 2011 on 19:05

Grande Z,
As organizaes que decidirem usar uma ICP, mesmo que a ICP-Brasil, devem configurar seus
servidores e/ou navegadores para confiarem no certificado da Autoridade Certificadora daquela ICP.
Logo, se uma entidade quiser usar uma ICP prpria como incremento de segurana sem custo, deve
disponibilizar o certificado de sua AC para que os usurios instalem em seus navegadores e/ou
servidores. isso que acontece com a ICP-Brasil, o certificado de sua AC-Raiz fica disposio de
todos.
Um abrao!
Responder

Jos Lus
maro 23rd, 2011 on 23:25

Foi o que imaginei.


Mas a, talvez fiquemos com outro problema: se muitas empresas comearem e oferecer em seus
sites as chaves pblicas de suas AC, sem uma cadeia de certificao confivel e baseada em uma
instituio j conhecida (como a ICP-Brasil, o governo, um banco, etc.), os usurios no enfrentariam
dificuldades para diferenciar AC legtimas (como uma loja pequena que monte sua prpria ICP) de
AC falsas (como um bandido que forja o site de uma empresa real e acrescenta uma AC para dar
mais credibilidade)?
Responder

Pricles Luz
maro 23rd, 2011 on 23:46

Sei raciocnio est correto. Justamente por isso, cada empresa deve avaliar bem onde usar uma
ICP prpria e onde usar a ICP-Brasil ou outra igualmente vlida. O recomendvel que a segunda
opo seja adotada sempre que se necessitar de f pblica ou validade legal. Entretanto, muitas
empresas tem aplicaes internas que ganhariam muito em segurana se utilizasse certificados
digitais. Mas o preo de certificar todos os funcionrios e servidores pode ser proibitivo ou
desestimulante. A que entra a opo da ICP prpria.
Quanto s AC falsas, j so largamente usadas e, novamente, seu raciocnio est correto. Os
usurios geralmente no identificam um site com certificado no confivel porque j se
acostumaram a ignorar os alertas do navegador.
Um grande abrao e, novamente, muito obrigado pela discusso!
Responder

Jos Lus
maro 24th, 2011 on 13:35

Obrigado pela ateno, Pricles.


Com relao minha dvida, pelo visto minha suposio inicial estava correta: de um ponto de
vista global, esse procedimento seria mais indicado para uso interno, sem dar conhecimento ao
povo em geral (usurios externos).
Traando um paralelo, a RFB poderia economizar bastante se usasse uma AC sob a ICP-Brasil
para se relacionar com os contribuintes e uma AC com ICP prpria para a autenticao de
usurios. Isso, claro, sem considerar as implicaes correcionais...

Pricles Luz
maro 24th, 2011 on 20:19

Caro Z,
Eu que agradeo!
Voc est corretssimo quanto ao uso interno. Mas possvel tambm que uma entidade use
uma ICP prpria "apenas" para prover um canal HTTPS a seus usurios. Por exemplo, uma
universidade pode usar uma ICP prpria para que seus usurios(funcionrios, alunos e
professores) possam acessar Intranets sem atravs de um canal seguro, mitigando o risco de
sniffers roubando senhas ou o prprio trfego.
No caso da RFB, h a questo da necessidade de valor legal aos atos praticados pelos
funcionrios com os certificados digitais. Dessa forma, a nica alternativa usar um certificado
ICP-Brasil.
Um abrao!

Andrei
maro 21st, 2012 on 12:12

Meu caro, o site est dando pau. No possvel obter o script. Teria como verificar?
Grato.
Andrei Garcia

Responder

Pricles Luz
maro 21st, 2012 on 12:15

Meu caro,
Resolvido!
Obrigado por avisar!
Responder

Andrei
maro 21st, 2012 on 12:26

Que isso grande,


Obrigado voc por resolver to prontamente.
Grande abrao e parabns pelo script.
Responder

carolina
abril 16th, 2013 on 15:17

Prezado, li sua materia sobre como criar uma ICP interna. Contudo, voce se baseou em qual legislao
para que haja legitimidade nessa criaao? porque a ICP Brasil a unica regulamentada no nosso pais e
para que as entidades federais e estatais tenham seus certificados digitais, necessario realizar atraves
do ICP Brasil, ou de alguma AC devidamente habilitada pela RFB. Dvida cruel que surgiu aqui
Responder

Pricles Luz
abril 16th, 2013 on 20:05

Prezada Carolina,
Como foi dito no texto, o certificado no tem valor jurdico. Vendo seu comentrio, percebi que deveria
deixar claro que o motivo exatamente esse colocado por voc: s certificados ICP-Brasil podem ter
valor legal e garantir o no repdio. Obrigado pelo comentrio!
Entretanto, uma empresa pode querer montar uma ICP prpria apenas para prover segurana. Por
exemplo, acessos SSH, sites HTTPS com ou sem autenticao, estrutura interna de assinaturas de
memorandos etc). Este era o foco do post, mas volto a dizer, voc est correta em sua avaliao.
Responder

carolina
abril 17th, 2013 on 14:35

Obrigada pelo esclarecimento, Pricles!


Estava ligeiramemte preocupada porque infelizmente no temos uma lei para gerir questoes dessa
natureza. Temos apenas a MP 2200/2001 e o Dec. n 43.888/2004. Muito menos a criao de ICP's
internos. Mas voce esclareceu a questao.
Obrigada.
Responder

Larimer Daniel
maio 7th, 2013 on 17:34

Excelente matria.
Sobre a validade jurdica preciso esclarecer que o pargrafo 2, do artigo 10 da MP 2200 deixa
indiscutvel que os certificados emitidos privadamente (fora da ICP Brasil) so perfeitamente
vlidos desde que aceitos pelas partes. Ento, seja para uso nos contratos, seja em transaes de
qualquer natureza, basta formalizar a anuencia dos titulares dos certificados e das organizaes
que iro aceit-los. O municpio de Florianpolis aceita certificados privados h mais de 10 anos.
Responder

Pricles Luz
maio 7th, 2013 on 18:13

Meu caro,
Muito obrigado pela informao! Eu realmente desconhecia.
Um abrao,

rafael
setembro 25th, 2013 on 17:47

Ol estou implementando um ambiente de teste para que os desenvolvedores programem sem precisar
de certificado digital valido, o seu script e excelente, funcionou muito bem. Agora precisamos adicionar
informaes nestes certificados digitais como CPF, RG e etc, para validao no sistema simulando um
ambiente de produo. como o procedimento para inserir estas informaes no certificado?
Responder

Pricles Luz
outubro 4th, 2013 on 11:12

Prezado Rafael,

Basta editar o arquivo de configurao a ser usado para gerao dos certificados e inserir os camppos
desejados.
Um abrao!
Responder

Carlos Augustini
outubro 3rd, 2013 on 18:42

Obrigado, uma luz ao final do tnel hehehe


Abrao!
Responder

Você também pode gostar