Problema no certificado SSL: verifique se o certificado da CA está OK
07 de abril de 2006
Ao abrir um URL seguro com o Curl, você pode receber o seguinte erro:
Problema no certificado SSL, verifique se o certificado da CA está OK
Vou explicar por que o erro e o que você deve fazer sobre isso.
A maneira mais fácil de se livrar do erro seria adicionar as duas linhas a seguir ao seu script. Esta solução apresenta um risco de segurança.
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
Vamos ver o que esses dois parâmetros fazem. Citando o manual.
CURLOPT_SSL_VERIFYHOST : 1 para verificar a existência de um nome comum no certificado de mesmo nível SSL. 2 para verificar a existência de um nome comum e também verificar se ele corresponde ao nome do host fornecido.
CURLOPT_SSL_VERIFYPEER : FALSE para impedir que CURL verifique o certificado do par. Certificados alternativos para verificação podem ser especificados com a opção CURLOPT_CAINFO ou um diretório de certificado pode ser especificado com a opção CURLOPT_CAPATH. Talvez CURLOPT_SSL_VERIFYHOST também precise ser TRUE ou FALSE se CURLOPT_SSL_VERIFYPEER estiver desativado (o padrão é 2). Definir CURLOPT_SSL_VERIFYHOST como 2 (este é o valor padrão) garantirá que o certificado que está sendo apresentado a você tenha um 'nome comum' correspondente ao URN que você está usando para acessar o recurso remoto. Esta é uma verificação saudável, mas não garante que o seu programa não está sendo enganado.
Digite o 'homem do meio'
Seu programa pode ser enganado ao conversar com outro servidor. Isso pode ser conseguido através de vários mecanismos, como DNS ou envenenamento por arp (esta é uma história para outro dia). O invasor também pode autoassinar um certificado com o mesmo 'nome comum' que seu programa está esperando. A comunicação ainda seria criptografada, mas você revelaria seus segredos a um impostor. Esse tipo de ataque é chamado de 'homem do meio'
Derrotar o 'homem do meio'
Bem, precisamos verificar se o certificado que está sendo apresentado para nós é bom de verdade. Fazemos isso comparando-o com um certificado em que razoavelmente * confiamos.
Se o recurso remoto estiver protegido por um certificado emitido por uma das principais autoridades de certificação como Verisign, GeoTrust et al, você poderá comparar com segurança o pacote de certificados de autoridade de certificação da Mozilla, que pode obter em
http://curl.haxx.se/docs/caextract .html
Salve o arquivo cacert.pem
em algum lugar do seu servidor e defina as seguintes opções no seu script.
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");