objetivo

Este howto vai ensinar a criar uma raiz certificadora para criarmos certificados auto-assinados com base nessa raiz.

A criação deste artigo foi motivado pela necessidade de testes com instalação de certificados pessoais em navegadores, solicitação do cliente Blog do Planalto para o projeto entrevista.

dependências

primeiro precisamos instalar o openssl - http://www.openssl.org

sudo aptitude install openssl

configurando

agora vamos criar a estrutura de diretórios necessária

sudo su
cd ~
mkdir CA 
cd CA 
mkdir newcerts private 

Este diretório vai conter:

  • O nosso certificado raiz (CA)
  • A base de dados dos certificados assinados
  • Requisições, Chaves e certificados gerados

O diretório newcerts conterá:

  • A cópia dos certificados gerados

O diretório private conterá:

  • A nossa chave CA;

Não perca essa chave, guarde e não repasse a ninguém, se alguém tiver acesso a esta chave, este alguém poderá gerar novas chaves se passando por você.

O nosso próximo passo é criar a base de dados e o arquivo de índice para os certificados que vamos assinar:

echo '01' > serial 
touch index.txt 

Agora vamos criar um arquivo bem básico de configuração do OpenSSL para iniciar nosso trabalho, use o editor de sua preferencia para criar o arquivo openssl.cnf

# 
# OpenSSL configuration file. 
# 

# Establish working directory. 
dir = . 

[ req ] 
default_bits = 1024 # Size of keys 
default_keyfile = key.pem # nome das chaves que serao criadas
default_md = md5 # algoritmo de digest utilizado 
string_mask = nombstr # tipo de caracteres permitidos 
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 

# Valores padrao para evitar digitar tanto. 
# Variable name   Value 
#------------------------------   ------------------------------ 
0.organizationName_default = Empresa
localityName_default = Brasília
stateOrProvinceName_default = Distrito Federal 
countryName_default = DF
 
[ v3_ca ] 
basicConstraints = CA:TRUE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer:always

Observe a parte dos valores padrão, isso agilizada a vida, você pode setar outros valores padrão ali, seguindo o esquema variavel_default = valor

Crie o arquivo completo e salve.

Por questões de segurança, para evitar o uso não autorizado do certificado, é sempre bom proteger com um passphrase. Desta forma cada vez que você utilizar o certificado raiz para assinar um certificado, este lhe solicitará a senha. Use uma senha forte alfanumérica + simbolos + case sensitive.

Agora vamos para o passo de criação do certificado raiz. Precisamos entender a linha de comando, em nosso caso vamos modificar alguns dos parâmetros default durante a criação.

Nossa mudanças serão nos seguintes pontos:

Vamos criar um novo certificado auto-assinado: “-new -x509”.

vamos criar um novo certificado CA: “-extensions v3_ca ”.

Ele será válido por mais de 30 dias: -“days 3650 ”.

Nome do arquivo de saida: “-keyout, -out ”.

Usaremos o arquivo de configuracao: “-config ./openssl.cnf ”.

Agora vamos rodar o comando que vai criar o certificado, o comando vai lhe pedir aquela senha

root@voyager:~/CA# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf
Generating a 1024 bit RSA private key
........++++++
...........++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [Empresa]:
Organizational Unit Name (department, division) []:nocc
Email Address []:nocc@empresa.org
Locality Name (city, district) [Brasília]:
State or Province Name (full name) [Distrito Federal]:
Country Name (2 letter code) [DF]:
Common Name (hostname, IP, or your name) []:empresa.org

Este comando vai produzir dois arquivos, são eles:

* Uma chave privada em private/cakey.pem .
* Um certificado raiz CA em /cacert.pem.

Veja o conteúdo da chave privada

root@voyager:~/CA# cat private/cakey.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,4C08A4A09D2B12B6

