Original Article: Creating and Using SSL Certificates
Author: Marcus Redivo

Criação e Uso de Certificados SSL

Este documento descreve como você pode se tornar uma autoridade de certificação raiz (CA-raiz) utilizando a ferramenta OpenSSL. Enquanto CA-raiz, você será capaz de se logar e instalar certificados para uso nas suas aplicações do seu servidor de Internet, tais como o Apache e Stunnel.

Índice

Escopo

Este documento cobre um propósito bem específico e limitado, mas que supre uma necessidade comum: prevenindo navegador, e-mail, e outros clientes de reclamarem acerca dos certificados instalados nos seus servidores.

O uso de autorização de certificados raiz comercial (CA) não é tratado aqui. Ao invés disso, nós nos tornaremos o nosso próprio CA-raiz, e assinaremos nossos próprios certificados.

Estes procedimentos foram desenvolvidos usando OpenSSL 0.9.6, 24 de Setembro de 2000, no Linux.

Começar Já

Aqueles que já desejam iniciar a criação dos seus próprios certificados sem ler todo este documento, devem se redirecionar ao sumário no final desta pagina.

Contexto

Porque ser o seu próprio CA? Pois assim podemos tirar vantagem da encriptação SSL sem gastar dinheiro desnecessário em ter os nossos certificados assinados.

Uma desvantagem é que navegadores ainda podem reclamar sobre os nossos sites não serem confiáveis até que o nosso certificado raiz seja importado. Entretanto, uma vez que isso seja feito, nós não somos diferentes de forma alguma das autoridades de certificação raiz comerciais.

Clientes só importarão nossos certificados raiz se nos considerarem confiáveis. É aí onde as autoridades comerciais entram: eles sugerem serem capazes de fazer uma pesquisa extensa acerca das pessoas e organizações para quem assinam os certificados. Na importação (na verdade, na incorporação do vendedor do navegador) dos seus certificados raiz confiáveis, estamos dizendo que nós confiamos neles quando os mesmos garantem que um outrém seja quem reivindicam ser. Nós podemos confiar nas autoridades de certificação raízes adicionais (como nós mesmos) através da importação dos seus certificados.

Nota: Se você está nos negócios de gerenciamento de sites comerciais seguros, obter um certificado assinado comercialmente é a única opção realista.

Pré-requisitos

Você vai precisar de uma cópia instalada do OpenSSL para isso, a qual está disponível em http://www.openssl.org. É possível de que você já a tenha instalada na sua máquina. Este documento não vai tratar do procedimento de instalação.

Configuração inicial

Primeiro, nós vamos criar um diretório onde possamos trabalhar. Não importa onde isso seja; Eu vou arbitrariamente criá-lo em meu diretório de trabalho.

# mkdir CA
# cd CA
# mkdir newcerts private

O diretório AC vai conter:

  • Nosso Certificado de Autoridade de Certificação (CA)
  • O banco de dados dos certificados que já tenhamos assinado
  • As chaves, solicitações, e certificados que geramos
Também será nosso diretório de trabalho quando criarmos ou assinarmos certificados.

O diretório CA/newcerts vai conter:

  • Uma cópia de cada certificado que assinarmos
O diretório CA/private vai conter:

  • Nossa chave privada CA
Esta chave é importante:

  • Não perca esta chave. Sem ela, você não poderá assinar ou renovar quaisquer certificados.
  • Não divida esta chave com ninguém. Se estiver comprometida, outros serão capazes de personificar você.
Nosso próximo passo é criar um banco de dados para os certificados que assinaremos:

# echo '01' >serial
# touch index.txt

Ao invés de usar o arquivo de configuração que vem com o OpenSSL, nós criaremos uma configuração mínima própria neste diretório. Inicie o seu editor (vi, pico, …) e crie um openssl.cnf básico:

---Begin---
#
# OpenSSL configuration file.
#

# Establish working directory.

dir			= .

----End----

Criando um Certificado Raiz

Com o OpenSSL, uma grande parte do que vai em um certificado depende dos conteúdos do arquivo de configuração, ao invés da linha de comando. Isto é algo bom, pois há muito o que especificar.

