Làm cách nào để tôi xử lý chứng chỉ bằng cURL trong khi cố gắng truy cập url HTTPS?


187

Tôi nhận được lỗi sau khi sử dụng curl:

curl: (77) xác nhận cài đặt chứng chỉ xác minh vị trí:
  CAfile: /etc/ssl/certs/ca-certert.crt
  Thông báo: không có

Làm cách nào để đặt chứng chỉ xác minh vị trí này? Cảm ơn.


2
Bạn đang dùng HĐH / distro nào? Bạn nên cài đặt gói ca-chứng chỉ (đó là tên gọi trên debian / ubfox).
igorw

40
Để tham khảo trong tương lai, tôi đã ca-certificatescài đặt nhưng lỗi vẫn còn. Vấn đề là các chứng chỉ của tôi được đặt /etc/ssl/certs/ca-certificates.crtthay vì /etc/pki/tls/certs/ca-bundle.crt, vì vậy tôi chỉ cần đặt biến môi trường CURL_CA_BUNDLEthành đường dẫn chính xác.
Robert Smith

13
Mát mẻ! Nó hoạt động cho tôi khi tôi thiết lập export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
gọn gàng

Câu trả lời:


82

Lỗi này liên quan đến một gói bị thiếu : ca-certificates. Cài đặt nó.

Trong Ubuntu Linux (và bản phân phối tương tự):

# apt-get install ca-certificates

Trong CygWin thông qua Apt-Cyg

# apt-cyg install ca-certificates

Trong Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

Các tài liệu cho biết:

Gói này bao gồm các tệp PEM của chứng chỉ CA để cho phép các ứng dụng dựa trên SSL kiểm tra tính xác thực của các kết nối SSL.

Như đã thấy tại: Debian - Chi tiết về chứng chỉ ca-gói


97
giấy chứng nhận ca đã là phiên bản mới nhất, nhưng tôi vẫn nhận được lỗi
Mục sư Bones

2
Tất nhiên, bạn sẽ gặp lỗi tương tự nếu bạn cố gắng cài đặt apt-cyg thông qua phương pháp được đề xuất bằng curl và raw.github.com .
10gistic

11
Trên Arch Linux, bạn cũng có thể cần pacman -S ca-certificates-utils. Tôi đã làm.
Mark Grimes

8
Gói này đã được cài đặt. Câu trả lời này không hữu ích.
JimmyJames

8
@PastorBones Tôi gặp vấn đề tương tự là gói đã bị lỗi mới nhất, tôi nghĩ rằng nó đã bị hỏng nên đã sudo apt install --reinstall ca-certificatescài đặt lại gói và giải quyết các lỗi tôi gặp
Sẽ là

153

Tôi cũng đã cài đặt phiên bản mới nhất của chứng chỉ ca nhưng vẫn gặp lỗi:

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

Vấn đề là curl dự kiến ​​chứng chỉ sẽ ở đường dẫn /etc/pki/tls/certs/ca-bundle.crtnhưng không thể tìm thấy vì nó nằm ở đường dẫn /etc/ssl/certs/ca-certificates.crt.

Sao chép chứng chỉ của tôi đến đích dự kiến ​​bằng cách chạy

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

đã làm cho tôi. Bạn sẽ cần tạo các thư mục cho đích đích nếu chúng không tồn tại bằng cách chạy

sudo mkdir -p /etc/pki/tls/certs

Nếu cần, hãy sửa đổi lệnh trên để làm cho tên tệp đích khớp với đường dẫn được mong đợi bởi curl, tức là thay thế /etc/pki/tls/certs/ca-bundle.crtbằng đường dẫn sau "CAfile:" trong thông báo lỗi của bạn.


31
Bạn cũng có thể tạo một liên kết tượng trưng với ln -snếu không muốn sao chép lại mỗi khi bạn cập nhật nó.
starbeamrainbowlabs