880f2Pxx9hD1j4LFSewRJdZKStMjh4PBH+UpIC4oDTe4aN9HK2tsonKpJ/xCGAHm
8DgLBUrC1Y9V/pRk6ayDIxPOE0FoAxxlkKuLsQ/JoQdKl2m1mGMiyT0HOFN+0Ygo
IJ9w6lJxkj0myT28zWBpv4VqskLKgmiaGBIhBqsvy7w637ZZUQSAJJXBbbi6svPa
udIiFt7H/U4pw3IrXI6rbpYHd2xkNGSGIbiUVz+t4iOGWFmTFXW8X2f/2MydT3Pm
UUbQ0bMQTMBR6ksuTZYXdoHryPbaMbmJfBsovSmfT5UGCZSYd9mdFLu0JOX97a/8
ZBrJ1b+1nlDxvCqGhtz7TxJEvlUju+leqGGcXF8oGxx0ZKA2ajpToYGmib6IdNb4
OUjh7X0QgJQlb0seQVysS0A1RMSizoQEObbXGEtjZmzwLAKrxQ+V8uSe5+gJuiYf
bUylWwbrhK4BykWClRt0Sw2I55bhGLl7+H01B164tWjJpY1w/de2jS8kxkuAEGN9
iS2Rs5ZrfQdGNji00RWj6MoFkXD3xSA7bKSCh2IXIW3aRJgjwhHQQs+N7FxPIfMA
s3IR6F8OkcQTTiyFqwuFHouZ0A3hVGDMQLFK2O9SkYwBoPiGNmQj81qzwR3SGYAS
M22k2IXwEyEaY6hxD0seRzbJSWSkezY+C4UXz3RTIltKC9iUBI/vm+zpiI010PS5
RU2wrg2d6tX8uW90RV9q19V+OBOIV4cSOBMfBHpadXWRUre2j4gryR7daR9Vo3m5
voCBOBcCgmdwnlS+FSfx8AakTSUgNAlXX1k1T5ZvnKGd7hWmJsfzMg==
-----END RSA PRIVATE KEY-----

Veja o conteúdo do certificado gerado

root@voyager:~/CA# cat cacert.pem 
-----BEGIN CERTIFICATE-----
MIIDpTCCAw6gAwIBAgIJANVkdEEUmsSmMA0GCSqGSIb3DQEBBAUAMIGUMRAwDgYD
VQQKEwdFbXByZXNhMQ0wCwYDVQQLEwRub2NjMR8wHQYJKoZIhvcNAQkBFhBub2Nj
QGVtcHJlc2Eub3JnMRIwEAYDVQQHFAlCcmFzw61saWExGTAXBgNVBAgTEERpc3Ry
aXRvIEZlZGVyYWwxCzAJBgNVBAYTAkRGMRQwEgYDVQQDEwtlbXByZXNhLm9yZzAe
Fw0xMDA5MDgxODIzNTZaFw0yMDA5MDUxODIzNTZaMIGUMRAwDgYDVQQKEwdFbXBy
ZXNhMQ0wCwYDVQQLEwRub2NjMR8wHQYJKoZIhvcNAQkBFhBub2NjQGVtcHJlc2Eu
b3JnMRIwEAYDVQQHFAlCcmFzw61saWExGTAXBgNVBAgTEERpc3RyaXRvIEZlZGVy
YWwxCzAJBgNVBAYTAkRGMRQwEgYDVQQDEwtlbXByZXNhLm9yZzCBnzANBgkqhkiG
9w0BAQEFAAOBjQAwgYkCgYEAyEIHoD7wybyB94jdSt3WqMraRsG6vU1E6bRZ6pNR
r8UY5faX8Y2Vud1zZAmW2ZZkP/7sZIxcbzArG601YRFtOO1NhK/yd1a9uxYT2fjZ
ajihHFd/dAhBsR4wlviScoJvAuW/YRmoezAtiKay/T4rcpybBDCLbDge4WWpzJyu
2P0CAwEAAaOB/DCB+TAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBQBvKbh3d/N3AM1
R50frt9SuFRsljCByQYDVR0jBIHBMIG+gBQBvKbh3d/N3AM1R50frt9SuFRslqGB
mqSBlzCBlDEQMA4GA1UEChMHRW1wcmVzYTENMAsGA1UECxMEbm9jYzEfMB0GCSqG
SIb3DQEJARYQbm9jY0BlbXByZXNhLm9yZzESMBAGA1UEBxQJQnJhc8OtbGlhMRkw
FwYDVQQIExBEaXN0cml0byBGZWRlcmFsMQswCQYDVQQGEwJERjEUMBIGA1UEAxML
ZW1wcmVzYS5vcmeCCQDVZHRBFJrEpjANBgkqhkiG9w0BAQQFAAOBgQCtk2BqNiNR
0U5hvvQHmA+UUiURlimv1IeOJ/8LcC1EgK6fP9Hfre1uFye7VaQW45yM9awQXL7U
u21m+uTOKug+YH7HxEyC4M98M2r1E0BBnSgrd+8mqaM6wR3e/Vpg5Gm6KGZRsn27
kAxlKyOevuuyPDjZcJV6b1v5oX3G2rBgTQ==
-----END CERTIFICATE-----

Podemos obter informações através dos certificados gerados, veja os exemplos abaixo:

