Como criar minha própria cadeia de certificados?

62

Gostaria de configurar meu próprio Respondente OCSP (apenas para fins de teste). Isso exige que eu tenha um certificado raiz e alguns certificados gerados a partir dele.

Consegui criar um certificado autoassinado usando o openssl. Eu quero usá-lo como o certificado raiz. O próximo passo seria criar os certificados derivados. No entanto, não consigo encontrar a documentação sobre como fazer isso. Alguém sabe onde posso encontrar esta informação?

Editar
Em retrospecto, minha pergunta ainda não foi completamente respondida. Para esclarecer o problema, representarei minha cadeia de certificados assim:

ROOT -> A -> B -> C -> ...

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

Meu comando para criar o certificado 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

O certificado A é criado assim:

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

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

No entanto, o certificado B deve confiar apenas em A, que não está registrado no arquivo de configuração, para que o comando anterior não funcione aqui.

Qual linha de comando devo usar para criar certificados B e além?

Editar
Encontrei a resposta neste 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

Também mudei o arquivo openssl.cnf:

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

Essa abordagem parece estar funcionando bem.

StackedCrooked
fonte
O link na parte inferior na seção de edição é quebrado
enthusiasticgeek
2
Até 2015, o artigo mencionado na última edição deste post está morto. Para que você possa verificar a página através de um arquivo da web : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip

Respostas:

28

Você pode usar o OpenSSL diretamente.

  1. Crie uma chave privada de Autoridade de Certificação (esta é a sua chave mais importante):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Crie seu certificado autoassinado da CA:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Emita um certificado de cliente, primeiro gerando a chave, depois solicite (ou use um fornecido pelo sistema externo) e assine o certificado usando a chave privada da sua CA:

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

(Pode ser necessário adicionar algumas opções, pois estou usando esses comandos junto com o meu arquivo openssl.conf. Talvez seja necessário configurar seu próprio arquivo .conf primeiro.)

twk
fonte
Obrigado, suas instruções funcionaram após alguns ajustes no meu arquivo openssl.conf.
precisa saber é o seguinte
3
@twk: observe que a pergunta tem mais uma etapa necessária para obter uma resposta completa - como criar outro certificado que depende apenas do certificado criado na etapa 3, mas não do certificado raiz.
quack quixote
3
Falha na última etapa com "não é possível carregar a chave privada da CA"; Eu posso chegar lá, fornecendo a chave e o certificado openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, mas ele quer um demoCAdiretório e vários apetrechos.
Iiridayn 28/06
23
"Você pode precisar adicionar algumas opções ..." remove realmente o utilitário desta resposta.
Zach
14

Depois de criar sua CA, você poderá usá-la para assinar assim:

  • Crie uma chave:

    openssl genrsa -out key_A.key  1024
    
  • Crie um csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Assine :

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt
    

    e assim por diante substituindo * _A por * _B e CA_certificate_you_created.crtpor crt_A.crte CA_key_you_created.keycomkey_A.key

Sua mudança:

basicConstraints=CA:TRUE  # prev value was FALSE

significa que os certificados emitidos podem ser usados ​​para assinar outros certificados.

Mr_and_Mrs_D
fonte
thx, very helpful
flotto 27/03
11
Qual arquivo .crt?
MickyD 01/10/19
9

O OpenSSL vem com um script Perl "CA.pl" para ajudá-lo a criar um certificado de CA raiz autoassinado , junto com a chave privada correspondente, além de alguns arquivos e diretórios simples para ajudar a rastrear qualquer certificado futuro que você assine (também conhecido como problema ) com essa autoridade de certificação raiz. Também ajuda a gerar outros pares de chaves e solicitações de assinatura de certificado (CSRs) e ajuda a processar esses CSRs (ou seja, emitir certificados para eles) e muito mais.

Observe que muitos produtos exigem que os certificados da CA contenham um determinado atributo marcando-os como certificados da CA, ou eles não serão aceitos como assinantes / emissores válidos de outros certificados. Se o certificado autoassinado que você criou não contiver esse atributo, você poderá ter problemas para obter outro software para tratá-lo como um certificado de CA 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    
Spiff
fonte
4
Isso foi útil. No Ubuntu 14.04, encontrei o arquivo em/usr/lib/ssl/misc/CA.pl
Colin M
-1

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

É para o Node.JS, mas o script neste repositório do GitHub usa comandos openSLL para criar um certificado de CA raiz e um certificado de domínio.

Execute usando: bash make-root-ca-and-certificates.sh 'example.com'

Ou para localhost usando: 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
Ralph Bisschops
fonte