Durante minha pesquisa, encontrei várias maneiras de assinar uma solicitação de assinatura de certificado SSL:
Usando o
x509
módulo:openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Usando o
ca
módulo:openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
Nota: Não tenho certeza do uso dos parâmetros corretos para este. Por favor, informe o uso correto se eu quiser usá-lo.
Como usar para assinar solicitações de certificado com sua Autoridade de Certificação? Um método é melhor que o outro (por exemplo, um sendo preterido)?
ca
é para casos em que você é mais sério ao se tornar um CA.Respostas:
Está faltando o prelúdio para esses comandos.
Este é um processo de duas etapas. Primeiro, você configura sua autoridade de certificação e, em seguida, assina um certificado de entidade final (também conhecido como servidor ou usuário). Os dois comandos descrevem as duas etapas em uma. E ambos assumem que você já possui um arquivo de configuração do OpenSSL para os certificados de CA e de servidor (entidade final).
Primeiro, crie um arquivo de configuração básica :
Em seguida, adicione o seguinte:
Os campos acima são retirados de um campo mais complexo
openssl.cnf
(você pode encontrá-lo/usr/lib/openssl.cnf
), mas acho que eles são essenciais para criar o certificado de CA e a chave privada.Ajuste os campos acima para se adequar ao seu gosto. Os padrões economizam seu tempo para inserir as mesmas informações ao experimentar o arquivo de configuração e as opções de comando.
Omiti o material relevante para a CRL, mas suas operações de CA devem tê-lo. Veja
openssl.cnf
e acrl_ext
seção relacionada .Em seguida, execute o seguinte. O
-nodes
omite a senha ou frase secreta para que você possa examinar o certificado. É uma muito má ideia para omitir a senha ou frase secreta.Após a execução do comando,
cacert.pem
será o seu certificado para operações da CA ecakey.pem
será a chave privada. Lembre-se de que a chave privada não possui uma senha ou senha.Você pode despejar o certificado com o seguinte.
E teste seu objetivo com o seguinte (não se preocupe com o
Any Purpose: Yes
; consulte "CA crítica: FALSE", mas "CA com qualquer finalidade: Sim" ).Na parte dois, vou criar outro arquivo de configuração que seja facilmente digerível. Primeiro,
touch
oopenssl-server.cnf
(você também pode criar um desses certificados de usuário).Em seguida, abra-o e adicione o seguinte.
Se você estiver desenvolvendo e precisar usar sua estação de trabalho como servidor, faça o seguinte no Chrome. Caso contrário, o Chrome poderá reclamar que um Nome Comum é inválido (
ERR_CERT_COMMON_NAME_INVALID
) . Não tenho certeza de qual é a relação entre um endereço IP na SAN e uma CN nessa instância.Em seguida, crie a solicitação de certificado do servidor. Certifique-se de omitir
-x509
*. A adição-x509
criará um certificado, e não uma solicitação.Após a execução deste comando, você terá uma solicitação
servercert.csr
e uma chave privadaserverkey.pem
.E você pode inspecionar novamente.
Em seguida, você deve assiná-lo com sua autoridade de certificação.
Você está quase pronto para assinar o certificado do servidor por sua CA. A CA
openssl-ca.cnf
precisa de mais duas seções antes de emitir o comando.Primeiro, abra
openssl-ca.cnf
e adicione as duas seções a seguir.Segundo, adicione o seguinte à
[ CA_default ]
seção deopenssl-ca.cnf
. Eu os deixei de fora mais cedo, porque eles podem complicar as coisas (eles não eram usados na época). Agora você verá como eles são usados, por isso espero que façam sentido.Terceiro, toque
index.txt
eserial.txt
:Em seguida, execute o seguinte:
Você deve ver semelhante ao seguinte:
Após a execução do comando, você terá um certificado de servidor recém-cunhado
servercert.pem
. A chave privada foi criada anteriormente e está disponível emserverkey.pem
.Por fim, você pode inspecionar seu certificado recém-cunhado com o seguinte:
Mais cedo, você adicionou o seguinte para
CA_default
:copy_extensions = copy
. Esta extensão de cópias é fornecida pela pessoa que faz a solicitação.Se você omitir
copy_extensions = copy
, o certificado do servidor não terá os SANs (Subject Alternate Names) comowww.example.com
email.example.com
.Se você usar
copy_extensions = copy
, mas não examinar a solicitação, o solicitante poderá induzi-lo a assinar algo como uma raiz subordinada (em vez de um servidor ou certificado de usuário). O que significa que ele será capaz de cunhar certificados que retornam à sua raiz confiável. Certifique-se de verificar a solicitaçãoopenssl req -verify
antes de assinar.Se você omitir
unique_subject
ou configurá-lo comoyes
, você poderá criar apenas um certificado com o nome distinto do sujeito.Tentar criar um segundo certificado durante a experiência resultará no seguinte ao assinar o certificado do servidor com a chave privada da CA:
Então,
unique_subject = no
é perfeito para testes.Se você deseja garantir que o Nome da organização seja consistente entre CAs autoassinadas, CA subordinada e certificados de entidade final, adicione o seguinte aos seus arquivos de configuração da CA:
Se você deseja permitir que o Nome da organização seja alterado, use:
Existem outras regras relacionadas ao tratamento de nomes DNS nos certificados X.509 / PKIX. Refira estes documentos para as regras:
As RFC 6797 e RFC 7469 estão listadas porque são mais restritivas que os outros RFCs e documentos CA / B. Os RFCs 6797 e 7469 também não permitem um endereço IP.
fonte
openssl req
é usado para gerar CSR,openssl req -x509
é usado para gerar certificado de CA (vi em algum outro lugar que você também pode criar certificado autoassinado),openssl ca
é usado para assinar um CSR com um certificado de CA. Certo? O que também me confunde é que as mesmas partes do arquivo openssl.cnf são usadas com valores diferentes, dependendo do comando ... Acho que estou totalmente perdido agora.openssl req -x509
é usado para criar a CA. Segundo,openssl req
é usado para criar o CSR do servidor. Terceiro,openssl ca
é usado para criar o certificado do servidor e certificá-lo com a assinatura da CA.openssl-ca.cnf
eopenssl-server.cnf
. Depois de se acostumar com eles e como as seções são invocadas, você pode combiná-las em uma monstruosidadeopenssl.cnf
.Além da resposta de @jww, gostaria de dizer que a configuração no openssl-ca.cnf,
define o número padrão de dias em que o certificado assinado por este root-ca será válido. Para definir a validade do próprio root-ca, você deve usar a opção '-days n' em:
Caso contrário, seu root-ca será válido apenas pelo mês padrão e qualquer certificado assinado por essa CA raiz também terá validade de um mês.
fonte