O arquivo de configuração é dividido em seções, que são seletivamente lidas e processadas de acordo com os argumentos da linha de comando openssl. Seções podem incluir uma ou mais seções por meio de referências, o que ajuda tornar o arquivo de configuração mais modular. Um nome em colchetes (e.g. “ [ req ]”) inicia cada seção.

Agora nós precisamos adicionar a seção que controla como os certificados são criados, e uma seção a fim de definir o tipo de certificado a ser criado.

A primeira coisa que precisamos especificar é o Nome Distinto. Isto é o texto que identifica o proprietário do certificado quando ele é visualizado. Não é diretamente referido no arquivo de configuração, mas é incluso na seção que é processada quando as solicitações de certificados são criadas. Se o comando é “openssl req ”, então a seção é intitulada [ req ].

Adicione o seguinte ao openssl.cnf:

---Begin---

[ req ]
default_bits		= 1024			# Size of keys
default_keyfile		= key.pem		# name of generated keys
default_md		= md5			# message digest algorithm
string_mask		= nombstr		# permitted characters
distinguished_name	= req_distinguished_name

[ req_distinguished_name ]
# Variable name		  Prompt string
#----------------------	  ----------------------------------
0.organizationName	= Organization Name (company)
organizationalUnitName	= Organizational Unit Name (department, division)
emailAddress		= Email Address
emailAddress_max	= 40
localityName		= Locality Name (city, district)
stateOrProvinceName	= State or Province Name (full name)
countryName		= Country Name (2 letter code)
countryName_min		= 2
countryName_max		= 2
commonName		= Common Name (hostname, IP, or your name)
commonName_max		= 64

# Default values for the above, for consistency and less typing.
# Variable name			  Value
#------------------------------	  ------------------------------
0.organizationName_default	= The Sample Company
localityName_default		= Metropolis
stateOrProvinceName_default	= New York
countryName_default		= US

[ v3_ca ]
basicConstraints	= CA:TRUE
subjectKeyIdentifier	= hash
authorityKeyIdentifier	= keyid:always,issuer:always

----End----
A fim de proteger a nós mesmos de uso inautorizado do nosso certificado CA, ele é protegido por código de passe. Cada vez que você usa o certificado CA para assinar uma solicitação, o código será pedido a você. Agora seria uma boa hora para escolher um código e guardá-lo em um local seguro.

Toda a preparação está pronta agora para a criação do nosso auto-assinado certificado de raiz. Para isso, precisamos sobrepor alguns dos padrões que acabamos de colocar na configuração, então especificaremos nossa sobreposição na linha de comando.

Nossa sobreposição de comando para “openssl req” são:

  • Criar um novo certificado auto-assinado: -new -x509
  • Criar um certificado CA: -extensions v3_ca
  • Tornar válido por mais de 30 dias: -days 3650
  • Escrever saída para locações específicas: -keyout, -out
  • Usar nosso arquivo de configuração: -config ./openssl.cnf
(Uma nota no termo de validade de certificados raiz: Quando um certificado raiz expirar, todos os certificados assinados com o mesmo não serão mais válidos. Para corrigir essa situação, um novo certificado raiz deve ser criado e distribuído. Da mesma forma, todos os certificados assinados com o que expirou devem ser revogados, e re-assinados com o novo. Por isso poder ser muito trabalhoso, você pode querer fazer seu certificado raiz válido por quanto tempo achar necessário. Neste exemplo, estamos tornado válido por dez anos.)

Execute o comando como mostrado. Neste caso, o código de passe PEM que ele pede é um novo, o qual você deve inserir duas vezes:

# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem \
-out cacert.pem -days 3650 -config ./openssl.cnf
Using configuration from ./openssl.cnf
Generating a 1024 bit RSA private key
.......++++++
..........................++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:demo
Verifying password - Enter PEM pass phrase:demo
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Organization Name (company) [The Sample Company]:<enter>
Organizational Unit Name (department, division) []:CA Division
Email Address []:[email protected]
Locality Name (city, district) [Metropolis]:<enter>
State or Province Name (full name) [New York]:<enter>
Country Name (2 letter code) [US]:<enter>
Common Name (hostname, IP, or your name) []:TSC Root CA

Este processo produz dois arquivos de saída:

  • Uma chave privada em private/cakey.pem
  • Um certificado raiz CA em cacert.pem
