Adicionar certificado SSL após erro de curvatura: “impossível obter certificado de emissor local”

3

Estou tentando acessar uma API SOAP de parceiros. Para essa meta, fiz um CSR e recebi um CRT. Eu fiz um arquivo PEM com minha chave e o CRT:

cat mycert.crt mykey.key > mycertandkey.pem

Quando tento acertar o serviço com o curl:

curl --verbose --cert mycertandkey.pem https://partner/service?wsdl
* Hostname was NOT found in DNS cache
*   Trying IP.IP.IP.IP...
* Connected to PARTNER (IP.IP.IP.IP) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Agora, quando tento usar a opção -k, tudo funciona bem, mas prefiro adicionar o certificado SSL atual para que eu possa conectar sem a opção -k.

Eu gostaria de tentar a segunda opção na resposta a seguir, mas não consegui até agora: link

Recuperei certificados diferentes do meu serviço de parceiros com o openssl, como em: link

Depois, tentei adicionar esses certificados ao meu servidor com o link

Mas até agora eu ainda não consigo fazer o curl funcionar sem o sinalizador -k. Estou errado em como recuperar o certificado necessário ou em como o adiciono ao meu sistema? Ou estou enganado na minha abordagem geral?

EDIT 1: Isso é o que acontece quando tento obter os certificados via SSL

openssl s_client -showcerts -connect PARTNER:443 </dev/null
CONNECTED(00000003)
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO
   i:/C=PARTNER_INFO/ST=PARTNER_INFO/L=PARTNER_INFO/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO CA/emailAddress=PARTNER_INFO
-----BEGIN CERTIFICATE-----
CERTIFICATE1
-----END CERTIFICATE-----
 1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
   i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
-----BEGIN CERTIFICATE-----
CERTIFICATE2
-----END CERTIFICATE-----
 2 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
CERTIFICATE3
-----END CERTIFICATE-----
---
Server certificate
subject=/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO
issuer=/C=PARTNER_INFO/ST=PARTNER_INFO/L=PARTNER_INFO/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO CA/emailAddress=PARTNER_INFO
---
No client certificate CA names sent
---
SSL handshake has read 3872 bytes and written 503 bytes
---
MORE INFO...

Eu também tentei openssl s_client -showcerts -key mycertandkey.pem -connect PARTNER:443 </dev/null , mas isso me dá os mesmos resultados (e certificados).

EDIT 2: Como eu comentei na única resposta até agora: o parceiro em questão adicionou uma Gandi CA ao servidor deles (pelo menos é o que eles me dizem) e agora funciona. Assim, parece que desde que o seu certificado agora está assinado por uma CA que está no meu pacote CA padrão, agora posso fazer o curl funcionar sem o sinalizador -k. No entanto, seria bom saber como eu poderia ter corrigido o problema do meu lado.

    
por Ixio 30.06.2015 / 16:21

2 respostas

0

A opção --cert é para especificar seu próprio certificado (certificado de cliente). Mas não verifica o certificado dos servidores. Para especificar esse certificado, use --cacert ou --capath , dependendo de como você possui o certificado / CA dos servidores (consulte a documentação do curl). Observe que você normalmente não possui uma chave privada para o certificado de servidor, portanto, apenas o certificado sem a chave deve ser fornecido.

    
por 30.06.2015 / 16:40
0

Assumindo que seu sistema com curvatura está atualizado e possui os certificados de autoridade de certificação mais recentes do seu fornecedor, não é necessário importar nenhum certificado. A importação de um certificado para um domínio que você não possui deve sempre ser o último recurso. Se estiver fazendo isso, configure um cron job para enviar um e-mail para você e o parceiro mensalmente para lembrá-lo de corrigir isso. Importar alguém elses cert irá causar problemas para você mais tarde quando esse certificado expirar. Agora você precisa gerenciar certificados que não pertencem a você. Encaminhe com o parceiro ou fornecedor até que eles corrijam a instalação do certificado.

Peça-lhes que testem o site:

Testes via interface da web

Qualys

Comprador SSL

Do prompt de comando

TestSSL Isso requer apenas openssl e bash. Isso é útil para vips / end-points que não estão abertos para toda a Internet, como sites temporários.

Apenas git clone https://github.com/drwetter/testssl.sh.git , em seguida, use testssh.sh para validar um serviço https.

Depois que o site SSL estiver correto

Agora, você precisa garantir que seus certificados de autoridade de certificação em seu sistema operacional estejam atualizados. O método de atualização destes varia com a distribuição do sistema operacional e será deixado para os seus administradores para pesquisa.

Importação de certificados

Depois de verificar se o site do seu parceiro está configurado corretamente; ou seja, valida corretamente no Qualys, SSL Shopper e TestSSL.sh, então

Copie o certificado para /etc/pki/ca-trust/source/anchors/ import e valide-o.

cp /path/to/bad_partner_cert.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust enable
update-ca-trust extract
openssl verify /etc/pki/ca-trust/source/anchors/bad_partner_cert.pem

Novamente, isso deve ser um último recurso e muito temporário , pois agora você está gerenciando um certificado que não pertence a você.

    
por 05.07.2017 / 21:40