เหตุใด cURL ไม่สามารถตรวจสอบใบรับรองอย่างถูกต้องใน Windows


30

เมื่อฉันพยายามใช้ Curl บน windows เพื่อดึงhttpsurl ฉันได้รับข้อผิดพลาด "การเชื่อมต่อข้อผิดพลาด (60)"

ป้อนคำอธิบายรูปภาพที่นี่

ข้อความแสดงข้อผิดพลาดที่แน่นอนคือ:

curl: (60) ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง รายละเอียด:
ข้อผิดพลาด: 14090086: รูทีน SSL: SSL3_GET_SERVER_CERTIFICATE: การตรวจสอบใบรับรองล้มเหลว
รายละเอียดเพิ่มเติมที่นี่: http://curl.haxx.se/docs/sslcerts.html

วิธีแก้ปัญหานี้


SU ไม่ชอบคำว่า "ปัญหา" ในชื่อเพราะไม่ได้อธิบาย หากคุณไม่สามารถหาวลีวลีที่ไม่มีคำว่า "ปัญหา" ได้แสดงว่าคุณยังพยายามไม่พอ :)
การ์เร็ตต์

1
มันเป็นข้อความที่ฉันต้องการถามอย่างแน่นอน ฉันไม่ต้องการลองลบคำนั้นมันเป็นคำที่สำคัญสำหรับการทำดัชนีการค้นหา
Cheeso

@Cheeso: โพสต์เนื้อหาได้รับการจัดทำดัชนีเช่นกันบางคนที่ค้นหาคำถามของคุณจะเห็นมันในคำอธิบายใต้ชื่อ
Tamara Wijsman

คำตอบ:


36

ฉันไม่รู้ว่าทำไม แต่ฉันไม่พบข้อมูลนี้ทั้งหมดในที่เดียว

  1. ดาวน์โหลด Curl รุ่น SSL-aware หรือสร้างรุ่น SSL-aware ด้วยตัวคุณเอง

  2. จากhttp://curl.haxx.se/docs/caextract.htmlดาวน์โหลดไฟล์ cacert.pem

  3. วาง curl.exe และไฟล์. pem ไว้ในไดเรกทอรีเดียวกัน

  4. เปลี่ยนชื่อcacert.pemไฟล์เป็นcurl-ca-bundle.crt

  5. รัน curl.exe อีกครั้ง!


แก้ไข:

มีวิธีอื่นในการแก้ปัญหา วิธีนี้อาศัย cacert ที่ผลิตโดยผู้ผลิต Curl นั่นอาจไม่ใช่สิ่งที่คุณต้องการและโดยเฉพาะอย่างยิ่งมันอาจไม่ได้ผลสำหรับกรณีที่คุณมีหน่วยงานรับรองที่ไม่เป็นที่รู้จัก (เช่นหน่วยงานที่ บริษัท ของคุณรู้จักเท่านั้น) สำหรับใบรับรองที่ใช้โดยไซต์ SSL . ในกรณีนั้นคุณจะต้องสร้างcurl-ca-bundle.crtไฟล์ของคุณเอง คุณสามารถใช้ certreq.exe และ openssl.exe เพื่อส่งออกใบรับรองดังกล่าวจากร้านค้า IE / Windows แล้วแปลงเป็นรูปแบบ pem-format ตามลำดับ


1
ขอขอบคุณ!!! ฉันพยายามที่จะม้วน HTTPS เมื่อไม่นานมานี้และมีเวลาพยายามหาวิธีให้มันใช้งานได้ เช่นเดียวกับคุณฉันก็ต้องตรวจสอบแหล่งข้อมูลที่หลากหลาย แต่น่าเสียดายที่ฉันไม่พบส่วนเกี่ยวกับการดาวน์โหลดไฟล์ใบรับรองจากไซต์ cURL (ฉันเห็นสิ่งต่าง ๆ มากมายเกี่ยวกับการดาวน์โหลดใบรับรองจากไซต์เป้าหมาย แต่ไม่ใช่สิ่งนี้)
Synetech

ดีใจที่มันช่วย
Cheeso

จุดเปลี่ยนชื่อเป็น curl-ca-bundle.crt คืออะไร เป็นหน้าต่างเฉพาะหรือไม่?
nawfal

ขอบคุณ! ฉันกำลังใช้การcurlทำเครื่องหมายWinSSLบน Windows 7 ตามลิงค์เอกสารคู่มือเวอร์ชันที่ระบุว่าควรทำงานโดยใช้ใบรับรองของระบบ อย่างไรก็ตามฉันได้รับข้อผิดพลาดจนกว่าฉันจะทำตามวิธีแก้ปัญหาของคุณ
George

อย่างไรก็ตามหากผู้ใช้ไม่มีสิทธิ์ของผู้ดูแลระบบพวกเขาจะไม่สามารถวางใบรับรองใหม่ลงในโฟลเดอร์ที่เป็นของระบบ set CURL_CA_BUNDLE=<path to crt>อีกวิธีหนึ่งคือผู้ใช้สามารถใช้ตัวแปรสภาพแวดล้อม ทำให้รูปแบบของไฟล์มีความเหมาะสม วิธีนี้จะใช้ได้แม้ว่าคุณจะมีcurlการติดตั้งหลายอย่างเช่นคอมไพล์คนจรจัด ...
แอรอน C

6

ฉันสร้างสคริปต์ PowerShell ที่สามารถเขียนca-cert.crtไฟล์ตามใบรับรอง CA ที่ติดตั้งในที่เก็บใบรับรอง Windows ของคุณ (CurrentUser หรือ LocalMachine) เรียกใช้สคริปต์เช่นนี้:

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

สิ่งนี้จะสร้างcurl-ca-cert.crtไฟล์ที่ควรเก็บไว้ในไดเรกทอรีเดียวกับcurl.exeและคุณควรตรวจสอบไซต์เดียวกันกับที่คุณใช้ในแอปพลิเคชัน Windows ของคุณ (โปรดทราบว่าไฟล์นี้ยังสามารถใช้งานได้git)

สคริปต์ "เป็นทางการ" สามารถพบได้ในGitHubแต่รุ่นเริ่มต้นอยู่ที่นี่เพื่อการอ้างอิง:

[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-----"
}

2

จริงๆแล้วเรามีปัญหาเดียวกันกับ Typheous / Ruby โซลูชันกำลังดาวน์โหลดcacert.pemและบันทึกลงใน C: \ Windows \ System32 (หรือที่ใดก็ตามที่คุณใช้ Windows) หลังจากนั้นเราจะกำหนดตัวแปรสภาพแวดล้อมของโลกเช่น discribed ที่นี่ที่ "ชื่อตัวแปร" ต้องCURL_CA_BUNDLEและ "ค่าตัวแปร" %SystemRoot%\System32\cacert.pemเส้นทางไปยังแฟ้ม

เมื่อเริ่มต้นเซสชัน CMD ใหม่ตอนนี้คุณสามารถใช้ Typheous / Libcurl ในการตรวจสอบการเชื่อมต่อ SSL ฉันลองใช้ Windows 8.1 สำเร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.