2010-03-31 15:38:27 +0000 2010-03-31 15:38:27 +0000
63
63

Como criar a minha própria cadeia de certificados?

Gostaria de criar o meu próprio OCSP Responder (apenas para fins de teste). Isto requer que eu tenha um certificado de raiz e alguns certificados gerados a partir dele.

Consegui criar um certificado autoassinado utilizando o openssl. Quero usá-lo como o certificado de raiz. O passo seguinte seria criar os certificados derivados. No entanto, não consigo encontrar a documentação sobre como o fazer. Alguém sabe onde posso encontrar esta informação?

Editar Em retrospectiva, a minha pergunta ainda não foi completamente respondida. Para esclarecer o problema, representarei a minha cadeia de certificados desta forma:

ROOT -> A -> A -> B -> C -> …

Actualmente sou capaz de criar os certificados ROOT e A, mas ainda não descobri como fazer uma cadeia mais longa.

O meu comando para criar o certificado de raiz é:

openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem

Certificado A é criado desta forma:

openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.cer

Este comando depende implicitamente do certificado de raiz, para o qual encontra as informações necessárias no ficheiro de configuração openssl.

Certificado B, no entanto, só deve confiar em A, que não está registado no ficheiro de configuração, pelo que o comando anterior não funcionará aqui.

Que linha de comando devo utilizar para criar certificados B e mais além?

Editar Encontrei a resposta em este artigo . O certificado B (cadeia A -> B) pode ser criado com estes dois comandos:

# Create a certificate request
openssl req -new -keyout B.key -out B.request -days 365

# Create and sign the certificate
openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request

Eu também alterei o ficheiro openssl.cnf:

[usr_cert]
basicConstraints=CA:TRUE # prev value was FALSE

Esta abordagem parece estar a funcionar bem.

Respostas (4)

28
28
28
2010-03-31 18:03:18 +0000

Pode utilizar directamente o OpenSSL.

  1. Criar uma chave privada da Autoridade Certificadora (esta é a sua chave mais importante):

  2. Crie o seu certificado autoassinado da CA:

  3. Emita um certificado de cliente gerando primeiro a chave, depois peça (ou use uma fornecida por sistema externo) e depois assine o certificado usando a chave privada da sua CA:

(Poderá ter de adicionar algumas opções, pois estou a usar estes comandos juntamente com o meu ficheiro openssl.conf. Poderá ter de configurar primeiro o seu próprio ficheiro .conf).

14
14
14
2012-04-29 17:54:40 +0000

Uma vez criada a sua AC, poderá utilizá-la para assinar assim:

  • Criar uma chave :

  • Criar um csr :

  • Assinar :

A sua mudança :

basicConstraints=CA:TRUE # prev value was FALSE

significa que os certificados que emite podem ser utilizados para assinar outros certificados.

9
9
9
2010-03-31 17:51:10 +0000

OpenSSL vem com um script Perl “CA.pl” para o ajudar a criar uma raiz autoassinada CA cert, juntamente com a chave privada correspondente, mais alguns ficheiros e directórios simples para ajudar a manter o registo de quaisquer futuros certs que assine (também conhecido como emissão) com essa raiz CA. Também o ajuda a gerar outros pares de chaves e pedidos de assinatura de certificados (CSRs) e ajuda-o a processar esses CSRs (ou seja, emitir certificados para eles), e muito mais.

Note que muitos produtos requerem que os certificados CA contenham um determinado atributo que os marque como certificados CA, ou não serão aceites como signatários/emissores válidos de outros certificados. Se o cert autoassinado que criou não contiver esse atributo, poderá ter dificuldade em obter outro software para o tratar como um cert CA de raiz válido.

Se bem me lembro, a sintaxe é algo como isto:

CA.pl -newca # Create a new root CA  

CA.pl -newreq # Create a new CSR

CA.pl -sign # Sign a CSR, creating a cert  

CA.pl -pkcs12 # Turn an issued cert, plus its matching private key and trust chain, into a .p12 file you can install on another machine
-1
-1
-1
2018-11-06 22:59:55 +0000

Encontrei este posto: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

É para Node.JS mas o script em este GitHub repo usa comandos openSLL para criar um cert CA de raiz e um cert de domínio.

Run using: bash make-root-ca-and-certificates.sh 'example.com'

Ou para o uso de localhost: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem