Tại sao không thể xác minh chính xác chứng chỉ trên Windows?


30

Khi tôi cố gắng sử dụng Curl trên windows, để lấy httpsurl, tôi nhận được "lỗi kết nối (60)" đáng sợ.

nhập mô tả hình ảnh ở đây

Thông báo lỗi chính xác là:

curl: (60) Sự cố chứng chỉ SSL, xác minh rằng chứng chỉ CA là OK. Chi tiết:
lỗi: 14090086: Các thói quen SSL: SSL3_GET_SERVER_CERTIFICATE: xác nhận chứng chỉ không thành công
Chi tiết tại đây: http://curl.haxx.se/docs/sslcerts.html

Làm thế nào để giải quyết điều này?


SU không thích từ "vấn đề" trong tiêu đề vì nó không được mô tả. Nếu bạn không thể tìm ra cách để diễn đạt lại tiêu đề của mình mà không có từ "vấn đề", thì bạn đã không cố gắng hết sức. :)
Garrett

1
đó là một trích dẫn chính xác của tin nhắn tôi đang hỏi về. Tôi không muốn xóa từ đó, đó là một từ quan trọng, để lập chỉ mục tìm kiếm.
Cheeso

@Cheeso: Nội dung bài đăng cũng được lập chỉ mục, ai đó đang tìm kiếm câu hỏi của bạn sẽ thấy nó trong phần mô tả dưới tiêu đề.
Tamara Wijsman

Câu trả lời:


36

Tôi không biết tại sao nhưng tôi không tìm thấy thông tin này ở một nơi.

  1. Tải xuống phiên bản nhận biết SSL của Curl hoặc tự xây dựng phiên bản nhận biết SSL.

  2. Từ http://curl.haxx.se/docs/caextract.html , Tải xuống tệp cacert.pem.

  3. Đặt tệp curl.exe và tệp .pem trong cùng một thư mục.

  4. Đổi tên cacert.pemtập tin thànhcurl-ca-bundle.crt

  5. Chạy lại curl.exe!


CHỈNH SỬA:

Có nhiều cách khác để giải quyết vấn đề. cách đặc biệt này phụ thuộc vào một cacert được sản xuất bởi nhà sản xuất Curl. Đó có thể không phải là điều bạn muốn và đặc biệt, nó có thể không hoạt động đối với các trường hợp bạn có cơ quan chứng nhận ít được biết đến (như cơ quan chỉ biết đến công ty của bạn) cho chứng chỉ được sử dụng bởi trang SSL . Trong trường hợp đó, bạn sẽ muốn tạo curl-ca-bundle.crttệp của riêng bạn . Bạn có thể sử dụng certreq.exe và openssl.exe để xuất một chứng chỉ như vậy từ cửa hàng IE / Windows, sau đó chuyển đổi định dạng thành pem tương ứng.


1
Cảm ơn bạn!!! Tôi đã cố gắng bảo vệ một HTTPS gần đây và có một chút thời gian cố gắng tìm ra cách để nó hoạt động. Giống như bạn, tôi cũng phải kiểm tra nhiều nguồn thông tin khác nhau, nhưng thật không may, tôi không tìm thấy phần nào về việc phải tải xuống tệp cert từ trang cURL (Tôi đã thấy rất nhiều thứ về việc tải xuống cert từ trang đích, nhưng không phải cái này)
Synetech

Vui vì nó đã giúp.
Cheeso

Điểm đổi tên của nó thành curl-ca-bundle.crt là gì? Là cửa sổ cụ thể?
nawfal

Cảm ơn! Tôi đã sử dụng curlđược đánh dấu WinSSLtrên Windows 7. Theo liên kết tài liệu, các phiên bản được đánh dấu chỉ nên hoạt động bằng chứng chỉ của hệ thống. Tuy nhiên, tôi đã nhận được lỗi cho đến khi tôi làm theo giải pháp của bạn.
George

Tuy nhiên, nếu người dùng cuối không có quyền quản trị viên, họ sẽ không thể đặt chứng chỉ mới vào các thư mục thuộc hệ thống. Ngoài ra, người dùng có thể sử dụng biến môi trường set CURL_CA_BUNDLE=<path to crt>. Làm cho shure định dạng của tập tin là đúng. Phương pháp này sẽ hoạt động ngay cả khi bạn có nhiều curlcài đặt, ví dụ như git, vagrant ...
Aaron C

6

Tôi đã tạo tập lệnh PowerShell có khả năng ghi ca-cert.crttệp dựa trên chứng chỉ CA được cài đặt trong cửa hàng chứng nhận Windows của bạn (CurrentUser hoặc LocalMachine). Chạy đoạn script như thế này:

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

Điều này sẽ tạo curl-ca-cert.crttệp nên được lưu trữ trong cùng thư mục curl.exevà bạn sẽ có thể xác thực các trang web giống như bạn có thể trong các ứng dụng Windows của mình (lưu ý rằng tệp này cũng có thể được sử dụng git).

Kịch bản "chính thức" có thể được tìm thấy trên GitHub , nhưng phiên bản ban đầu được liệt kê ở đây để tham khảo:

[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

Thật ra chúng tôi có cùng một vấn đề với Typheous / Ruby. Giải pháp đã tải xuống cacert.pem và lưu nó vào C: \ Windows \ System32 (hoặc bất cứ nơi nào Windows của bạn). Sau đó, chúng tôi đặt một biến môi trường toàn cầu như được ghi lại ở đây trong đó "Tên biến" phải là CURL_CA_BUNDLE"Giá trị biến" đường dẫn đến tệp %SystemRoot%\System32\cacert.pem.

Khi bắt đầu Phiên CMD mới, giờ đây bạn chỉ có thể sử dụng điều Typheous / Libcurl để xác thực Kết nối SSL. Tôi đã thử thành công với Windows 8.1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.