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

28

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

Amensagemdeerroexataé:

curl:(60)SSLcertificateproblem,verifythattheCAcertisOK.Details:
error:14090086:SSLroutines:SSL3_GET_SERVER_CERTIFICATE:certificateverifyfailed
Moredetailshere:http://curl.haxx.se/docs/sslcerts.html

Como resolver isso?

    
por Cheeso 28.06.2012 / 22:54

3 respostas

33

Eu não sei porque, mas não encontrei essa informação em um só lugar.

  1. Faça o download da versão do Curl com reconhecimento de SSL ou crie a versão com reconhecimento de SSL você mesmo.

  2. Do link , Baixe o arquivo cacert.pem.

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

  4. Renomeie o arquivo cacert.pem para curl-ca-bundle.crt

  5. Execute novamente o curl.exe!

EDITAR:

Existem outras maneiras de resolver o problema. Desta forma, depende de um cacert produzido pelo fabricante de Curl. Isso pode não ser o que você deseja e, em particular, pode não funcionar nos casos em que você tenha uma autoridade de certificação menos conhecida (como uma autoridade conhecida apenas por sua corporação) para o certificado usado pelo site SSL . Nesse caso, você desejará gerar seu próprio arquivo curl-ca-bundle.crt . Você pode usar certreq.exe e openssl.exe para exportar esse certificado da loja do IE / Windows e, em seguida, converter para o formato pem, respectivamente.

    
por 28.06.2012 / 22:59
6

Eu criei um script do PowerShell capaz de gravar o arquivo ca-cert.crt com base nos certificados de autoridade de certificação instalados no armazenamento 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 arquivo curl-ca-cert.crt que deve ser armazenado no mesmo diretório que curl.exe e você poderá validar os mesmos sites que puder em seus aplicativos do Windows (observe que esse arquivo também pode ser consumido por git ).

O script "oficial" pode ser encontrado em 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-----"
}
    
por 14.10.2016 / 20:20
2

Na verdade, tivemos o mesmo problema com o Typheous / Ruby. A solução foi baixar o cacert.pem e salvá-lo em C: \ Windows \ System32 (ou onde quer que seu Windows esteja ). Depois disso, definimos uma variável de ambiente global como descrito aqui onde o "Nome da Variável" deve ser CURL_CA_BUNDLE e o "Valor da Variável" o caminho para o arquivo %SystemRoot%\System32\cacert.pem .

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

    
por 17.01.2017 / 09:48

Tags