root@voyager:~/CA#  openssl x509 -in cacert.pem -noout -text 
  
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d5:64:74:41:14:9a:c4:a6
        Signature Algorithm: md5WithRSAEncryption
        Issuer: O=Empresa, OU=nocc/emailAddress=nocc@empresa.org, L=Bras\xC3\xADlia, ST=Distrito Federal, C=DF, CN=empresa.org
        Validity
            Not Before: Sep  8 18:23:56 2010 GMT
            Not After : Sep  5 18:23:56 2020 GMT
        Subject: O=Empresa, OU=nocc/emailAddress=nocc@empresa.org, L=Bras\xC3\xADlia, ST=Distrito Federal, C=DF, CN=empresa.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:c8:42:07:a0:3e:f0:c9:bc:81:f7:88:dd:4a:dd:
                    d6:a8:ca:da:46:c1:ba:bd:4d:44:e9:b4:59:ea:93:
                    51:af:c5:18:e5:f6:97:f1:8d:95:b9:dd:73:64:09:
                    96:d9:96:64:3f:fe:ec:64:8c:5c:6f:30:2b:1b:ad:
                    35:61:11:6d:38:ed:4d:84:af:f2:77:56:bd:bb:16:
                    13:d9:f8:d9:6a:38:a1:1c:57:7f:74:08:41:b1:1e:
                    30:96:f8:92:72:82:6f:02:e5:bf:61:19:a8:7b:30:
                    2d:88:a6:b2:fd:3e:2b:72:9c:9b:04:30:8b:6c:38:
                    1e:e1:65:a9:cc:9c:ae:d8:fd
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:TRUE
            X509v3 Subject Key Identifier: 
                01:BC:A6:E1:DD:DF:CD:DC:03:35:47:9D:1F:AE:DF:52:B8:54:6C:96
            X509v3 Authority Key Identifier: 
                keyid:01:BC:A6:E1:DD:DF:CD:DC:03:35:47:9D:1F:AE:DF:52:B8:54:6C:96
                DirName:/O=Empresa/OU=nocc/emailAddress=nocc@empresa.org/L=Bras\xC3\xADlia/ST=Distrito Federal/C=DF/CN=empresa.org
                serial:D5:64:74:41:14:9A:C4:A6

    Signature Algorithm: md5WithRSAEncryption
        ad:93:60:6a:36:23:51:d1:4e:61:be:f4:07:98:0f:94:52:25:
        11:96:29:af:d4:87:8e:27:ff:0b:70:2d:44:80:ae:9f:3f:d1:
        df:ad:ed:6e:17:27:bb:55:a4:16:e3:9c:8c:f5:ac:10:5c:be:
        d4:bb:6d:66:fa:e4:ce:2a:e8:3e:60:7e:c7:c4:4c:82:e0:cf:
        7c:33:6a:f5:13:40:41:9d:28:2b:77:ef:26:a9:a3:3a:c1:1d:
        de:fd:5a:60:e4:69:ba:28:66:51:b2:7d:bb:90:0c:65:2b:23:
        9e:be:eb:b2:3c:38:d9:70:95:7a:6f:5b:f9:a1:7d:c6:da:b0:
        60:4d

Informação sobre datas de criação e expiração

root@voyager:~/CA# openssl x509 -in cacert.pem -noout -dates
notBefore=Sep  8 18:23:56 2010 GMT
notAfter=Sep  5 18:23:56 2020 GMT

Informação da finalidade do certificado

root@voyager:~/CA# openssl x509 -in cacert.pem -noout -purpose
Certificate purposes:
SSL client : Yes
SSL client CA : Yes
SSL server : Yes
SSL server CA : Yes
Netscape SSL server : Yes 
Netscape SSL server CA : Yes
S/MIME signing : Yes
S/MIME signing CA : Yes
S/MIME encryption : Yes
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes

criando o Certificate Signing Request (CSR)

Agora que criamos o certificado raiz, podemos criar quantos certificados quisermos para nossas aplicações SSL, por exemplo, HTTPS, SMTPS, IMAPS, FTPS e outros. O procedimento envolve a criação de uma chave privada e uma requisição de certificado, além disto teremos de assinar a requisição para gerar o novo certificado.

Para fazermos estas configurações precisamos adicionar mais algumas seções ao openssl.cnf.

Ao final do arquivo adicione

[ v3_req ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash 

Ao final da seção [req] adicione esta linha

reqextensions = v3req

Agora estamos prontos para criar os certificados para nossos serviços.

Vamos fazer um exemplo criando um certificado para nosso IMAPS.

Você precisará preencher da seguinte forma:

Organizational Unit: nome da área ou descrição do serviço/finalidade do certificado 
Email Address: postmaster@empresa.org
Common Name: imap.empresa.org

É muito importante ter em mente que o nome da maquina que vai rodar o serviço deve ser o mesmo do certificado, isto evita que o cliente de correio emita avisos dizendo que a maquina que roda o serviço chama-se correio.empresa.org porém o certificado foi criado para o endereço imap.correio.org, isso não interfere no funcionamento, porém pode causar confusão com o usuário.

Agora vamos gerar o certificado, acompanhe a saída e o preenchimento dos campos

root@voyager:~/CA# openssl req -new -nodes -out req.pem -config ./openssl.cnf 
Generating a 1024 bit RSA private key
..................................................++++++
......++++++
writing new private key to 'key.pem'
-----
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) [Empresa]:
Organizational Unit Name (department, division) []:sustentacao de correio
Email Address []:suportecorreio@empresa.org
Locality Name (city, district) [Brasília]:
State or Province Name (full name) [Distrito Federal]:
Country Name (2 letter code) [DF]:
Common Name (hostname, IP, or your name) []:imap.correio.org

