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

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

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 certificado SSL, verifique se o certificado 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?

Responder1

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

  1. Baixe a versão do Curl com reconhecimento de SSL ou crie você mesmo a versão com reconhecimento de SSL.

  2. Dehttp://curl.haxx.se/docs/caextract.html, Baixe o arquivo cacert.pem.

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

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

  5. Execute novamente curl.exe!


EDITAR:

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

Responder2

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

O script "oficial" pode ser encontrado emGitHub, 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]::Root, $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-----"
}

Responder3

Na verdade, tivemos o mesmo problema com Typheous/Ruby. A solução foi baixar ocacert.peme salve-o em C:\Windows\System32 (ou onde quer que esteja o seu Windows). Depois disso, definimos uma variável de ambiente globalcomo descrito aquionde deve estar o "Nome da Variável" CURL_CA_BUNDLEe o "Valor da Variável" o caminho para o arquivo %SystemRoot%\System32\cacert.pem.

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

informação relacionada