Por que o cURL não pode verificar corretamente um certificado no Windows?

30

Quando tento usar o Curl no Windows, para recuperar um httpsURL, recebo o temido "erro de conexão (60)".

insira a descrição da imagem aqui

A mensagem de erro exata é:

curl: (60) problema com o certificado SSL, verifique se o certificado da CA está OK. Detalhes:
erro: 14090086: rotinas SSL: SSL3_GET_SERVER_CERTIFICATE: falha na verificação do certificado
Mais detalhes aqui: http://curl.haxx.se/docs/sslcerts.html

Como resolver isso?

Cheeso
fonte
SU não gosta da palavra "problema" no título porque não é descritiva. Se você não consegue encontrar uma maneira de reformular seu título sem a palavra "problema", não está se esforçando o suficiente. :)
Garrett
11
é uma citação exata da mensagem que estou perguntando. Não quero tentar remover essa palavra, é importante para a indexação da pesquisa.
Cheeso
@ Chees: o conteúdo das postagens também é indexado; alguém que pesquisar sua pergunta o verá na descrição sob o título.
Tamara Wijsman

Respostas:

36

Não sei por que, mas não encontrei essas informações em um só lugar.

  1. Faça o download da versão compatível com SSL do Curl ou crie você mesmo a versão compatível com SSL.

  2. Em http://curl.haxx.se/docs/caextract.html , faça o download do arquivo cacert.pem.

  3. Coloque o curl.exe e o arquivo .pem no mesmo diretório.

  4. Renomeie o cacert.pemarquivo paracurl-ca-bundle.crt

  5. Execute novamente o curl.exe!


EDITAR:

Existem outras maneiras de resolver o problema. dessa maneira particular, depende de uma cacert produzida pelo fabricante da Curl. Pode não ser o que você deseja e, em particular, pode não funcionar nos casos em que você possui uma autoridade de certificação pouco conhecida (como uma autoridade conhecida apenas por sua empresa) para o certificado usado pelo site SSL . Nesse caso, você desejará gerar seu próprio curl-ca-bundle.crtarquivo. Você pode usar o certreq.exe e o openssl.exe para exportar esse certificado da loja IE / Windows e depois converter para o formato pem, respectivamente.

Cheeso
fonte
11
Obrigado!!! Tentei gravar um HTTPS recentemente e tive um tempo tentando descobrir como fazê-lo funcionar. Assim como você, eu também precisei verificar várias fontes para obter informações, mas, infelizmente, não achei a parte de ter que baixar o arquivo cert do site cURL (eu vi muitas coisas sobre o download do certificado no site de destino, mas não isso).
Synetech
Ainda bem que ajudou.
Cheeso
Qual o sentido de renomeá-lo para curl-ca-bundle.crt? É específico do Windows?
Nawfal 9/11/2015
Obrigado! Eu estava usando curlmarcado WinSSLno Windows 7. De acordo com o link da documentação, as versões marcadas devem funcionar apenas com os certificados do sistema. No entanto, eu estava recebendo o erro até seguir sua solução.
George
No entanto, se o usuário final não tiver direitos de administrador, ele não poderá colocar o novo certificado nas pastas pertencentes ao sistema. Como alternativa, o usuário pode usar a variável de ambiente set CURL_CA_BUNDLE=<path to crt>. Certifique-se de que o formato do arquivo seja adequado. Este método irá funcionar mesmo se você tiver várias curlinstalações, por exemplo, Git, vagabundo ...
Aaron C
6

Criei um script do PowerShell capaz de gravar o ca-cert.crtarquivo com base nos certificados de CA instalados no seu repositório de certificação do Windows (CurrentUser ou LocalMachine). Execute o script assim:

CreateCaCert.ps1 -StoreLocation CurrentUser | Out-File -Encoding utf8 curl-ca-cert.crt

Isso criará o curl-ca-cert.crtarquivo que deve ser armazenado no mesmo diretório curl.exee você poderá validar os mesmos sites dos aplicativos do Windows (observe que esse arquivo também pode ser consumido git).

O script "oficial" pode ser encontrado no GitHub , mas a versão inicial está listada aqui para referência:

[CmdletBinding()]
Param(
    [ValidateSet(
        [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser,
        [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine)]
    [string]
    $StoreLocation = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
)

$maxLineLength = 77

# Open the store
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store ([System.Security.Cryptography.X509Certificates.StoreName]::AuthRoot, $StoreLocation)
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly);

# Write header
Write-Output "# Root certificates ($StoreLocation) generated at $(Get-Date)"

# Write all certificates
Foreach ($certificate in $store.Certificates)
{
    # Start with an empty line
    Write-Output ""

    # Convert the certificate to a BASE64 encoded string
    $certString = [Convert]::ToBase64String($certificate.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert));

    # Write the actual certificate
    Write-Output "# Friendly name: $($certificate.FriendlyName)"
    Write-Output "# Issuer:        $($certificate.Issuer)"
    Write-Output "# Expiration:    $($certificate.GetExpirationDateString())"
    Write-Output "# Serial:        $($certificate.SerialNumber)"
    Write-Output "# Thumbprint:    $($certificate.Thumbprint)"
    Write-Output "-----BEGIN CERTIFICATE-----"
    For ($i = 0; $i -lt $certString.Length; $i += $maxLineLength)
    {
        Write-Output $certString.Substring($i, [Math]::Min($maxLineLength, $certString.Length - $i))
    }
    Write-Output "-----END CERTIFICATE-----"
}
Ramon de Klein
fonte
2

Na verdade, tivemos o mesmo problema com o Typheous / Ruby. A solução estava baixando o cacert.pem e salve-o em C: \ Windows \ System32 (ou onde quer que esteja o Windows). Depois disso, definimos uma variável de ambiente global como descrita aqui, onde o "Nome da variável" deve estar CURL_CA_BUNDLEe o "Valor da variável" o caminho para o arquivo %SystemRoot%\System32\cacert.pem.

Ao iniciar uma nova sessão do CMD, agora você pode apenas usar a opção Typheous / Libcurl para autenticar conexões SSL. Eu tentei isso com sucesso com o Windows 8.1.

Martin
fonte