vamos ver os arquivos que estão no diretório

root@voyager:~/CA# ls -la
total 36
drwxr-xr-x  4 root root 4096 2010-09-08 15:52 .
drwx------ 14 root root 4096 2010-09-08 15:44 ..
-rw-r--r--  1 root root 1326 2010-09-08 15:23 cacert.pem
-rw-r--r--  1 root root  887 2010-09-08 15:52 key.pem
drwxr-xr-x  2 root root 4096 2010-09-08 15:18 newcerts
-rw-r--r--  1 root root 1408 2010-09-08 15:44 openssl.cnf
drwxr-xr-x  2 root root 4096 2010-09-08 15:23 private
-rw-r--r--  1 root root  838 2010-09-08 15:52 req.pem
-rw-r--r--  1 root root    3 2010-09-08 15:19 serial

Este processo gerou dois arquivos, observe:

* Uma chave privada chamada key.pem
* Uma requisição de assinatura de certificados req.pem

Mantenha estes arquivos guardados em local seguro, assim quando o certificado expirar você poderá gerar um novo certificado com nova data de expiração. A chave privada é necessária para o processo de criptografia SSL. Para facilitar vamos alterar os nomes dos arquivos, do contrário podemos confudir ou sobrescrevê-los ao criar novos certificados.

root@voyager:~/CA# mv key.pem imap.empresa.org-key.pem
root@voyager:~/CA# mv req.pem imap.empresa.org-req.pem

agora ficou mais organizado, veja

root@voyager:~/CA# ls -la
total 36
drwxr-xr-x  4 root root 4096 2010-09-08 16:05 .
drwx------ 14 root root 4096 2010-09-08 15:44 ..
-rw-r--r--  1 root root 1326 2010-09-08 15:23 cacert.pem
-rw-r--r--  1 root root  887 2010-09-08 15:52 imap.empresa.org-key.pem
-rw-r--r--  1 root root  838 2010-09-08 15:52 imap.empresa.org-req.pem
drwxr-xr-x  2 root root 4096 2010-09-08 15:18 newcerts
-rw-r--r--  1 root root 1408 2010-09-08 15:44 openssl.cnf
drwxr-xr-x  2 root root 4096 2010-09-08 15:23 private
-rw-r--r--  1 root root    3 2010-09-08 15:19 serial

podemos verificar informações da requisição com o comando abaixo:

root@voyager:~/CA# openssl req -in imap.empresa.org-req.pem -text -verify -noout 
verify OK
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: O=Empresa, OU=sustentacao de correio/emailAddress=suportecorreio@empresa.org, L=Bras\xC3\xADlia, ST=Distrito Federal, C=DF,   CN=imap.correio.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:b6:70:78:94:47:e4:8a:64:ea:8e:43:14:0e:c3: 
                    09:6e:d1:63:ab:15:7e:19:4d:97:2c:b4:e8:b6:0c:
                    dc:ca:56:c4:b3:a0:e6:84:16:55:f5:65:b6:5c:01:
                    65:39:c9:5d:94:a8:4c:cc:8d:93:56:64:f6:d9:6a:
                    46:a6:41:f2:97:9e:17:dd:6d:12:30:7e:66:e0:39:
                    a5:aa:67:31:2b:76:48:82:97:75:bd:d8:b1:02:ac:
                    67:f7:5a:cf:31:ea:58:b4:ef:5b:e8:fe:72:09:73:
                    50:12:18:7a:eb:dd:a4:d3:45:8a:89:b9:b5:81:af:
                    3c:3b:30:03:e0:6a:03:79:2f
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                88:0C:01:17:10:86:9F:76:2E:A6:A7:97:71:88:32:CC:92:6A:B1:98
    Signature Algorithm: md5WithRSAEncryption
        87:4e:7c:4f:e4:6a:d4:3c:be:f7:40:5f:2a:ff:d2:a4:86:c1:
        75:7a:54:72:5f:01:00:99:57:92:7d:43:b3:cb:27:a3:33:67:
        d5:b3:3a:d3:eb:69:5e:d7:48:4e:68:f1:8d:e6:d5:ba:82:eb:
        c5:23:28:21:c2:4a:12:cc:ff:ca:5a:93:7d:34:7e:26:98:8c:
        70:69:6c:17:b9:2f:a6:62:11:25:58:fa:e6:72:c8:47:01:97:
        64:67:b4:54:af:8a:dc:26:75:20:32:3c:01:d5:00:80:c7:6a:
        f0:da:6b:43:d0:84:b6:0c:1c:76:aa:e6:3c:2a:c4:bd:3b:a5:
        26:20

