HTTPS URL에 액세스하는 동안 cURL을 사용하여 인증서를 처리하려면 어떻게해야합니까?


188

curl을 사용하여 다음 오류가 발생합니다.

컬 : (77) 오류 설정 인증서 확인 위치 :
  CA 파일 : /etc/ssl/certs/ca-certificates.crt
  경로 : 없음

이 인증서 확인 위치를 어떻게 설정합니까? 감사.


2
어떤 OS / 디스트로를 사용하고 있습니까? ca-certificates 패키지 (debian / ubuntu에서 호출되는 패키지)를 설치해야합니다.
igorw

40
나중에 참조하기 위해 이미 ca-certificates설치했지만 오류가 지속되었습니다. 문제는 내 인증서가 /etc/ssl/certs/ca-certificates.crt대신에 있다는 /etc/pki/tls/certs/ca-bundle.crt것이므로 환경 변수 CURL_CA_BUNDLE를 올바른 경로 로 설정해야했습니다 .
Robert Smith

13
멋있는! 내가 설정할 때 그것은 나를 위해 작동합니다 export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
깔끔한

답변:


83

이 오류는 관련이 누락 된 패키지 : ca-certificates. 설치하십시오.

우분투 리눅스 (및 유사한 배포판)에서 :

# apt-get install ca-certificates

Apt-Cyg 를 통한 CygWin에서

# apt-cyg install ca-certificates

아치 리눅스에서 (Raspberry Pi)

# pacman -S ca-certificates

설명서는 다음을 알려줍니다.

이 패키지에는 SSL 기반 응용 프로그램이 SSL 연결의 진위 여부를 확인할 수 있도록 CA 인증서의 PEM 파일이 포함되어 있습니다.

보시다시피 : 데비안-스퀴즈에서 패키지 인증서의 세부 사항


97
ca-certificates는 이미 최신 버전이지만 여전히 오류가 발생합니다
Bones 목사님

2
물론 curl 및 raw.github.com을 사용하는 권장 방법을 통해 apt-cyg를 설치하려고하면 동일한 오류가 발생합니다 .
10gistic

11
아치 리눅스에서는 또한 필요할 수 있습니다 pacman -S ca-certificates-utils. 나는했다.
Mark Grimes

8
이 패키지는 이미 설치되어 있습니다. 이 답변은 도움이되지 않습니다.
JimmyJames

9
@PastorBones 패키지가 이미 최신 버전 인 것과 동일한 문제가 있었지만 패키지가 sudo apt install --reinstall ca-certificates다시 설치되어 패키지를 다시 설치하고 내가 본 오류를 해결 했다고 생각합니다.
Will

153

최신 버전의 ca-certificates도 설치했지만 여전히 오류가 발생했습니다.

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

curl은 인증서가 경로에있을 것으로 예상 /etc/pki/tls/certs/ca-bundle.crt했지만 경로에 있었기 때문에 인증서를 찾을 수 없다는 문제가있었습니다 /etc/ssl/certs/ca-certificates.crt.

다음을 실행하여 인증서를 예상 대상으로 복사

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

나를 위해 일했다. 대상 대상 폴더가없는 경우이를 실행하여 폴더를 만들어야합니다.

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

필요한 경우, 위의 명령을 수정하여 대상 파일 이름이 curl에서 예상되는 경로와 일치하도록하십시오 (예 /etc/pki/tls/certs/ca-bundle.crt: 오류 메시지에서 "CAfile :"다음의 경로로 바꾸 십시오).


31
ln -s업데이트 할 때마다 다시 복사하지 않으려 는 경우 심볼릭 링크를 만들 수도 있습니다 .
starbeamrainbowlabs

4
rescuetimeFedora 25의 앱 에도 동일한 문제가 있습니다. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt문제를 해결했습니다. ( CURL_CA_BUNDLEenv var가 작동하지 않음)
GabLeRoux

내 우분투 에서이 문제를 해결했습니다 sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. 실제로 The repository ... does not have a Release file인증서 ( Could not load certificates from ...) 가 누락되어 발생했습니다 .
Marinos An

84

이것을 당신의 것으로 .bashrc

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

(로버트의 의견 참조)


8
시스템 파일을 직접 수작업으로 만들 필요는 없지만 인증서 사용의 보안은 유지하는 방법을 제공해 주셔서 감사합니다!
Stephen Johnson

감사합니다. 이것은 pyenv & curl과 비슷한 문제를 해결했습니다. 우분투 14.04를 사용하고 있었고 이미 인증서를 설치했습니다.
davidA