cacert.pem é o arquivo que você deve distribuir para os seus clientes.

A chave privada (cakey.pem) aparece assim:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,0947F49BB28FE5F4

jlQvt9WdR9Vpg3WQT5+C3HU17bUOwvhp/r0+viMcBUCRW85UqI2BJJKTi1IwQQ4c
tyTrhYJYOP+A6JXt5BzDzZy/B7tjEMDBosPiwH2m4MaP+6wTbi1qR1pFDL3fXYDr
ZsuN08dkbw9ML6LOX5Rl6bIBL3i5hnGiqm338Fl52gNstThv0C/OZhXT3B4qsJn8
qZb3mC6U2nRaP/NpZPcEx4lv2vH7OzHTu1TZ7t0asSpgpuH58dfHPw775kZDep2F
LXA3Oeavg0TLFHkaFBUx2xaeEG6Txpt9I74aAsw1T6UbTSjqgtsK0PHdjPNfPGlY
5U3Do1pnU9hfoem/4RAOe0cCovP/xf6YPBraSFPs4XFfnWwgEtL09ReFqO9T0aSp
5ajLyBOYOBKQ3PCSu1HQDw/OzphInhKxdYg81WBBEfELzSdMFQZgmfGrt5DyyWmq
TADwWtGVvO3pEhO1STmCaNqZQSpSwEGPGo5RFkyFvyvyozWX2SZg4g1o1X40qSg9
0FMHTEB5HQebEkKBoRQMCJN/uyKXTLjNB7ibtVbZmfjsi9oNd3NJNVQQH+o9I/rP
wtFsjs+t7SKrsFB2cxZQdDlFzD6EBA+5ytebGEI1lJHcOUEa6P+LTphlwh/o1QuN
IKX2YKHA4ePrBzdgZ+xZuSLn/Qtjg/eZv6i73VXoHk8EdxfOk5xkJ+DnsNmyx0vq
W53+O05j5xsxzDJfWr1lqBlFF/OkIYCPcyK1iLs4GOwe/V0udDNwr2Uw90tefr3q
X1OZ9Dix+U0u6xXTZTETJ5dF3hV6GF7hP3Tmj9/UQdBwBzr+D8YWzQ==
-----END RSA PRIVATE KEY-----
É claro que você não deve mostrar isso a ninguém! Desta forma, este mostrado aqui não é mais uma chave privada.

O certificado (cacert.pem) aparece assim:

-----BEGIN CERTIFICATE-----
MIIDrTCCAxagAwIBAgIBADANBgkqhkiG9w0BAQQFADCBnDEbMBkGA1UEChMSVGhl
IFNhbXBsZSBDb21wYW55MRQwEgYDVQQLEwtDQSBEaXZpc2lvbjEcMBoGCSqGSIb3
DQEJARYNY2FAc2FtcGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UE
CBMITmV3IFlvcmsxCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtUU0MgUm9vdCBDQTAe
Fw0wMTEyMDgwNDI3MDVaFw0wMjEyMDgwNDI3MDVaMIGcMRswGQYDVQQKExJUaGUg
U2FtcGxlIENvbXBhbnkxFDASBgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcN
AQkBFg1jYUBzYW1wbGUuY29tMRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQI
EwhOZXcgWW9yazELMAkGA1UEBhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBMIGf
MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaiAwfKB6ZBtnTRTIo6ddomt0S9ec0
NcuvtJogt0s9dXpHowh98FCDjnLtCi8du6LDTZluhlOtTFARPlV/LVnpsbyMCXMs
G2qpdjJop+XIBdvoCz2HpGXjUmym8WLqt+coWwJqUSwiEba74JG93v7TU+Xcvc00
5MWnxmKZzD/R3QIDAQABo4H8MIH5MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFG/v
yytrBtEquMX2dreysix/MlPMMIHJBgNVHSMEgcEwgb6AFG/vyytrBtEquMX2drey
six/MlPMoYGipIGfMIGcMRswGQYDVQQKExJUaGUgU2FtcGxlIENvbXBhbnkxFDAS
BgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcNAQkBFg1jYUBzYW1wbGUuY29t
MRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQIEwhOZXcgWW9yazELMAkGA1UE
BhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBggEAMA0GCSqGSIb3DQEBBAUAA4GB
ABclymJfsPOUazNQO8aIaxwVbXWS+8AFEkMMRx6O68ICAMubQBvs8Buz3ALXhqYe
FS5G13pW2ZnAlSdTkSTKkE5wGZ1RYSfyiEKXb+uOKhDN9LnajDzaMPkNDU2NDXDz
SqHk9ZiE1boQaMzjNLu+KabTLpmL9uXvFA/i+gdenFHv
-----END CERTIFICATE-----

