Pourquoi cURL ne peut-il pas vérifier correctement un certificat sous Windows?

30

Lorsque j'essaie d'utiliser Curl sur Windows, pour récupérer une httpsURL, j'obtiens la redoutable "erreur de connexion (60)".

entrez la description de l'image ici

Le message d'erreur exact est:

curl: (60) Problème de certificat SSL, vérifiez que le certificat CA est OK. Détails:
erreur: 14090086: routines SSL: SSL3_GET_SERVER_CERTIFICATE: échec de la vérification du certificat
Plus de détails ici: http://curl.haxx.se/docs/sslcerts.html

Comment résoudre ça?

Cheeso
la source
SU n'aime pas le mot «problème» dans le titre car il n'est pas descriptif. Si vous ne pouvez pas trouver un moyen de reformuler votre titre sans le mot «problème», vous n'essayez pas assez fort. :)
Garrett
1
c'est une citation exacte du message que je demande. Je ne veux pas essayer de supprimer ce mot, il est important pour l'indexation de la recherche.
Cheeso
@Cheeso: Le contenu de la publication est également indexé, une personne recherchant votre question la verra dans la description sous le titre.
Tamara Wijsman

Réponses:

36

Je ne sais pas pourquoi mais je n'ai pas trouvé toutes ces informations au même endroit.

  1. Téléchargez la version compatible avec SSL de Curl, ou créez vous-même la version compatible avec SSL.

  2. Depuis http://curl.haxx.se/docs/caextract.html , téléchargez le fichier cacert.pem.

  3. Placez le curl.exe et le fichier .pem dans le même répertoire.

  4. Renommez le cacert.pemfichier encurl-ca-bundle.crt

  5. Relancez curl.exe!


MODIFIER:

Il existe d'autres moyens de résoudre le problème. cette façon particulière repose sur un cacert produit par le fabricant de Curl. Ce n'est peut-être pas ce que vous voulez, et en particulier, cela peut ne pas fonctionner dans les cas où vous disposez d'une autorité de certification moins connue (comme une autorité connue de votre entreprise uniquement) pour le certificat utilisé par le site SSL. . Dans ce cas, vous souhaiterez générer votre propre curl-ca-bundle.crtfichier. Vous pouvez utiliser certreq.exe et openssl.exe pour exporter un tel certificat à partir du magasin IE / Windows, puis convertir au format pem, respectivement.

Cheeso
la source
1
Merci!!! J'ai récemment essayé de boucler un HTTPS et j'ai eu beaucoup de mal à essayer de comprendre comment le faire fonctionner. Comme vous, j'ai aussi dû vérifier diverses sources d'informations, mais malheureusement, je n'ai pas trouvé la partie concernant le téléchargement du fichier cert depuis le site cURL (j'ai vu beaucoup de choses sur le téléchargement du cert depuis le site cible, mais pas ça).
Synetech
Heureux que cela ait aidé.
Cheeso
Quel est l'intérêt de le renommer en curl-ca-bundle.crt? Est-ce spécifique à Windows?
nawfal
Merci! J'utilisais curlmarqué WinSSLsur Windows 7. Selon le lien de documentation, les versions ainsi marquées devraient simplement fonctionner en utilisant les certificats du système. Cependant, j'obtenais l'erreur jusqu'à ce que je suive votre solution.
George
Cependant, si l'utilisateur final n'a pas de droits d'administrateur, il ne pourra pas placer le nouveau certificat sur des dossiers appartenant au système. L'utilisateur peut également utiliser la variable d'environnement set CURL_CA_BUNDLE=<path to crt>. Assurez-vous que le format du fichier est correct. Cette méthode fonctionnera même si vous avez plusieurs curlinstallations, par exemple git, vagrant ...
Aaron C
6

J'ai créé un script PowerShell capable d'écrire le ca-cert.crtfichier en fonction des certificats d'autorité de certification installés dans votre magasin de certification Windows (CurrentUser ou LocalMachine). Exécutez le script comme ceci:

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

Cela créera le curl-ca-cert.crtfichier qui devrait être stocké dans le même répertoire que curl.exeet vous devriez être en mesure de valider les mêmes sites que vous pouvez dans vos applications Windows (notez que ce fichier peut également être utilisé par git).

Le script "officiel" peut être trouvé sur GitHub , mais la version initiale est répertoriée ici pour référence:

[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
la source
2

En fait, nous avons eu le même problème avec Typheous / Ruby. La solution téléchargeait le cacert.pem et l'enregistrait dans C: \ Windows \ System32 (ou où que soit Windows). Après cela, nous définissons une variable d'environnement global comme décrit ici où le "Nom de la variable" doit être CURL_CA_BUNDLEet la "Valeur de la variable" le chemin d'accès au fichier %SystemRoot%\System32\cacert.pem.

Lors du démarrage d'une nouvelle session CMD, vous pouvez maintenant simplement utiliser la chose Typheous / Libcurl pour authentifier les connexions SSL. J'ai essayé avec succès cela avec Windows 8.1.

Martin
la source