4
Có cùng một vấn đề cho rescuetimeứng dụng trên Fedora 25. đã sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtgiải quyết vấn đề. ( CURL_CA_BUNDLEenv var không hoạt động)
GabLeRoux

Trên Ubuntu của tôi, điều này đã khắc phục sự cố : sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Tôi đã thực sự nhận được The repository ... does not have a Release fileđó là do mất chứng chỉ ( Could not load certificates from ...).
Marinos

84

Đặt cái này vào .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(xem bình luận từ Robert)


8
Cảm ơn bạn đã cung cấp một phương pháp không yêu cầu tôi phải xử lý các tệp hệ thống bằng tay, nhưng vẫn bảo mật việc sử dụng chứng chỉ!
Stephen Johnson

Cảm ơn bạn. Điều này đã giải quyết vấn đề tương tự của tôi với pyenv & curl. Tôi đang sử dụng Ubuntu 14.04 và đã cài đặt chứng chỉ ca.
davidA

Cách tiếp cận này cũng hoạt động với xonsh (thêm $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"vào .xonshrc).
m00am

Chỉ trong trường hợp: Phiên bản lót này:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew

30

Tạo một tệp ~/.curlrccó nội dung sau

cacert=/etc/ssl/certs/ca-certificates.crt

1
câu trả lời hay nhất, điều này hiệu quả với tôi trên Linux Mint 17
Santiago

Trên Mac, nó hoạt động với việc theo dõi trong~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

20

Cách nhanh nhất để khắc phục lỗi là thêm vào tùy chọn -k ở đâu đó trong yêu cầu cuộn tròn của bạn. Tùy chọn đó "cho phép kết nối với trích dẫn SSL mà không cần certs." (từ curl - trợ giúp)

Xin lưu ý rằng điều này có thể có nghĩa là bạn không nói chuyện với điểm cuối mà bạn nghĩ là bạn, vì họ đang xuất trình chứng chỉ không được ký bởi CA mà bạn tin tưởng.

Ví dụ:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

đã cho tôi phản hồi lỗi sau:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

Tôi đã thêm vào -k:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

và không có thông báo lỗi. Như một phần thưởng, bây giờ tôi đã cài đặt apt-cyg. Và ca-chứng chỉ.


10
Điều đó có thể khắc phục lỗi, nhưng nó cũng làm cho kết nối "an toàn" trở nên không an toàn.
Tim

1
Không hẳn vậy. Theo tôi biết, bạn không thể bỏ qua việc mã hóa kết nối an toàn, do đó, nó vẫn được mã hóa và chỉ đi đến một điểm cuối. Ai đó sửa tôi nếu tôi sai, nhưng rủi ro duy nhất bạn chạy là bạn có thể trở thành con mồi cho một cuộc tấn công trung gian. Vẫn không có khả năng rủi ro nếu bạn đang sử dụng curl.
10gistic

18
Vâng thật đấy. Tùy chọn "-k" là viết tắt của "- bảo mật". Nếu bạn có người trung gian, bạn nghĩ anh ấy đang làm gì với dữ liệu của mình? Spoiler alert: anh ta đang giải mã nó, đánh cắp nó, và có thể sửa đổi nó và đưa trở lại vào dòng không an toàn. Trực tiếp từ trang man: "-k, --insecure (SSL) Tùy chọn này rõ ràng cho phép curl thực hiện các kết nối và chuyển giao SSL" không an toàn ". Tất cả các kết nối SSL đều được cố gắng bảo mật bằng cách sử dụng gói chứng chỉ CA được cài đặt theo mặc định. Điều này làm cho tất cả các kết nối được coi là "không an toàn" không thành công trừ khi -k, - bảo mật được sử dụng. "
Tim

2
Nếu bạn cần SSL, bạn cần quyền riêng tư và xác minh - -kcờ có nghĩa là bạn đang mất xác minh. Tùy thuộc vào nhu cầu của bạn, điều này có thể được chấp nhận. MITM là các cuộc tấn công không hề nhỏ nếu bạn cho rằng mạng của mình và máy chủ mà bạn liên lạc được bảo mật từ các interlopers (bạn có thể đưa ra giả định đó không?). Nguy cơ tăng tùy thuộc vào loại dữ liệu của bạn (mã nguồn và certs rủi ro hơn hình ảnh). Bạn có thể xác minh tính toàn vẹn của dữ liệu sau khi chuyển (tổng kiểm tra, v.v.) nhưng bây giờ bạn đang chuyển niềm tin của mình vào kênh tổng kiểm tra đó. Cuối cùng, -kbạn sẽ có thêm một chút công việc.
Mark Fox

Điều đó có nghĩa là nếu tôi đang sử dụng chứng chỉ Tự ký. Tôi nên sử dụng tùy chọn -k. Vì có thể không thể xác minh chứng chỉ Tự ký?
Linus

15

@roens là đúng. Điều này ảnh hưởng đến tất cả người dùng Anaconda , với lỗi dưới đây
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Cách giải quyết là sử dụng hệ thống cuộn tròn mặc định và tránh gây rối với PATHbiến Anaconda được chuẩn bị trước . Bạn có thể

  1. Đổi tên nhị phân Anaconda curl :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. HOẶC loại bỏ Anaconda curl
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl vấn đề Github https://github.com/conda/conda-recipes/issues353


Tìm thấy tốt, tôi đã không nhận ra Anaconda đã đánh cắp ưu tiên con đường của tôi. Nó hoạt động khi tôi thay thế curlbằng đường dẫn đầy đủ/usr/bin/curl
jxramos

Điều này đã giúp rất nhiều! Cảm ơn.
Shababb Karim

12

Từ $ man curl:

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.

7

Đối với mã PHP chạy trên XAMPP trên Windows, tôi thấy tôi cần chỉnh sửa php.ini để bao gồm phần bên dưới

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

và sau đó sao chép vào một tệp https://curl.haxx.se/ca/cacert.pem và đổi tên thành curl-ca-bundle.crt và đặt nó dưới đường dẫn \ xampp (Tôi không thể làm cho curl.capath hoạt động) . Tôi cũng thấy CAbundle trên trang web cURL không đủ cho trang web từ xa mà tôi đang kết nối, vì vậy đã sử dụng một trang web được liệt kê với phiên bản Windows được biên dịch trước 7.47.1 tại http://winampplugins.co.uk /Xoăn/


Trên cửa sổ, bạn cũng có thể chỉ cần thêm "xampp" trước php như vậy: curl.cainfo = "C: \ xampp \ php \ extend \ cacert.pem"
Ryan Steyn

7

Tôi cũng có chính xác vấn đề đấy. Hóa ra, /etc/ssl/certs/ca-certificates.crttập tin của tôi không đúng định dạng. Mục cuối cùng cho thấy một cái gì đó như thế này:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

Sau khi thêm một dòng mới trước đó -----END CERTIFICATE-----, curl đã có thể xử lý tệp chứng chỉ.

Điều này rất khó chịu khi phát hiện ra vì update-ca-certificateslệnh của tôi không đưa ra bất kỳ cảnh báo nào.

Đây có thể là hoặc không phải là một vấn đề cụ thể về phiên bản của curl, vì vậy đây là phiên bản của tôi, chỉ để hoàn thiện:

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 

6

Điều này làm việc cho tôi

sudo apt-get install ca-certificates

sau đó vào thư mục chứng chỉ tại

sudo cd /etc/ssl/certs

sau đó bạn sao chép tệp ca-cert.crt vào /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

nếu không có thư mục tls / certs: tạo một và thay đổi quyền bằng thư mục chmod 777 -R


1
Tôi đã thử điều này nhưng nó không hoạt động với tôi và tôi vẫn nhận được cùng một lỗi. Có ý kiến ​​gì không?
Anirudh

6

Một cách khác để khắc phục sự cố này là vô hiệu hóa xác thực chứng chỉ:

echo insecure >> ~/.curlrc

1
Giải pháp thay thế, nhưng nó giúp tôi sau quá nhiều thời gian với chứng chỉ curl. Cảm ơn.
K. Gol

4

curl thực hiện SSLxác minh chứng chỉ theo mặc định, bằng cách sử dụng "gói" Certificate Authority (CA)khóa công khai (CA certs). Gói mặc định được đặt tên là curl-ca-bundle.crt; bạn có thể chỉ định một tệp thay thế bằng tùy chọn --cacert.

Nếu HTTPSmáy chủ này sử dụng chứng chỉ được ký bởi CA đại diện trong gói, xác minh chứng chỉ có thể không thành công do sự cố với chứng chỉ (có thể đã hết hạn hoặc tên có thể không khớp với tên miền trong URL).

Nếu bạn muốn tắt xác minh chứng chỉ của curl, hãy sử dụng --insecuretùy chọn -k (hoặc ).

ví dụ

curl --insecure http://........

3
Chỉ cần bỏ qua một bên rằng "tin tưởng vào nguồn" là không liên quan ở đây, vì không xác nhận hợp lệ chứng nhận chống lại CA, bạn không biết "nguồn" là ai.
Jeff Allen


3

Chỉ cần tạo các thư mục bị thiếu trong hệ thống của bạn ..

/ etc / pki / tls / certs /

và tạo tập tin bằng lệnh sau,

sudo apt-get cài đặt ca-chứng chỉ

và sau đó sao chép và dán chứng chỉ vào thư mục đích, lỗi hiển thị trong lỗi của bạn .. của tôi là " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in" đảm bảo bạn dán tệp vào vị trí chính xác được đề cập trong lỗi. Sử dụng lệnh sau để sao chép dán ..

sudo cp /etc/ssl/certs/ca-certert.crt /etc/pki/tls/certs/ca-bundle.crt

Đã sửa.


Không có câu trả lời hàng đầu nào làm việc cho tôi nhưng điều này đã làm!
Prachiti Prakash Bohhu

2

Đối với những gì nó có giá trị, kiểm tra which curlđang được chạy là rất quan trọng.

Một người dùng trên máy dùng chung mà tôi duy trì đã gặp phải lỗi này. Nhưng nguyên nhân hóa ra là do họ đã cài đặt Anaconda ( http://continuum.io ). Làm như vậy đặt đường dẫn nhị phân của Anaconda trước tiêu chuẩn $PATHvà nó đi kèm với curlnhị phân riêng của nó , gặp khó khăn khi tìm các certs mặc định được cài đặt trên máy Ubuntu này.


1
Tôi khuyên bạn nên kiểm tra which -a curlđể xem mọi thứ có sẵn, và tất nhiên lưu ý cái nào đứng đầu.
jxramos

1

Nếu bạn đang sử dụng homebrew trên macOS hoặc linuxbrew trong linux, hãy thử cài đặt lại opensslcurlvới các bước sau từ trang này .

Thông báo lỗi này chỉ ra rằng curl không thể thiết lập kết nối an toàn bằng openssl. Cài đặt lại openssl sẽ khắc phục vấn đề. Để tạm thời sử dụng kết nối không an toàn cho cả curl và git để tải xuống bất kỳ tệp cần thiết nào, hãy chạy:

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

Sau đó, cài đặt hoặc cài đặt lại openssl và curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Cuối cùng, hoàn tác các thay đổi bảo mật để làm cho curl và git sử dụng lại các kết nối an toàn:

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

Bạn có thể cần bắt đầu một phiên shell mới để xác minh kết quả với

curl -v https://github.com # or any other https urls.

Nếu nó hiển thị đầu ra sau trong đầu ra, vấn đề sẽ được giải quyết!

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

Người giới thiệu:


Sau nhiều giờ cố gắng. Điều này đã cứu tôi. Giải pháp phù hợp cho macos cuối cùng. Cảm ơn rất nhiều! :)
mrateb

1

Tôi có một vấn đề tương tự: Tôi đang xây dựng một hình ảnh docker dựa trên núi cao và khi tôi muốn cuộn tròn đến một trang web của tổ chức của mình, lỗi này xuất hiện. Để giải quyết nó, tôi phải lấy chứng chỉ CA của công ty tôi, sau đó, tôi phải thêm nó vào CA certs của hình ảnh của tôi.

Nhận chứng chỉ CA

Sử dụng OpenSSL để lấy các chứng chỉ liên quan đến trang web:

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

Điều này sẽ tạo ra một cái gì đó như:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

Nhận giấy chứng nhận cuối cùng (các nội dung giữa -----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----đánh dấu bao gồm) và tiết kiệm nó vào một tập tin (mycompanyRootCA.crt ví dụ)

Xây dựng hình ảnh của bạn

Sau đó, khi bạn sẽ xây dựng hình ảnh docker của mình từ núi cao, hãy làm như sau:

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

Hình ảnh của bạn bây giờ sẽ hoạt động đúng! \ o /


1

Nếu bất cứ ai vẫn gặp khó khăn, hãy thử điều này, nó đã làm việc cho tôi. Xóa các tập tin trong /etc/ssl/certs/thư mục của bạn sau đó cài đặt lại chứng chỉ ca:

sudo apt install ca-certificates --reinstall

Đã làm điều này khi tôi cố gắng cài đặt Linuxbrew.


1
Điều này giúp tôi nhưng tôi đã không xóa các tập tin trên máy của mình. Chỉ cần chạy lệnh đơn giản và curl bắt đầu làm việc.
Josefhu15

1

Chỉ cần tìm giải pháp này hoạt động hoàn hảo cho tôi.

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

Tôi tìm thấy giải pháp này từ đây


0

Lỗi là do các tệp chứng chỉ chuỗi SSL bị hỏng hoặc bị thiếu trong thư mục PKI. Bạn sẽ cần đảm bảo các tập tin được đóng gói theo các bước sau: Trong bảng điều khiển / thiết bị đầu cuối của bạn:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

Nhập trang web này: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certert , lấy chứng chỉ ca của bạn, cho SO. Sao chép url tải xuống và dán vào url: wget your_url_donwload_ca-ceritificated.rpm ngay bây giờ, cài đặt vòng quay yout:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

Bây giờ khởi động lại dịch vụ của bạn: ví dụ của tôi lệnh này:

sudo service2 httpd restart

0

Chạy lệnh sau trong git bash hoạt động tốt với tôi

git config --global http.sslverify "false"

0

Điều này cố định cho tôi:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem


0

Dưới đây mô tả các bước để khắc phục các vấn đề.
1. Tìm ra tệp đang tồn tại trên url xác định.
2. Nếu không thì tải tệp từ url. https://curl.haxx.se/ca/cacert.pem
3. Sao chép và dịch hại tệp vào đường dẫn được xác định trên tệp php.ini.
4. Khởi động lại dịch vụ apache.


0

Tôi đã gặp vấn đề này và hóa ra phiên bản CURL của tôi không thể phân tích các chứng chỉ được mã hóa DER (và cũng không chú ý đến tùy chọn --cert-type). Khi tôi chuyển đổi chứng chỉ sang định dạng PEM, nó hoạt động.


0

Trong trường hợp của tôi, /etc/ssl/certs/ca-certificates.crttập tin bị thiếu. Vì hóa ra tôi đã xóa nội dung /etc/ssl/certstừ trong Dockerfile khi xây dựng hình ảnh docker. Sau khi điều chỉnh các tập lệnh shell / lệnh bash của tôi chạy từ bên trong Dockerfile - curl hoạt động hoàn hảo từ bên trong container mới.

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.