Podemos inquirir os conteúdos do certificado com o openssl para saber a quem pertence, para o que é válido, etc.:

# openssl x509 -in cacert.pem -noout -text
# openssl x509 -in cacert.pem -noout -dates
# openssl x509 -in cacert.pem -noout -purpose

Criando uma Solicitação de Assinatura de Certificado (CSR)

Agora que temos um certificado raiz, podemos criar qualquer número de certificados para instalação nas nossas aplicações SSL tais como https, spop, ou simap. O procedimento envolve a criação de uma chave privada e uma solicitação de certificado, e então a assinatura da solicitação para gerar o certificado.

Nosso arquivo de configuração precisa de mais algumas definições para criar certificados não-CA. Adicione o seguinte ao final de cada arquivo:

---Begin---
[ v3_req ]
basicConstraints	= CA:FALSE
subjectKeyIdentifier	= hash

----End----
A fim de evitar ter que inserir esta linha de comando repetidamente, insira a seguinte linha à seção [ req ] depois da linha distinguished_name como indicado:

---Begin---
distinguished_name	= req_distinguished_name
req_extensions		= v3_req

----End----
Agora estamos prontos para criar nossa primeira solicitação de certificado. Neste exemplo, criaremos um certificado para um servidor POP seguro em mail.sample.com. Tudo está igual a quando criamos o certificado CA, mas três das seguintes solicitações recebem respostas diferentes.

  • Unidade Organizadora: um lembrete para o que serve o certificado
  • Endereço de e-mail: o postmaster
  • Nome Comum: o hostname do servidor
O Nome Comum deve ser (ou o endereço de IP deve remeter-se à) o nome do servidor que seus clientes usam para contatar seu host. Se isso não confere, toda vez que eles conectarem, seus clientes receberão uma mensagem perguntando se eles desejam usar o servidor. Na realidade, o software do cliente está dizendo, “Atenção! Você pediu mail.sample.com; o certificado do mecanismo respondedor é para smtp.sample.com. Está certo de que quer continuar?

# openssl req -new -nodes -out req.pem -config ./openssl.cnf
...
Organizational Unit Name (department, division) []:Mail Server
Email Address []:[email protected]
Common Name (hostname, IP, or your name) []:mail.sample.com
...

Este processo produz dois arquivos de saída:

  • Uma chave privada key.pem
  • Uma solicitação de assinatura de certificado em req.pem
Estes arquivos deveriam ser mantidos. Quando o certificado que você está prestes a criar expira, o pedido pode ser usado novamente a fim de criar um novo certificado com uma nova data de validade. A chave privada, claramente, será necessária para encriptação SSL. Quando você salva esses arquivos, nomes significativos ajudam; por exemplo, mailserver.key.pem e mailserver.req.pem.

A solicitação de assinatura de certificado aparece assim:

