Estou construindo uma própria cadeia de certificados com os seguintes componentes:
Root Certificate - Intermediate Certificate - User Certificate
O Root Cert é um certificado autoassinado, o Certificado Intermediário é assinado pela Raiz e o Usuário pelo Intermediário.
Agora, quero verificar se um certificado de usuário tem sua âncora pelo certificado raiz.
Com
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
a validação está ok. Na próxima etapa, valido o certificado do usuário com
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
e a validação mostra
error 20 at 0 depth lookup:unable to get local issuer certificate
O que está errado?
openssl
certificate
Indra
fonte
fonte
man verify
, descobri que o-untrusted
parâmetro é o correto a ser usado ao especificar o certificado intermediário.-untrusted
não verifica se a cadeia de certificados é totalmente válida. Por favor, considere passar o intermediário e o root para o comando,-CAfile
como sugere outras perguntas.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Esse é um dos poucos trabalhos legítimos para
cat
:Atualizar:
Como Greg Smethells aponta nos comentários, esse comando confia implicitamente no Intermediate.pem . Eu recomendo a leitura da primeira parte das referências de Greg (a segunda parte é especificamente sobre pyOpenSSL e não é relevante para esta pergunta).
Caso o post desapareça, citarei os parágrafos importantes:
Parece que o openssl irá parar de verificar a cadeia assim que um certificado raiz for encontrado, que também pode ser Intermediate.pem se for autoassinado. Nesse caso, RootCert.pem não é considerado. Portanto, verifique se o Intermediate.pem é proveniente de uma fonte confiável antes de confiar no comando acima.
fonte
O problema é que
openssl -verify
isso não funciona.Como Priyadi mencionou ,
openssl -verify
para no primeiro certificado autoassinado, portanto, você realmente não verifica a cadeia, pois geralmente o certificado intermediário é autoassinado.Observe que a resposta de Pedro está correta , no entanto, a saída de
openssl -verify
não é nenhuma pista de que tudo realmente funciona depois. Sim, pode encontrar alguns problemas, mas não todos.Aqui está um script que executa a tarefa de verificar uma cadeia de certificados antes de instalá-la no Apache. Talvez isso possa ser aprimorado com algumas das mágicas mais místicas do OpenSSL, mas eu não sou um guru do OpenSSL e os seguintes trabalhos:
Existe uma GistHub Gist disso que pode ter algumas atualizações
Pré-requisitos deste script:
/etc/ssl/certs
como de costume, por exemplo, no UbuntuDIR
onde você armazena 3 arquivos:DIR/certificate.crt
que contém o certificadoDIR/certificate.key
que contém a chave secreta do seu serviço da web (sem senha)DIR/certificate.bundle
que contém o CA-Bundle. Sobre como preparar o pacote, veja abaixo../check DIR/certificate
(isso pressupõe que o script seja nomeadocheck
no diretório atual)CA-Bundle is not needed
. Isso significa que você (leia/etc/ssl/certs/
:) já confia no certificado de assinatura. Mas isso é altamente improvável na WWW.Como criar o
certificate.bundle
arquivo?Na WWW, a cadeia de confiança geralmente se parece com isso:
/etc/ssl/certs
certificate.crt
)Agora, a avaliação ocorre de baixo para cima, ou seja, primeiro, seu certificado é lido, então é necessário o certificado intermediário desconhecido, talvez o certificado de assinatura cruzada e, em seguida,
/etc/ssl/certs
é consultado para encontrar o certificado confiável adequado.O pacote CA deve ser formado exatamente na ordem de processamento correta, ou seja, o primeiro certificado necessário (o certificado intermediário que assina seu certificado) é o primeiro no pacote. Em seguida, é necessário o certificado de assinatura cruzada.
Normalmente, sua autoridade de certificação (a autoridade que assinou seu certificado) já fornecerá um arquivo CA-bundle adequado. Caso contrário, você precisará escolher todos os certificados intermediários necessários e
cat
eles juntos em um único arquivo (no Unix). No Windows, você pode simplesmente abrir um editor de texto (comonotepad.exe
) e colar os certificados no arquivo, o primeiro necessário na parte superior e os demais.Há outra coisa. Os arquivos precisam estar no formato PEM. Algumas autoridades de certificação emitem o formato DER (um binário). O PEM é fácil de detectar: é legível em ASCII. Para informações sobre como converter algo em PEM, consulte Como converter .crt em .pem e siga a estrada de tijolos amarelos.
Exemplo:
Você tem:
intermediate2.crt
o certificado intermediário que assinou seucertificate.crt
intermediate1.crt
outro certificado intermediário, que chamuscavaintermediate2.crt
crossigned.crt
que é um certificado de assinatura cruzada de outra CA, que assinouintermediate1.crt
crossintermediate.crt
que é outro intermediário da outra CA que assinoucrossigned.crt
(você provavelmente nunca verá uma coisa dessas)Então o apropriado
cat
ficaria assim:E como você pode descobrir quais arquivos são necessários ou não e em qual sequência?
Bem, experimente, até que o
check
informe que está tudo bem. É como um jogo de quebra-cabeça de computador para resolver o enigma. Cada. Solteiro. Tempo. Mesmo para profissionais. Mas você vai melhorar cada vez que precisar fazer isso. Então você definitivamente não está sozinho com toda essa dor. É SSL, sabe? O SSL é provavelmente um dos piores projetos que já vi em mais de 30 anos de administração profissional de sistemas. Já se perguntou por que a criptografia não se tornou popular nos últimos 30 anos? É por isso. disse nuff.fonte
Eu tive que fazer uma verificação de um certificado letsencrypt e fiz assim:
Emita este comando:
fonte
Depois de quebrar um dia inteiro no mesmo problema, sem nenhum conhecimento prévio sobre certificados SSL, baixei o Gerenciador de Chaves do CERTivity Keystores e importei meu keystore para ele, e obtive uma visualização clara da cadeia de certificados.
Captura de tela:
fonte
openssl verify
.Se você deseja apenas verificar se o emissor de
UserCert.pem
é realmenteIntermediate.pem
faça o seguinte (o exemplo usaOpenSSL 1.1.1
:):e você receberá:
ou
fonte
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
no Python 3.7?Você pode verificar facilmente uma cadeia de certificados com o openssl. A cadeia completa incluirá o certificado da CA, portanto você deve ver detalhes sobre a CA e o próprio certificado.
openssl x509 -em fullchain.pem -text -noout
fonte