veja o conteúdo da requisição de assinatura de certificado

root@voyager:~/CA# cat imap.empresa.org-key.pem 
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC2cHiUR+SKZOqOQxQOwwlu0WOrFX4ZTZcstOi2DNzKVsSzoOaE
FlX1ZbZcAWU5yV2UqEzMjZNWZPbZakamQfKXnhfdbRIwfmbgOaWqZzErdkiCl3W9
2LECrGf3Ws8x6li071vo/nIJc1ASGHrr3aTTRYqJubWBrzw7MAPgagN5LwIDAQAB
AoGAfzWjTjlm6Pz+9B1fof9q12OXbJa662fHznuCfFYxqcCgvWOm+FkerNK0Oika
7RU0dFB55HOfVbFm0iihhJIdVV8ugMe89Dxngk7qUXxIJ56rjBsTX6du+E193W/m
iDj1CWICjrZYpGrzDOp8x3VAMGPAtFT48eegvr8MPmQo26kCQQDj8fS2DhLTeaKg
7YQnQj3hGwavVHaFXbKoj9o0/TKMjMG3mXWAr/mBOSYyehzANLysTXkymMdGYInN
ms2U9A61AkEAzOS6hirGuIZFChX8/gx/IHIFhmA+CctM2lNx5G1Me39mnCfM9SX+
g5/VGEXOFvJsb0AIgHMiy9gOFuTZk4wy0wJAKsqOROsJb7fC5vEPwQr3cN3Q+HMj
uM+pLWmr7gymQ6pc52mgnGLstOyUlh9EbHS6AqKcoPn7VuPimr134IGcjQJANlSI
aT86hn+EGxKNjUf/Bbl2YZVvneU8sb/iuXGKEE1OBiY/oNm8TWa6eL850LfjrPRL
zNO67FaUFdoFH6zTZQJAbEVkmUNGrOobkrE2aMlFuc7g6Y5Wx2uJci0/Pp4VybnL
y0e1rPQ+yjU2MymKB2NGNdw4LQnishsG7uesEB5+TQ==
-----END RSA PRIVATE KEY-----

agora só precisamos assinar a requisição, isto vai gerar o certificado definitivo.

Assinando Certificados

Agora precisamos fazer mais alguns ajustes no arquivo de configuração openssl.cnf para conseguir assinar os certicados. Vamos adicionar uma seção que vai lidar com a Autoridade Certificadora. Esta seção vai identificar os caminhos para a database, certificado Raiz e a chave privada. Ela também nos permitirá ajustar alguns valores - default - para assinatura dos certificados.

Insira as configurações abaixo antes da seção [req]