-----BEGIN CERTIFICATE REQUEST-----
MIICJDCCAY0CAQAwgagxGzAZBgNVBAoTElRoZSBTYW1wbGUgQ29tcGFueTEUMBIG
A1UECxMLTWFpbCBTZXJ2ZXIxJDAiBgkqhkiG9w0BCQEWFXBvc3RtYXN0ZXJAc2Ft
cGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UECBMITmV3IFlvcmsx
CzAJBgNVBAYTAlVTMRgwFgYDVQQDEw9tYWlsLnNhbXBsZS5jb20wgZ8wDQYJKoZI
hvcNAQEBBQADgY0AMIGJAoGBAPJhc++WxcBaoDbJpzFbDg42NcOz/ELVFMU4FlPa
yUzUO+xXkdFRMPKo54d4Pf1w575Jhlu9lE+kJ8QN2st6JFySbc9QjPwVwl9D2+I3
SSf2kVTu+2Ur5izCPbVAfU0rPZxxK8ELoOkA1uwwjFz6EFuVvnHwlguonWKDtmYW
u7KTAgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYE
FLWaQsUVIQzWr58HtDinH1JfeCheMA0GCSqGSIb3DQEBBAUAA4GBAAbe0jrGEQ3i
tyVfy5Lg4/f69rKvDGs+uhZJ9ZRx7Dl92Qq2osE7XrLB1bANmcoEv/ORLZOjWZEY
NjMvuz60O7R8GKBrvb/YhAwWhIIt2LJqPkpAEWS0kY0AkoQcfZ7h6oC35+eJ7okg
Uu3WuE57RgcNt7/ftr0sG1jUyRwMLvhv
-----END CERTIFICATE REQUEST-----
Podemos ver os conteúdos para garantir que nossa solicitação está correta:

# openssl req -in req.pem -text -verify -noout

Assinando um Certificado

Agora precisamos adicionar a seção do arquivo de configuração que trata acerca de ser uma Autoridade de Certificação. Esta seção vai identificar os caminhos para várias peças, tais como o banco de dados, o certificado CA, e a chave privada. Também proporciona alguns valores padrões básicos. Insira os comandos seguintes ao openssl.cnf logo antes da seção [ req ]:

---Begin---
[ ca ]
default_ca		= CA_default

[ CA_default ]
serial			= $dir/serial
database		= $dir/index.txt
new_certs_dir		= $dir/newcerts
certificate		= $dir/cacert.pem
private_key		= $dir/private/cakey.pem
default_days		= 365
default_md		= md5
preserve		= no
email_in_dn		= no
nameopt			= default_ca
certopt			= default_ca
policy			= policy_match

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

----End----
Para assinar a solicitação que fizemos no passo anterior, execute o que está apresentado a seguir e responda às solicitações. Perceba que será exigido o código de passe PEM selecionado anteriormente:

# openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
Using configuration from ./openssl.cnf
Enter PEM pass phrase:demo
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
organizationName      :PRINTABLE:'The Sample Company'
organizationalUnitName:PRINTABLE:'Mail Server'
emailAddress          :IA5STRING:'[email protected]'
localityName          :PRINTABLE:'Metropolis'
stateOrProvinceName   :PRINTABLE:'New York'
countryName           :PRINTABLE:'US'
commonName            :PRINTABLE:'mail.sample.com'
Certificate is to be certified until Dec  8 04:37:38 2002 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Este processo atualiza o banco de dados CA, e produz dois arquivos de saída

  • Um certificado em cert.pem
  • Uma cópia do certificado em newcerts/<serial>.pem
Novamente, você pode inspecionar o certificado:

# openssl x509 -in cert.pem -noout -text -purpose | more

Os certificados têm ambos as versões codificadas e a versão legível ao humano no mesmo arquivo. Você pode desmembrar a porção legível ao humano da seguinte maneira:

# mv cert.pem tmp.pem
# openssl x509 -in tmp.pem -out cert.pem

Instalando a Chave e Certificado

Isto depende da aplicação. Alguns preferem a chave e o certificado no mesmo arquivo, enquanto outros os preferem separadamente. Combinar ambos é facilmente feito com:

# cat key.pem cert.pem >key-cert.pem

Depois deste passo, você tem três componentes instaláveis de onde escolher:

  • Uma chave privada key.pem
  • Um certificado em cert.pem
  • Chave e Certificado combinados em key-cert.pem
Copie os arquivos apropriados em locações especificadas pelas instruções para a sua aplicação e sistema. Reinicie as aplicações, e você vai estar operando com seu novo certificado.

Apache

Apache tem diretórios de configuração separados para a chave e o certificado, então mantemos cada um em seu próprio arquivo. Estes arquivos deveriam ser mantidos fora do ramo DocumentRoot, então uma estrutura de diretório razoável pode ser:

ArquivoComentario
/home/httpd/htmlApache DocumentRoot
/home/httpd/sslSSL-related files
/home/httpd/ssl/cert.pemSite certificate
/home/httpd/ssl/key.pemSite private key

