Erro de certificado SSL: verifique o erro: num = 20: não é possível obter o certificado do emissor local


11

Eu tenho tentado obter uma conexão SSL com um servidor LDAPS (Active Directory) para funcionar, mas continuo tendo problemas. Eu tentei usar isso:

openssl s_client -connect the.server.edu:3269 

Com o seguinte resultado:

verify error:num=20:unable to get local issuer certificate 

Eu pensei, OK, bem, servidor é um servidor de produção antigo há alguns anos. Talvez o CA não esteja presente. Em seguida, puxei o certificado da saída para um arquivo pem e tentei:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

E isso também não funcionou.

o que estou perdendo? Isso não deveria SEMPRE funcionar?

ssl  openssl 

Por uma questão de clareza, parece que o LDAPS, quando servido no Windows, não apresenta o certificado de CA quando uma conexão é estabelecida. Portanto, você deve obter o certificado CA X.509, exportar como base64 e atribuir conforme descrito nas respostas abaixo. No meu caso, usando python-ldap, você o atribui no escopo GLOBAL (não sua instância ldap.initialize ()) como: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Depois disso, pude usar STARTTLS (na porta LDAP 389) conforme o esperado.
precisa saber é o seguinte

Respostas:


4

Portanto, é isso que eu vejo como o nome do certificado da CA:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

Esse era o nome do certificado que eu havia importado depois de fazer os showshows na minha segunda tentativa acima. Listei os certificados no keystore fazendo o seguinte:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Eu vejo o certificado da CA lá.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

Para garantir que o openssl esteja usando o keystore que estou usando com o servidor, estou usando o argumento -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

Sabendo que o keystore java para CA's tem uma senha, tentei usar a opção -pass pass: password como esta:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

mas isso também não funcionou.

O engraçado é que o arquivo cacerts tem uma senha e o openssl não está reclamando que não pode ler o arquivo cacerts. Isso parece suspeito para mim. Isso ou qualquer outra coisa toca uma campainha?


3

Esse erro é a maneira do openssl de dizer: "Não consigo seguir a cadeia de certificados até uma raiz confiável". Acabei de executar o mesmo comando em meus próprios servidores AD e recebo uma cadeia de certificados completa, mas o certificado superior tem esse erro exato. Se você tiver a chave de pub da CA que assinou o certificado, poderá especificá-la com as opções -CAfileou-CApath


Ok, obrigado pela resposta. Então eu tentei isso. Obtenha o certificado da CA, fazendo a mesma coisa com a opção -showcerts, e pegue o outro certificado. Esse deve ser o certificado da CA, certo? Tentei isso em vez do certificado do servidor no arquivo pem e recebi a mesma mensagem de erro. Algum outro pensamento?

Nesse caso, é provável que esteja falhando na validação por outro motivo, como expirar.
sysadmin1138

1

Eu tenho tentado obter uma conexão SSL com um servidor LDAPS (Active Directory) para funcionar, mas continuo tendo problemas. Eu tentei usar isso:

Se você estiver usando o OpenLDAP, poderá definir:

TLS_REQCERT=never

no seu openldap.confarquivo, que instrui o OpenLDAP a não tentar a verificação do certificado. Existe uma opção semelhante se você estiver fazendo autenticação LDAP com o Apache.

Se você realmente deseja executar a verificação de certificado, o seguinte pode ajudar:

o que estou perdendo? Isso não deveria SEMPRE funcionar?

Acho que não. Embora o seguinte possa parecer definitivo, é realmente apenas o meu melhor convidado:

O que você tentou funcionaria apenas para um certificado autoassinado. Como o certificado foi realmente emitido pela CA do Windows, tentar usar o certificado do servidor como argumento para -CAfilenão obter nada.

Obtenha o certificado da CA, fazendo a mesma coisa com a opção -showcerts, e pegue o outro certificado. Esse deve ser o certificado da CA, certo?

Não necessariamente não. Não há garantia de que o servidor remoto apresente o certificado CA em sua saída. Você precisa primeiro olhar para o emissor do certificado do servidor:

openssl x509 -in server.crt -noout -text | grep Issuer

... e veja se um dos outros certificados que você possui corresponde a esse emissor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.