[ 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

e vamos assinar…

root@voyager:~/CA# openssl ca -out cert.pem -config ./openssl.cnf -infiles imap.empresa.org-req.pem 
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :PRINTABLE:'Empresa'
organizationalUnitName:PRINTABLE:'sustentacao de correio'
localityName          :T61STRING:'Bras\0xFFFFFFC3\0xFFFFFFADlia'
stateOrProvinceName   :PRINTABLE:'Distrito Federal'
countryName           :PRINTABLE:'DF' 
commonName            :PRINTABLE:'imap.correio.org'
Certificate is to be certified until Sep  8 19:21:02 2011 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 atualizou a database CA (certificado raiz) e produziu dois arquivos:

* O certificado cert.pem
* A cópia do certificado newcerts/.pem

Novamente, podemos inspecionar o certificado com o comando

root@voyager:~/CA# openssl x509 -in cert.pem -noout -text
 
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 1 (0x1)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: O=Empresa, OU=nocc/emailAddress=nocc@empresa.org, L=Bras\xC3\xADlia, ST=Distrito Federal, C=DF, CN=empresa.org
        Validity
            Not Before: Sep  8 19:21:02 2010 GMT
            Not After : Sep  8 19:21:02 2011 GMT
        Subject: C=DF, ST=Distrito Federal, O=Empresa, OU=sustentacao de correio, CN=imap.correio.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:b6:70:78:94:47:e4:8a:64:ea:8e:43:14:0e:c3:
                    09:6e:d1:63:ab:15:7e:19:4d:97:2c:b4:e8:b6:0c:
                    dc:ca:56:c4:b3:a0:e6:84:16:55:f5:65:b6:5c:01:
                    65:39:c9:5d:94:a8:4c:cc:8d:93:56:64:f6:d9:6a:
                    46:a6:41:f2:97:9e:17:dd:6d:12:30:7e:66:e0:39:
                    a5:aa:67:31:2b:76:48:82:97:75:bd:d8:b1:02:ac:
                    67:f7:5a:cf:31:ea:58:b4:ef:5b:e8:fe:72:09:73:
                    50:12:18:7a:eb:dd:a4:d3:45:8a:89:b9:b5:81:af:
                    3c:3b:30:03:e0:6a:03:79:2f
                Exponent: 65537 (0x10001)
    Signature Algorithm: md5WithRSAEncryption
        88:4b:8d:0a:ea:82:76:cd:78:23:30:0e:3c:9d:b0:72:ef:94:
        c5:85:82:88:86:65:58:fc:6e:22:d2:9a:ff:6f:cb:9d:ee:8b:
        41:ff:86:82:8f:d4:ba:b1:2d:fa:c5:a9:d5:a9:bb:30:96:cf:
        07:38:93:96:e5:81:03:10:83:61:d8:e7:6a:1c:34:b1:c8:54:
        0a:06:ad:58:87:7a:67:2a:55:24:fe:11:de:3d:a0:db:86:80:
        15:de:a1:f3:f2:e9:14:13:87:07:74:5c:62:c7:f9:a1:af:7d:
        d8:82:4e:61:39:99:a5:83:75:4d:0a:af:03:3b:88:b2:b5:7c:
        f8:f0
root@voyager:~/CA# openssl x509 -in cert.pem -noout -dates

notBefore=Sep  8 19:21:02 2010 GMT
notAfter=Sep  8 19:21:02 2011 GMT
root@voyager:~/CA# openssl x509 -in cert.pem -noout -purpose

Certificate purposes:

SSL client : Yes
SSL client CA : No
SSL server : Yes
SSL server CA : No
Netscape SSL server : Yes
Netscape SSL server CA : No
S/MIME signing : Yes
S/MIME signing CA : No
S/MIME encryption : Yes
S/MIME encryption CA : No
CRL signing : Yes
CRL signing CA : No
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : No 

vamos observar o conteúdo dos diretórios, começando pela raiz

root@voyager:~/CA# ls -la
total 52
drwxr-xr-x  4 root root 4096 2010-09-08 16:21 .
drwx------ 14 root root 4096 2010-09-08 16:18 ..
-rw-r--r--  1 root root 1326 2010-09-08 15:23 cacert.pem
-rw-r--r--  1 root root 2667 2010-09-08 16:21 cert.pem
-rw-r--r--  1 root root  887 2010-09-08 15:52 imap.empresa.org-key.pem
-rw-r--r--  1 root root  838 2010-09-08 15:52 imap.empresa.org-req.pem
-rw-r--r--  1 root root  110 2010-09-08 16:21 index.txt
-rw-r--r--  1 root root   21 2010-09-08 16:21 index.txt.attr
-rw-r--r--  1 root root    0 2010-09-08 16:20 index.txt.old
drwxr-xr-x  2 root root 4096 2010-09-08 16:21 newcerts
-rw-r--r--  1 root root 1924 2010-09-08 16:18 openssl.cnf
drwxr-xr-x  2 root root 4096 2010-09-08 15:23 private
-rw-r--r--  1 root root    3 2010-09-08 16:21 serial
-rw-r--r--  1 root root    3 2010-09-08 15:19 serial.old

diretório newcerts que contém a cópia dos certifcados gerados

root@voyager:~/CA# ls newcerts/
01.pem

diretório private que contém as chaves, no momento apenas a chave do CA

root@voyager:~/CA# ls private/
cakey.pem

para facilitar a organização vamos renomear o certificado gerado para o padrão que estamos utilizando no imap.

root@voyager:~/CA# mv cert.pem imap.empresa.org-cert.pem

agora vamos observar o conteúdo novamente

root@voyager:~/CA# ls -l
  total 44
  -rw-r--r-- 1 root root 1326 2010-09-08 15:23 cacert.pem
  -rw-r--r-- 1 root root 2667 2010-09-08 16:21 imap.empresa.org-cert.pem
  -rw-r--r-- 1 root root  887 2010-09-08 15:52 imap.empresa.org-key.pem
  -rw-r--r-- 1 root root  838 2010-09-08 15:52 imap.empresa.org-req.pem
  -rw-r--r-- 1 root root  110 2010-09-08 16:21 index.txt
  -rw-r--r-- 1 root root   21 2010-09-08 16:21 index.txt.attr
  -rw-r--r-- 1 root root    0 2010-09-08 16:20 index.txt.old
  drwxr-xr-x 2 root root 4096 2010-09-08 16:21 newcerts
  -rw-r--r-- 1 root root 1924 2010-09-08 16:18 openssl.cnf
  drwxr-xr-x 2 root root 4096 2010-09-08 15:23 private
  -rw-r--r-- 1 root root    3 2010-09-08 16:21 serial
  -rw-r--r-- 1 root root    3 2010-09-08 15:19 serial.old

Instalando o certificado e as chaves

Isto vai depender da aplicação. Algumas aplicações solicitam a chave e o certificado de forma separada, outras precisam do arquivo combinado.

O apache por exemplo em sua configuração usa os arquivos de forma separada, já o stunnel precisa do arquivo combinado.

Para combinar os arquivos use o seguinte comando

cat imap.empresa.org-key.pem imap.empresa.org-cert.pem > imap.empresa.org-key-cert.pem

Beleza, após este últimos passo temos o seguinte:

    * A chave privada imap.empresa.org-key.pem
    * O certificado imap.empresa.org-cert.pem
    * A combinação da chave e do certificado imap.empresa.org-key-cert.pem

Agora basta copiar os arquivos para os locais apropriados em sua aplicação, configuração e reiniciá-las.

distribuindo o certificado CA

Agora o passo que vai nos ajudar a fazer os clientes ficarem mais calmos quando forem tentar usar os serviços com suporte SSL. Normalmente os navegadores e clientes de correio vão reclamar dizendo que o certificado é auto-assinado e não é seguro, para resolver a questão, envie o arquivo cacert.pem para que os usuários instalem o certificado em seus navegadores e clientes de correio, eles podem instalar globalmente no sistema dependendo do sistema operacional, com o certificado instalado os clientes não vão mais dar alertas para os usuários.

renovando certificados

Sua cadeia de certificados pode quebrar de duas formas:

    * Os certificados que voce assinou com seu certificado raiz expiraram
    * Seu certificado RAIZ expirou

No segundo caso - certificado RAIZ CA - o trabalho é bem maior. Um novo certificado Raiz (CA) deve ser criado e distribuído, seus certificados existentes precisam ser recriados ou assinados novamente.

No primeiro caso você tem duas opções. A primeira forma é gerar um novo CSR (certificate signing request) e assiná-lo novamente, ou - se você manteve o csr - você pode assiná-lo diretamente. A segunda forma é revogar os certificados antigos, e após isto assinar e instalar o novo certificado da forma que foi descrita anteriormente.

Não é possível assinar dois certificados com o mesmo 'Common Name' (CN), o imap.correio.org foi o Common Name usado em nosso exemplo, é por isto que devemos revogar os certificados expirados. O certificado está no diretório newcerts. Você pode encontrar o arquivo correto verificando o arquivo index.txt , este arquivo contém o indice de todos os certificados criados, no caso do imap.correio.org o aquivo que referencia esse certificado dentro do diretório newcerts é o 01.pem , vamos entender como identificar.

vamos ler o conteúdo do arquivo index.txt

root@voyager:~/CA# cat index.txt
V	110908192102Z		01	unknown	/C=DF/ST=Distrito Federal/O=Empresa/OU=sustentacao de correio/CN=imap.correio.org

observe que o primeiro arquivo 01 do diretório newcerts é referente ao CN imap.correio.org , vamos listar o conteúdo do diretório

root@voyager:~/CA# ls newcerts/
01.pem

agora vamos aprender a revogar este certificado

root@voyager:~/CA# openssl ca -revoke newcerts/01.pem -config ./openssl.cnf 
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Revoking Certificate 01.
Data Base Updated

pronto, certificado revogado, para assiná-lo novamente você precisa gerar um novo CSR como falamos acima, porém se guardou assine diretamente

root@voyager:~/CA# openssl ca -out imap.empresa.org-cert.pem -config ./openssl.cnf -infiles imap.empresa.org-req.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :PRINTABLE:'Empresa'
organizationalUnitName:PRINTABLE:'sustentacao de correio'
localityName          :T61STRING:'Bras\0xFFFFFFC3\0xFFFFFFADlia'
stateOrProvinceName   :PRINTABLE:'Distrito Federal'
countryName           :PRINTABLE:'DF'
commonName            :PRINTABLE:'imap.correio.org'
Certificate is to be certified until Sep  8 21:19:22 2011 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

beleza, a requisição foi assinada, seu certificado está válido novamente.

gerando um certificado pessoal

Para gerar um certificado pessoal coloque o nome completo da pessoa na opção 'Common Name' (CN), veja o exemplo abaixo:

aqui vamos gerar a chave e a requisicao de assinatura

root@voyager:~/CA# openssl req -new -nodes -out josesilva-req.pem -keyout josesilva-key.pem -days 365 -config ./openssl.cnf
Generating a 1024 bit RSA private key
...........++++++
....................++++++
writing new private key to 'josesilva-key.pem'
-----
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) [Empresa]:
Organizational Unit Name (department, division) []:Pessoas
Email Address []:josesilva@empresa.org
Locality Name (city, district) [Brasília]:
State or Province Name (full name) [Distrito Federal]:
Country Name (2 letter code) [DF]:
Common Name (hostname, IP, or your name) []:Jose Silva