Dentro do diretório < VirtualHost > para o site (o qual, é claro, deve estar na porta 443), inclui as diretrizes que apontam para estes arquivos

<VirtualHost 192.168.1.1:443>
   ServerName mail.sample.com
   DocumentRoot /home/httpd/html
   ... other directives for this site ...
   SSLEngine on
   SSLLog /var/log/ssl_engine_log
   SSLCertificateFile /home/httpd/ssl/cert.pem
   SSLCertificateKeyFile /home/httpd/ssl/key.pem
</VirtualHost>

Stunnel

Stunnel é usado como um embrulho SSL para serviços normais são-seguros tais como IMAP e POP. Ele processa como argumentos (entre outras coisas) o serviço a ser executado, e a locação da chave privada e do certificado.

A chave e o certificado são encontrados no mesmo arquivo. Estes podem ser colocados em qualquer local, mas uma boa sugestão pode ser /etc/ssl/certs. Especifique-o na linha de comando Stunnel como a seguir:

stunnel -p /etc/ssl/certs/key-cert.pem <other stunnel args...>

Mais para vir...

Distribuindo o Certificado CA

Este, finalmente, é o passo que impede o cliente de reclamar dos certificados não confiáveis. Envie cacert.pem para qualquer pessoa que vá usar servidores seguros, dessa maneira eles podem instalá-los em seus navegadores, clientes de e-mail, etcetera como um certificado raiz.

Renovando Certificados

Sua cadeia de certificados pode quebrar devido à validade dos certificados de duas formas:

  • Os certificados que você assinou com o seu certificado raiz expiraram.
  • O próprio certificado raiz expirou.
No segundo caso, você tem algum trabalho a fazer. Um novo certificado de CA raiz deve ser criado e distribuído e, em seguida, os certificados existentes devem ser recriados ou re-assinados.

No primeiro caso, você tem duas opções. Você pode gerar um novas solicitações de assinatura de certificado e assiná-las como descrito acima, ou (se você os manteve) você pode re-assinar as solicitações originais. Em ambos casos, os certificados antigos devem ser revogados, e então novos certificados assinados e instalados às suas aplicações seguras como descrito anteriormente.

Você não pode emitir dois certificados com o mesmo Nome Comum, o qual é o motivo pelo qual os certificados expirados devem ser revogados. O certificado está no diretório newcerts; você pode determinar seus nomes de arquivo executando index.txt e procurar pelo Nome Comum (CN) nele. O nome de arquivo é o index mais a extensão “.pem”, por exemplo “02.pem”. Para revogar um certificado:

# openssl ca -revoke newcerts/02.pem -config ./openssl.cnf
Using configuration from ./openssl.cnf
Enter PEM pass phrase: demo
Revoking Certificate 02.
Data Base Updated

Agora que o certificado foi revogado, você pode re-assinar a solicitação original, ou criar e assinar uma nova como descrito acima.

Adquirindo um Certificado Assinado Comercialmente

O processo é basicamente o mesmo demonstrado anteriormente, mas o CA faz a maior parte. Você pode gerar uma Solicitação de Assinatura de Certificado como mostrado acima, e então submetê-la para assinatura. Você receberá um certificado assinado para instalação.

Este certificado vai automaticamente ser confiado pelo navegador o seu cliente, visto que o navegador tem o certificado comercial CA embutido. Não há necessidade de que qualquer coisa seja distribuída.

A configuração descrita aqui pode ser inadequada para este fim, visto que há muito mais podendo estar em uma solicitação. Autoridades de certificados diferentes requerem perfis diferentes nas solicitações de assinatura de certificado, das quais nenhum foram tratadas aqui. Este material adicional vai além do escopo atual deste documento.

Publicando o Seu Certificado CA

Você pode postar o certificado no seu site para download. Se você fizer isto, você deverá também postar uma Lista de Revogação de Certificado (CRL), e uma forma de apresentar um dado número de série de um certificado. Isto está fora do escopo atual deste documento.

Apache servirá o seu certificado de forma reconhecível para navegadores o seu tipo MIME for especificado. Por exemplo, você pode usar a extensão de nome de arquivo “.crt” para certificados aptos para download, e inserir o seguinte à seção geral da configuração do seu Apache:

AddType application/x-x509-ca-cert .crt

Agora você pode postar o certificado para download com o link como <a href="www.sample.com/ourrootcert.crt">Our Root Certificate</a>, e quando o link for seguido, o visitante do navegador ofereceria a instalação do certificado.

O CRL pode ser criado da seguinte forma:

# openssl ca -gencrl -crldays 31 -config ./openssl.cnf -out rootca.crl

Mais para vir...

Sumário

Agora você tem informação suficiente para criar e assinar certificados sob seu próprio nome. Por este documento ser razoavelmente longo, o procedimento pode ser sumarizado facilmente.

Configuração Única

Configure, e crie um certificado de raiz CA.

Comandos

# mkdir CA
# cd CA
# mkdir newcerts private
# echo '01' >serial
# touch index.txt
# (IMPORTANT: Install and edit the configuration file shown below.)
# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem \
-out cacert.pem -days 365 -config ./openssl.cnf

Saída

ArquivoObjetivo
cacert.pemCA certificate
private/cakey.pemCA private key

Distribua cacert.pem aos seus clientes.

Por Certificado

Crie solicitações de assinatura de certificados e os assine, provendo valores apropriados para o Nome Comum e a Unidade de Organização.

Comandos

# openssl req -new -nodes -out req.pem -config ./openssl.cnf
# openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem
# cat key.pem cert.pem >key-cert.pem

Saída

ArquivoObjetivo
key.pemChave privada
req.pemSolicitação de assinatura de certificado
cert.pemCertificado
key-cert.pemChave e certificado privados combinados

Instale key.pem e cert.pem, ou apenas key-cert.pem apropriados à aplicação do seu navegador.

Renovação - Por Certificado

Revogue os certificados vencidos, e re-assine as solicitações originais.

Comandos

# openssl ca -revoke newcerts/<serial>.pem -config ./openssl.cnf
# openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem

Instale os certificados renovados da mesma forma que os originais.

Arquivo de Configuração

(Este arquivo está disponível para download.)
---Begin---
#
# OpenSSL configuration file.
#

# Establish working directory.

dir			= .

[ ca ]
default_ca		= CA_default

[ CA_default ]
serial			= $dir/serial
database		= $dir/index.txt
new_certs_dir		= $dir/newcerts
certificate		= $dir/cacert.pem
private_key		= $dir/private/cakey.pem
default_days		= 365
default_md		= md5
preserve		= no
email_in_dn		= no
nameopt			= default_ca
certopt			= default_ca
policy			= policy_match

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

[ req ]
default_bits		= 1024			# Size of keys
default_keyfile		= key.pem		# name of generated keys
default_md		= md5			# message digest algorithm
string_mask		= nombstr		# permitted characters
distinguished_name	= req_distinguished_name
req_extensions		= v3_req

[ req_distinguished_name ]
# Variable name		  Prompt string
#----------------------	  ----------------------------------
0.organizationName	= Organization Name (company)
organizationalUnitName	= Organizational Unit Name (department, division)
emailAddress		= Email Address
emailAddress_max	= 40
localityName		= Locality Name (city, district)
stateOrProvinceName	= State or Province Name (full name)
countryName		= Country Name (2 letter code)
countryName_min		= 2
countryName_max		= 2
commonName		= Common Name (hostname, IP, or your name)
commonName_max		= 64

# Default values for the above, for consistency and less typing.
# Variable name			  Value
#------------------------------	  ------------------------------
0.organizationName_default	= The Sample Company
localityName_default		= Metropolis
stateOrProvinceName_default	= New York
countryName_default		= US

[ v3_ca ]
basicConstraints	= CA:TRUE
subjectKeyIdentifier	= hash
authorityKeyIdentifier	= keyid:always,issuer:always

[ v3_req ]
basicConstraints	= CA:FALSE
subjectKeyIdentifier	= hash

----End----

Referências

Mais informação está disponível nos seguintes sites (abre em uma nova janela):

Pesquisado e escrito por Marcus Redivo.
É garantida aqui a permissão para usar este documento para qualquer propósito, visto que a informação de direitos autorais e este aviso Legal seja mantido. O autor não se responsabiliza por quaisquer consequências provenientes do uso dessas informações.