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.