agora vamos assinar o certificado

root@voyager:~/CA# openssl ca -out josesilva-cert.pem -days 365 -config ./openssl.cnf -infiles josesilva-req.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :PRINTABLE:'Empresa'
organizationalUnitName:PRINTABLE:'Pessoas'
localityName          :T61STRING:'Bras\0xFFFFFFC3\0xFFFFFFADlia'
stateOrProvinceName   :PRINTABLE:'Distrito Federal'
countryName           :PRINTABLE:'DF'
commonName            :PRINTABLE:'Jose Silva'
Certificate is to be certified until Sep  8 21:31:58 2011 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

que beleza, certificado assinado e válido, agora o usuário tem sua chave e certificado criado a partir da nossa raiz CA.

gerando um certificado tipo pkcs12

PKCS12, significa Personal Information Exchange Syntax Standard,

Estes certificados podem ser utilizados para assinar e-mails ou mesmo arquivos. Eles são diferentes dos tipos mais comuns de certificados pois combinam a chave, o certificado pessoal e o certificado CA em um mesmo arquivo, desta forma o usuário só tem que se preocupar com um único arquivo.

Algumas aplicações como o Mozilla Firefox só aceitam certificados do tipo PKCS12, a maioria dos navegadores aceita este tipo de certificado.

Se precisamos de nosso certificado pessoal para acessar uma aplicação na internet, precisaremos então gerar o PKCS12.