이 방법은 또한 xonsh (추가와 함께 작동 $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"받는 사람 .xonshrc).
오전 00 :

만일의 경우 : 이것의 한 가지 라이너 버전 :CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew

30

~/.curlrc다음 내용 으로 파일 을 작성하십시오.

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

1
가장 좋은 대답은 Linux Mint 17에서 작동했습니다.
Santiago

Mac에서는 다음과 같이 작동했습니다.~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

21

오류를 해결하는 가장 빠른 방법은 curl 요청의 어딘가에 -k 옵션을 추가하는 것입니다. 이 옵션은 "인증없이 SSL 인용에 연결할 수 있습니다." (컬-도움말에서)

이는 신뢰할 수있는 CA에서 서명하지 않은 인증서를 제시하므로 자신이 생각하는 엔드 포인트와 대화하고 있지 않음을 의미 할 수 있습니다.

예를 들면 다음과 같습니다.

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

나에게 다음과 같은 오류 응답을 주었다.

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

-k에 추가했습니다.

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

오류 메시지가 없습니다. 보너스로 apt-cyg가 설치되었습니다. 그리고 ca 인증서.


10
오류가 발생할 수 있지만 "보안"연결이 안전하지 않게됩니다.
Tim

1
실제로는 아닙니다. 내가 아는 한 보안 연결의 암호화를 우회 할 수는 없으므로 여전히 암호화되어 있으며 하나의 엔드 포인트로 이동합니다. 내가 틀렸다면 누군가 나를 고치지 만, 당신이 뛸 유일한 위험은 당신이 중간자 공격에 빠질 수 있다는 것입니다. curl을 사용하는 경우 여전히 위험하지 않습니다.
10gistic

18
네 진짜로 요. "-k"옵션은 "-안전하지 않은"의 약자입니다. 중간자 (man-in-the-middle)가 있다면 그가 당신의 데이터로 무엇을하고 있다고 생각합니까? 스포일러 경고 : 그는 암호를 해독하고, 훔치고, 수정하고 안전하지 않은 스트림으로 다시 주입하고 있습니다. 맨 페이지에서 직접 : "-k, --insecure (SSL)이 옵션은 curl이"안전하지 않은 "SSL 연결 및 전송을 수행하도록 명시 적으로 허용합니다. 모든 SSL 연결은 기본적으로 설치된 CA 인증서 번들을 사용하여 보안을 유지하려고합니다. -k, --insecure를 사용하지 않으면 "안전하지 않은"것으로 간주되는 모든 연결이 실패합니다. "
Tim

2
SSL이 필요한 경우 개인 정보 보호 및 확인이 필요합니다. -k플래그는 확인을 잃고 있음을 나타 냅니다. 필요에 따라 허용 될 수 있습니다. MITM은 네트워크와 통신중인 서버가 인터 로퍼로부터 보호된다고 가정 할 경우 사소한 공격입니다 (이러한 가정을 할 수 있습니까?). 데이터 유형에 따라 위험이 증가합니다 (소스 코드 및 인증서는 이미지보다 위험합니다). 전송 후 데이터의 무결성을 확인할 수 있지만 (체크섬 등) 이제 해당 체크섬 채널로 신뢰를 이동하고 있습니다. 결국에는 -k약간 더 많은 작업을 제공합니다.
Mark Fox

자체 서명 된 인증서를 사용하는 경우에도 마찬가지입니다. -k 옵션을 사용해야합니다. 자체 서명 인증서를 확인하지 못할 수 있습니까?
Linus

15

@roens가 정확합니다. 이것은 아래 오류와 함께 모든 Anaconda 사용자에게 영향을 미칩니다
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

해결 방법은 기본 시스템 컬을 사용 하고 앞에 추가 된 Anaconda 변수 를 사용 하지 않는 것입니다 PATH. 당신은 할 수 있습니다

  1. Anaconda curl 바이너리의 이름을 바꾸십시오 :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. 또는 Anaconda curl 제거
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl Github 문제 https://github.com/conda/conda-recipes/issues/352


좋은 발견, 나는 Anaconda가 내 경로 우선 순위를 훔치고 있다는 것을 몰랐습니다. curl전체 경로 로 교체 한 후에 작동했습니다/usr/bin/curl
jxramos 1

이것은 많은 도움이되었습니다! 감사.
샤밥 카림

12

보낸 사람 $ 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

Windows의 XAMPP에서 실행되는 PHP 코드의 경우 아래를 포함하도록 php.ini를 편집해야한다는 것을 알았습니다.

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

https://curl.haxx.se/ca/cacert.pem 파일로 복사하고 curl-ca-bundle.crt로 이름을 바꾸고 \ xampp 경로 아래에 넣으십시오 (curl.capath를 작동시킬 수 없습니다) . 또한 cURL 사이트의 CAbundle이 내가 연결하고있는 원격 사이트에 충분하지 않다는 것을 알았으므로 http://winampplugins.co.uk 에서 미리 컴파일 된 Windows 버전 curl 7.47.1로 나열된 것을 사용했습니다 . /곱슬 곱슬하다/


창에 당신은 너무으로 PHP하기 전에 "XAMPP"를 추가 할 수 있습니다 curl.cainfo = "C : \ XAMPP \ PHP \ 엑스트라 \ cacert.pem"
라이언 스테인

7

나는 똑같은 문제가 있었다. 결과적으로 /etc/ssl/certs/ca-certificates.crt파일이 잘못되었습니다. 마지막 항목은 다음과 같습니다.

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

전에 개행을 추가 한 후 -----END CERTIFICATE-----curl은 인증서 파일을 처리 할 수있었습니다.

update-ca-certificates명령이 나에게 경고를주지 않았기 때문에 이것은 매우 성가신 일이었습니다 .

이것은 컬의 버전 특정 문제 일 수도 있고 아닐 수도 있으므로 완성을 위해 여기에 내 버전이 있습니다.

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

이것은 나를 위해 일했다

sudo apt-get install ca-certificates

그런 다음 인증서 폴더로 이동하십시오.

sudo cd /etc/ssl/certs

그런 다음 ca-certificates.crt 파일을 /etc/pki/tls/certs

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

tls / certs 폴더가없는 경우 : chmod 777 -R folderNAME을 사용하여 하나를 작성하고 권한을 변경하십시오.


1
나는 이것을 시도했지만 이것은 나를 위해 작동하지 않았고 여전히 같은 오류가 발생합니다. 어떤 아이디어?
Anirudh

6

이 문제를 해결하는 또 다른 방법은 인증서 유효성 검사를 비활성화하는 것입니다.

echo insecure >> ~/.curlrc

1
해결 방법이지만 컬 인증서로 너무 많은 시간을 보낸 후에 도움이됩니다. 감사.
K. Gol

4

curl은 SSL기본적으로 "번들" Certificate Authority (CA)공개 키 (CA 인증서)를 사용하여 인증서 확인을 수행합니다 . 기본 번들의 이름은 curl-ca-bundle.crt입니다. --cacert 옵션을 사용하여 대체 파일을 지정할 수 있습니다.

HTTPS서버가 번들에 표시된 CA가 서명 한 인증서를 사용하는 경우 인증서 문제로 인해 인증서 확인에 실패했을 수 있습니다 (만료되었거나 이름이 URL의 도메인 이름과 일치하지 않을 수 있음).

인증서의 curl 검증을 끄려면 -k (또는 --insecure) 옵션을 사용하십시오 .

예를 들어

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

3
CA에 대해 인증서를 올바르게 확인하지 않으면 "소스"가 누구인지 알 수 없기 때문에 "소스 신뢰"는 여기와 관련이 없습니다.
Jeff Allen


3

시스템에없는 폴더를 만드십시오.

/ etc / pki / tls / certs /

다음 명령을 사용하여 파일을 작성하십시오.

sudo apt-get 설치 인증서

그런 다음 인증서를 복사하여 대상 폴더에 붙여 넣습니다. 오류가 표시됩니다. 내 파일은 " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in"오류에 언급 된 정확한 위치에 파일을 붙여 넣어야합니다. 붙여 넣기를 복사하려면 다음 명령을 사용하십시오.

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

결정된.


최고 답변 중 어느 것도 나를 위해 일하지는 않았지만 이것은 효과가있었습니다!
Prachiti Prakash Prabhu

2

그 가치에 대해, 검사 which curl가 실행되는 것도 중요합니다.

내가 유지 관리하는 공유 컴퓨터의 사용자에게이 오류가 발생했습니다. 그러나 원인은 Anaconda ( http://continuum.io )를 설치했기 때문에 발생했습니다 . 이렇게하면 표준 전에 아나콘다의 바이너리 경로를 넣어 $PATH, 그것은 그 자체와 함께 제공 curl기본 인증서에서 찾는 문제가 있었다 진, 이 우분투 시스템에 설치합니다.


1
which -a curl사용 가능한 모든 항목을 확인 하고 물론 어떤 항목이 있는지 확인 하는 것이 좋습니다 .
jxramos

2

여전히 문제가있는 사람은 시도해보십시오. /etc/ssl/certs/디렉토리 에서 파일을 삭제 한 후 ca 인증서를 다시 설치 하십시오 .

sudo apt install ca-certificates --reinstall

Linuxbrew를 설치하려고 할 때이 작업을 수행했습니다.


1
이것은 나에게 도움이되었지만 내 컴퓨터의 파일을 삭제하지 않았습니다. 간단한 명령을 실행하고 curl이 작동하기 시작했습니다.
Josefhu

1

당신이 리눅스에서 맥 OS에 사제 또는 linuxbrew를 사용하는 경우 다시 설치하려고 openssl하고 curl에서 다음 단계로 이 페이지 .

이 오류 메시지는 curl이 openssl을 사용하여 보안 연결을 설정할 수 없음을 나타냅니다. openssl을 다시 설치하면 문제가 해결됩니다. curl 및 git 모두에 안전하지 않은 연결을 사용하여 필요한 파일을 다운로드하려면 다음을 실행하십시오.

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

그런 다음 openssl 및 curl을 설치하거나 다시 설치하십시오.

HOMEBREW_CURLRC=1 brew reinstall openssl curl

마지막으로 보안 변경 사항을 취소하여 curl 및 git이 보안 연결을 다시 사용하도록하십시오.

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

다음을 사용하여 결과를 확인하기 위해 새 셸 세션을 시작해야 할 수도 있습니다.

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

출력에 다음 출력이 표시되면 문제를 해결해야합니다!

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

참고 문헌 :


몇 시간 동안 노력한 후. 이것은 나를 구했다. 마지막으로 macos에 적합한 솔루션입니다. 고마워요! :)
mrateb

1

나는 같은 문제가 있습니다 : 알파인 기반 도커 이미지를 만들고 있는데 내 웹 사이트에 컬링하려고 할 때이 오류가 나타납니다. 이 문제를 해결하려면 회사의 CA 인증서를 가져와야하며,이를 내 이미지의 CA 인증서에 추가해야합니다.

CA 인증서 받기

OpenSSL을 사용하여 웹 사이트와 관련된 인증서를 얻으십시오.

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

이것은 다음과 같이 출력됩니다 :

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

마지막 인증서 ( -----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----마크 업 사이의 내용 )를 가져 와서 파일 (예 : mycompanyRootCA.crt)에 저장하십시오.

이미지 구축

그런 다음 고산에서 도커 이미지를 만들 때 다음을 수행하십시오.

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

이제 이미지가 제대로 작동합니다! \영형/


1

이 솔루션이 저에게 완벽하게 작동한다는 것을 찾으십시오.

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

여기 에서이 솔루션을 찾았 습니다.


0

이 오류는 PKI 디렉토리의 SSL 체인 인증서 파일이 손상되었거나 없기 때문에 발생합니다. 다음 단계에 따라 파일을 ca 번들로 묶어야합니다. 콘솔 / 터미널에서 :

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

이 사이트를 입력하십시오 : https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates , CA 인증서를 얻으십시오. 다운로드 URL을 복사하여 URL에 붙여 넣으십시오 : wget your_url_donwload_ca-ceritificated.rpm을 지금 설치하고 rpm을 설치하십시오 :

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

이제 서비스를 다시 시작하십시오.이 예제는 다음과 같습니다.

sudo service2 httpd restart

0

나를 위해 잘 작동하는 git bash에서 다음 명령을 실행하십시오.

git config --global http.sslverify "false"

0

이것은 나를 위해 수정되었습니다.

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


0

다음은 문제를 해결하기위한 단계를 설명합니다.
1. 파일이 define url에 있는지 확인하십시오.
2. 그렇지 않은 경우 URL에서 파일을 다운로드하십시오. https://curl.haxx.se/ca/cacert.pem
3. 파일을 php.ini 파일의 정의 된 경로에 복사하고 병입하십시오.
4. 아파치 서비스를 다시 시작하십시오.


0

이 문제가 발생하여 CURL 버전에서 DER 인코딩 인증서를 구문 분석 할 수 없으며 --cert-type 옵션에도주의를 기울이지 않았습니다. 인증서를 PEM 형식으로 변환했을 때 작동했습니다.


0

제 경우에는 /etc/ssl/certs/ca-certificates.crt파일이 없습니다. /etc/ssl/certs도커 이미지를 만들 때 Dockerfile 내에서 내용을 삭제했습니다 . Dockerfile 내에서 실행되는 쉘 스크립트 / bash 명령을 조정 한 후 curl은 이제 새로운 컨테이너 내에서 완벽하게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.