Para gerar use o comando abaixo, você precisa estabelecer uma senha para seu certificad pessoal PKCS12.

root@voyager:~/CA# openssl pkcs12 -export -in josesilva-cert.pem -inkey josesilva-key.pem -certfile cacert.pem -name "[Jose Silva]" -out josesilva-cert.p12
Enter Export Password:
Verifying - Enter Export Password:

Após este processo você vera o arquivo josesilva-cert.p12 no seu diretório, é este arquivo que você precisa importar no Mozilla Firefox.

mão na massa - modo rápido

criando diretorios
# mkdir CA 
# cd CA 
# mkdir newcerts private 
# echo '01' >serial 
# touch index.txt 
criando arquivo openssl.cnf completo
# 
# 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 # Tamanho das chaves
default_keyfile = key.pem # nome das chaves que serao criadas
default_md = md5 # algoritmo de digest utilizado 
string_mask = nombstr # tipo de caracteres permitidos 
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 

# Valores padrao para evitar digitar tanto. 
# Variable name   Value 
#------------------------------   ------------------------------ 
0.organizationName_default = Empresa
localityName_default = Brasília
stateOrProvinceName_default = Distrito Federal 
countryName_default = DF
 
[ v3_ca ] 
basicConstraints = CA:TRUE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash
criando certificado CA
# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 365 -config ./openssl.cnf 

Este comando vai gerar os arquivos:

cacert.pem (certificado CA)
cakey.pem (chave CA)
criando requisição, assinando e combinando arquivos
# openssl req -new -nodes -out site.empresa.org-req.pem -config ./openssl.cnf 
# openssl ca -out site.empresa.org-cert.pem -config ./openssl.cnf -infiles site.empresa.org-req.pem 
# cat site.empresa.org-key.pem site.empresa.org-cert.pem > site.empresa.org-key-cert.pem 

Este comando vai gerar os arquivos:

site.empresa.org-req.pem (requisicao)
site.empresa.org-key.pem (chave)  
site.empresa.org-cert.pem (certificado)
site.empresa.org-key-cert.pem (certificado combinado)
revogando e assinando novamente os certificados
# openssl ca -revoke newcerts/.pem -config ./openssl.cnf 
# openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem 
criando chave pkcs12
openssl pkcs12 -export -in josesilva-cert.pem -inkey josesilva-key.pem -certfile cacert.pem -name "[Jose Silva]" -out josesilva-cert.p12

Este comando vai gerar o arquivo:

josesilva.p12

referências

este howto foi baseado no artigo abaixo, é praticamente uma tradução extendida

a criação de certificados pkcs12 foi baseada neste artigo



openssl_criando_raiz_ca.txt · Last modified: 2010/11/19 19:07 by gutocarvalho
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0