curl: (60) ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น


258
root@sclrdev:/home/sclr/certs/FreshCerts# curl --ftp-ssl --verbose ftp://{abc}/ -u trup:trup --cacert /etc/ssl/certs/ca-certificates.crt
* About to connect() to {abc} port 21 (#0)
*   Trying {abc}...
* Connected to {abc} ({abc}) port 21 (#0)
< 220-Cerberus FTP Server - Home Edition
< 220-This is the UNLICENSED Home Edition and may be used for home, personal use only
< 220-Welcome to Cerberus FTP Server
< 220 Created by Cerberus, LLC
> AUTH SSL
< 234 Authentication method accepted
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.


ฉันมีปัญหาที่คล้ายกัน นี่ใช้งานได้สำหรับฉันstackoverflow.com/a/29649024
Sagruob

ในกรณีของฉันsuperuser.com/a/719047/137881ช่วย
Abdull

//, ในกรณีของฉัน, ฉันได้รับข้อผิดพลาดนี้จากการร้องขอ curl ไปยังเซิร์ฟเวอร์ HashiCorp Vault จนกว่าฉันจะติดตั้งใบรับรอง X509 ด้วย end-entity / Intermediates / root เท่านั้นในลำดับย้อนกลับ, ซึ่งแต่ละตัวถูกเข้ารหัส Base64
Nathan Basanese

//, คุณทำการวิจัยอะไรเกี่ยวกับเรื่องนี้ก่อนที่จะคัดลอกข้อผิดพลาดไปที่นี่
Nathan Basanese

คำตอบ:


231

เกี่ยวกับข้อผิดพลาด 'ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น' เป็นสิ่งสำคัญที่จะต้องทราบว่าสิ่งนี้ใช้ได้กับระบบที่ส่งคำขอ CURL ไม่ใช่เซิร์ฟเวอร์ที่ได้รับคำขอ

  1. ดาวน์โหลด cacert.pem ล่าสุดจากhttps://curl.haxx.se/ca/cacert.pem

  2. เพิ่มบรรทัดต่อไปนี้ใน php.ini: (หากนี่คือโฮสติ้งที่ใช้ร่วมกันและคุณไม่มีสิทธิ์เข้าถึง php.ini คุณสามารถเพิ่มได้ใน. user.ini ใน public_html)

    curl.cainfo="/path/to/downloaded/cacert.pem"

    ตรวจสอบให้แน่ใจว่าคุณใส่เส้นทางภายในเครื่องหมายคำพูดคู่ !!!

  3. โดยค่าเริ่มต้นกระบวนการ FastCGI จะแยกไฟล์ใหม่ทุก ๆ 300 วินาที (หากจำเป็นคุณสามารถเปลี่ยนความถี่ได้โดยเพิ่มไฟล์สองสามไฟล์ตามที่แนะนำไว้ที่นี่https://ss88.uk/blog/fast-cgi-and-user-ini- files-the-new-htaccess / )


1
เรื่องแรกเกี่ยวข้องกับการรับรองการปฏิบัติงานที่ดำเนินการโดยใช้ห้องสมุด OpenSSL วินาทีในการร้องขอที่ทำโดยใช้ cURL
Mike

4
ที่จริงฉันพยายามเป็นเวลาหนึ่งชั่วโมงเพราะฉันไม่ได้เขียนเส้นทางในเครื่องหมายคำพูด ดังนั้นโปรดจดบันทึกไว้ที่นี่curl.cainfo="/path/to/downloaded/cacert.pem" // Do not forget to write between quotes
Himanshu Upadhyay

12
ฉันไม่เห็นข้อมูลอ้างอิงในคำถามเกี่ยวกับ PHP ทำไมถึงต้องอ้างอิงในคำตอบ? หากคำถามได้รับการแก้ไขแล้วคำตอบสามารถแก้ไขเพื่อสะท้อนบรรทัดคำสั่งตอนนี้ใช้?
อดัม

5
@ Adam ในขณะที่คำถามไม่ได้พูดถึง PHP สิ่งนี้เกิดขึ้นเป็นผลการค้นหาอันดับ 1 ใน Google สำหรับข้อความแสดงข้อผิดพลาดเฉพาะที่สร้างโดย PHP ดังนั้นบางทีมันอาจไม่ตอบคำถามของ OP โดยเฉพาะ แต่ดูเหมือนว่ามันยังมีประโยชน์ต่อชุมชน
rinogo

1
คำตอบนี้ทำให้เข้าใจผิดกับฉันเพราะมันเป็นทางออกที่เกี่ยวข้องกับ PHP
Wasif Khan

141

มันล้มเหลวเนื่องจาก cURL ไม่สามารถตรวจสอบใบรับรองที่จัดหาโดยเซิร์ฟเวอร์

มีสองตัวเลือกในการทำงานนี้:

  1. ใช้ cURL พร้อม-kตัวเลือกที่อนุญาตให้ curl ทำการเชื่อมต่อที่ไม่ปลอดภัยนั่นคือ cURL ไม่ได้ตรวจสอบใบรับรอง

  2. เพิ่มรูท CA (CA ลงนามในใบรับรองเซิร์ฟเวอร์) ลงใน /etc/ssl/certs/ca-certificates.crt

คุณควรใช้ตัวเลือกที่ 2 เนื่องจากเป็นตัวเลือกที่รับรองว่าคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ FTP ที่ปลอดภัย


1
ฉันเพิ่มไฟล์ rootCA.pem ของฉันภายใน: - root @ sclrdev: / home / certs / FreshCerts # ll /etc/ssl/certs/rootCA.pem -rwxrwxrwx 1 root root 1302 ก.ค. 8 00:09 / etc / ssl / certs / rootCA.pem * แม้ฉันจะตรวจสอบไฟล์ ServerCertificate.pem ด้วย rootCA.pem ของฉัน: - root @ sclrdev: / home / certs / FreshCerts # openssl ตรวจสอบ -CAfile rootCA.pem ../ServerCertificate.pem ServerCertificate.pem: OK และยัง เนื้อหาของ rootCA.pem ภายใน ca-certificate.crt root @ sclrdev: / home / sclr / subhendu / certs / FreshCerts # ll /etc/ssl/certs/ca-certificates.crt -rw-r - r-- 1 รูทราก 247945 8 ก.ค. 00:10 / etc / ssl /certs/ca-certificates.crt
user3812540

ฉันไม่สามารถคิดได้ว่าฉันจะไปไหนผิด ในการติดตาม WireShark ฉันได้รับข้อผิดพลาดต่อไปนี้: - ไคลเอ็นต์ Hello Server Hello, ใบรับรอง, เซิร์ฟเวอร์ Hello Done Alert (ระดับ: ร้ายแรง, คำอธิบาย: unknown CA (48)) คุณช่วยแนะนำฉันและช่วยฉันได้ไหม
user3812540

วิธีการทำงานของ openssl คือการพยายามทำให้ห่วงโซ่ใบรับรองสมบูรณ์ในระหว่างการตรวจสอบ ใบรับรองเซิร์ฟเวอร์ของคุณลงชื่อโดย intermiate CA ไม่ใช่ CA รูทหรือไม่ ตัวอย่างเช่น
Yuvika

ใบรับรองของฉันลงนามโดย root CA เท่านั้น
user3812540

1
ฉันพบข้อผิดพลาด: - root @ sclrdev: ~ # openssl s_client - เชื่อมต่อ <server_ip>: 21 -showcerts CONNECTED (00000003) 3074050248: ข้อผิดพลาด: 140770FC: กิจวัตร SSL: SSL23_GET_SERVER_HELLO: ไม่รู้จักโปรโตคอล: s23_clnt.c: 7 ไม่มีใบรับรองเพียร์ --- ไม่มีไคลเอ็นต์ใบรับรองที่ส่งชื่อ CA --- SSL handshake อ่าน 7 ไบต์และเขียน 225 ไบต์ --- ใหม่, (ไม่มี), การเข้ารหัสคือ (ไม่มี) การเจรจาต่อรองที่ปลอดภัยไม่ได้รับการสนับสนุนการบีบอัด: ไม่มีการขยาย: ไม่มี --- ฉันไม่แน่ใจว่าสิ่งนี้หมายถึงอะไร?
user3812540

69

ฉันได้แก้ไขปัญหานี้โดยการเพิ่มรหัสบรรทัดหนึ่งในสคริปต์ cURL:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

คำเตือน : สิ่งนี้ทำให้คำขอไม่ปลอดภัยอย่างแน่นอน (ดูคำตอบโดย @YSU)!


42
สิ่งนี้อาจช่วยหลีกเลี่ยงปัญหา แต่มันก็พลาดความคิดของ https และระบบการรับรองโดยสิ้นเชิง
เตฟานริกเตอร์

1
Works! นีซด่วนและทางลัดที่สกปรกหากคุณไม่สนใจเกี่ยวกับใบรับรอง
Gilly

2
สิ่งนี้ทำให้มันไม่ปลอดภัยอย่างสมบูรณ์
Moox

1
ฉันพบปัญหานี้บนเซิร์ฟเวอร์ในพื้นที่ของฉันแม้ว่ารหัสเดียวกันจะทำงานได้ดีบนเซิร์ฟเวอร์จัดเตรียม ดีสำหรับฉันมันเป็นในท้องถิ่น ขอบคุณ
sabin

1
เพิ่มการตรวจสอบนี้เพื่อให้แน่ใจว่าคุณใช้กับเซิร์ฟเวอร์ในระบบเท่านั้น if( stristr("127.0.0.1",$_SERVER["SERVER_NAME"] ) || stristr("localhost",$_SERVER["SERVER_NAME"] )) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Hussain

20

ในกรณีของฉันมันกลายเป็นปัญหากับการติดตั้งใบรับรองของฉันในบริการฉันพยายามบริโภคด้วย cURL ฉันล้มเหลวที่จะกำ / concatenate ใบรับรองกลางและรากลงในใบรับรองโดเมนของฉัน ในตอนแรกมันไม่ชัดเจนว่าเป็นปัญหาเพราะ Chrome ทำงานแล้วและยอมรับใบรับรองทั้งๆที่ไม่ได้ออกใบรับรองระดับกลางและระดับรูท

หลังจากรวมใบรับรองทุกอย่างทำงานตามที่คาดไว้ ฉันรวมแบบนี้

$ cat intermediate.crt >> domain.crt

และทำซ้ำสำหรับใบรับรองระดับกลางและระดับรูททั้งหมด


2
ฉันมีปัญหาที่คล้ายกันยกเว้นฉันไม่มี Apache SSLCertificateChainFile ของฉันตั้งค่าเป็นใบรับรองที่ถูกต้อง
Wayne Piekarski

1
โปรดทราบว่าหากคุณทำเช่นนี้และ crt ที่คุณเพิ่มไม่มีบรรทัดใหม่ตามมาคุณจะมีบรรทัดเหมือน-----END CERTIFICATE----------BEGIN CERTIFICATE-----ในชุดรวมของคุณและคุณจะได้รับข้อผิดพลาดที่คลุมเครือ:curl: (77) error setting certificate verify locations
Marty Neal

2
ฉันใช้ใบรับรอง letencrypt แต่ปรับใช้เฉพาะใบรับรองและรหัสส่วนตัวกับเซิร์ฟเวอร์ Chrome และขดบนคอมพิวเตอร์ของฉันไม่ได้บ่น แต่แอป nodejs ที่ฉันกำลังสร้างไม่ยอมรับใบรับรอง การปรับใช้ fullchain ไปยังเซิร์ฟเวอร์แก้ไขปัญหาได้! ขอบคุณสำหรับการชี้ทิศทางที่ถูกต้อง!
เปาโลซานโตส

ในกรณีของฉัน (ใบรับรองจาก comodo) พวกเขาส่งใบรับรองระดับกลางเป็น my-domain.ca-bundle ฉันต้องผนวกมันเข้ากับ my-domain.crt ขอบคุณ!
Jon Hulka

18

สำหรับฉันการติดตั้งใบรับรองง่าย ๆ ช่วย:

sudo apt-get install ca-certificates

2
ตัวอย่างเช่นคอนเทนเนอร์นักเทียบท่าขนาดเล็กบางตัวอาจไม่ได้ติดตั้งสิ่งนี้และจะไม่มีปัญหาในการแก้ไขปัญหาอื่น ๆ หากไม่มีแพ็กเกจทั้งหมด
muni764

16

พบปัญหานี้หลังจากติดตั้ง Git Extensions v3.48 พยายามติดตั้ง mysysgit อีกครั้ง แต่มีปัญหาเดียวกัน ในตอนท้ายต้องปิดการใช้งาน (โปรดพิจารณาผลกระทบด้านความปลอดภัย!) การตรวจสอบ SSL ด้วย:

git config --global http.sslVerify false

แต่ถ้าคุณมีใบรับรองโดเมนให้เพิ่มไปที่ (Win7)

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt

23
ใช้งานได้ แต่รู้สึกเหมือน hidding อาการไม่รักษาโรค
MonoThreaded

4
ปิดการใช้งาน SSL ที่ตรวจสอบเป็นอันตรายมาก
jonasl

1
คุณสามารถทำได้โดยไม่--globalต้องปิดใช้งาน SSL สำหรับที่เก็บที่คุณมีปัญหาเท่านั้น ดูgroups.google.com/forum/#!topic/git-for-windows/mlqn5J4OLlwสำหรับการสนทนาเกี่ยวกับไฟล์ crt ที่จำเป็นในปัจจุบัน
koppor

13

เราพบข้อผิดพลาดนี้เมื่อไม่นานมานี้ ปรากฎว่าเกี่ยวข้องกับใบรับรอง root ที่ไม่ได้รับการติดตั้งในไดเรกทอรีจัดเก็บของ CA อย่างถูกต้อง ฉันใช้คำสั่ง curl ซึ่งฉันระบุ CA dir โดยตรง curl --cacert /etc/test/server.pem --capath /etc/test ...คำสั่งนี้ล้มเหลวทุกครั้งที่มีcurl: (60) ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรอง บริษัท ผู้ออก

หลังจากใช้strace curl ...แล้วจะพบว่า curl กำลังมองหาไฟล์ใบรับรองหลักที่มีชื่อ 60ff2731.0 ซึ่งขึ้นอยู่กับการตั้งชื่อการจัดสรรแฮช openssl ดังนั้นฉันจึงพบคำสั่งนี้เพื่อนำเข้าใบรับรอง root อย่างถูกต้อง:

ln -s rootcert.pem `openssl x509 -hash -noout -in rootcert.pem`.0

ซึ่งสร้างซอฟต์ลิงค์

60ff2731.0 -> rootcert.pem

curl ภายใต้หน้าปกอ่าน server.pem cert กำหนดชื่อของไฟล์รูทใบรับรอง (rootcert.pem) แปลงเป็นชื่อแฮชจากนั้นทำการค้นหาไฟล์ OS แต่ไม่พบ

ดังนั้นสิ่งที่ต้องทำคือให้ใช้ strace เมื่อรัน curl เมื่อข้อผิดพลาดของ curl ไม่ชัดเจน (คือความช่วยเหลืออันยิ่งใหญ่) จากนั้นตรวจสอบให้แน่ใจว่าติดตั้งใบรับรอง root โดยใช้หลักการตั้งชื่อ openssl


2
ว้ามันช่วยได้ เพื่ออธิบายรายละเอียดเล็กน้อยสิ่งที่ช่วยฉัน: a) เรียกใช้ strace curl ... b) ค้นหา stat ที่ล้มเหลว () ด้วย some-hex.0 c) googled สำหรับ some-hex พบใบรับรองที่สอดคล้องกัน d) ใส่ cert ลงใน / usr / โลคัล / แบ่งใช้ / ca-certificate / (ที่มีนามสกุล * .crt เนื่องจาก * .pem ใช้งานไม่ได้) e) เรียกใช้ update-ca-certificate จากนั้นบิงโก! - symlink ที่จำเป็นถูกสร้างขึ้นโดยอัตโนมัติใน / usr / lib / ssl / certs /
ไม่มีข้อบกพร่องกระต่าย

11

น่าจะเป็นใบรับรองที่ขาดหายไปจากเซิร์ฟเวอร์

Root-> Intermediate-> เซิร์ฟเวอร์

เซิร์ฟเวอร์ควรส่ง Server & Intermediate เป็นอย่างต่ำ

ใช้openssl s_client -showcerts -starttls ftp -crlf -connect abc:21เพื่อแก้ไขข้อบกพร่องของปัญหา

หากมีการส่งคืนใบรับรองเพียงฉบับเดียว (ลงนามด้วยตนเองหรือออกให้) คุณจะต้องเลือก:

  1. มีเซิร์ฟเวอร์คงที่
  2. เชื่อถือใบรับรองนั้นและเพิ่มลงในร้านค้าใบรับรอง CA ของคุณ (ไม่ใช่ความคิดที่ดีที่สุด)
  3. ปิดใช้งานความไว้วางใจเช่นcurl -k(แนวคิดที่ไม่ดีมาก)

หากเซิร์ฟเวอร์ส่งคืนมากกว่าหนึ่งรายการ แต่ไม่รวมใบรับรองที่ลงชื่อด้วยตนเอง (รูท):

  1. ติดตั้งใบรับรอง CA (root) ในร้านค้า CA ของคุณสำหรับเครือข่ายนี้เช่น google the issuer ( เฉพาะถ้าคุณเชื่อถือ CA นั้น)
  2. มีเซิร์ฟเวอร์คงที่เพื่อส่ง CA เป็นส่วนหนึ่งของห่วงโซ่
  3. เชื่อถือใบรับรองในห่วงโซ่
  4. ปิดการใช้งานความไว้วางใจ

หากเซิร์ฟเวอร์ส่งคืนใบรับรอง root CA แสดงว่าไม่อยู่ในที่จัดเก็บ CA ตัวเลือกของคุณคือ:

  1. เพิ่ม (ความน่าเชื่อถือ)
  2. ปิดการใช้งานความไว้วางใจ

ฉันไม่สนใจ certs ที่หมดอายุ / ถูกเพิกถอนเนื่องจากไม่มีข้อความระบุ แต่คุณสามารถตรวจสอบใบรับรองด้วยopenssl x509 -text

ให้คุณกำลังเชื่อมต่อกับรุ่นที่บ้าน ( https://www.cerberusftp.com/support/help/installing-a-certificate/ ) เซิร์ฟเวอร์ ftp ฉันจะบอกว่ามันลงนามด้วยตนเอง

โปรดโพสต์รายละเอียดเพิ่มเติมเช่นผลลัพธ์จาก openssl


6

ตามเอกสาร cURLคุณสามารถส่งใบรับรองไปยังcurlคำสั่ง:

รับใบรับรอง CA ที่สามารถตรวจสอบเซิร์ฟเวอร์ระยะไกลและใช้ตัวเลือกที่เหมาะสมเพื่อชี้ให้เห็นใบรับรอง CA นี้สำหรับการตรวจสอบเมื่อเชื่อมต่อ สำหรับlibcurlแฮกเกอร์:curl_easy_setopt(curl, CURLOPT_CAPATH, capath);

ด้วยเครื่องมือบรรทัดคำสั่ง curl: --cacert [file]


ตัวอย่างเช่น:

curl --cacert mycertificate.cer -v https://www.stackoverflow.com

5

อาจเพียงพอที่จะอัปเดตรายการใบรับรอง

sudo update-ca-certificates -f

update-ca-certificate เป็นโปรแกรมที่อัพเดตไดเร็กทอรี / etc / ssl / certs เพื่อเก็บใบรับรอง SSL และสร้าง ca-certificate.crt ซึ่งเป็นรายการไฟล์เดี่ยวที่ต่อกันของใบรับรอง


ทำแล้วและทุกอย่างจะทำหลังจากเรียกใช้ แต่ขดไม่ทำงาน ยังคงเป็นข้อผิดพลาดเดียวกัน
AGamePlayer

1
ฉันได้รับคำสั่งและมันก็ไม่ได้ช่วยและฉันก็ไม่อยากจะเชื่อว่าฉันต้องทำทุกอย่างด้านบน แล้วคำตอบของคุณ ... ขอบคุณสำหรับแฟล็ก '-f'
Alex Shtromberg

1
นี่คือทางออกที่ฉันเข้ามาเช่นกัน +1
SS Anne

3

ลองติดตั้ง curl ใหม่ใน Ubuntu และอัปเดต CA certs ของฉันด้วยsudo update-ca-certificates --freshที่ปรับปรุง certs


2

บน windows ฉันมีปัญหานี้ Curl ได้รับการติดตั้งโดย mysysgit ดังนั้นการดาวน์โหลดและติดตั้งเวอร์ชันใหม่ล่าสุดได้แก้ไขปัญหาของฉัน

ไม่เช่นนั้นเป็นคำแนะนำที่เหมาะสมในการอัปเดตใบรับรอง CA ที่คุณสามารถลอง


2

ใช่คุณต้องเพิ่มใบรับรอง CA ด้วย การเพิ่มโค้ดขนาดสั้นใน Node.js เพื่อมุมมองที่ชัดเจน

var fs = require(fs)
var path = require('path')
var https = require('https')
var port = process.env.PORT || 8080;
var app = express();

https.createServer({
key: fs.readFileSync(path.join(__dirname, './path to your private key/privkey.pem')),
cert: fs.readFileSync(path.join(__dirname, './path to your certificate/cert.pem')),
ca: fs.readFileSync(path.join(__dirname, './path to your CA file/chain.pem'))}, app).listen(port)

2

ฉันพบปัญหานี้เช่นกัน ฉันได้อ่านหัวข้อนี้และคำตอบส่วนใหญ่มีข้อมูล แต่ซับซ้อนเกินไปสำหรับฉัน ฉันไม่มีประสบการณ์เกี่ยวกับหัวข้อเครือข่ายดังนั้นคำตอบนี้เหมาะสำหรับคนอย่างฉัน

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเพราะฉันไม่ได้รวมใบรับรองระดับกลางและใบรับรองรูทถัดจากใบรับรองที่ฉันใช้ในแอปพลิเคชันของฉัน

นี่คือสิ่งที่ฉันได้รับจากผู้จำหน่ายใบรับรอง SSL:

- abc.crt
- abc.pem
- abc-bunde.crt

ในabc.crtไฟล์มีใบรับรองเดียวเท่านั้น:

-----BEGIN CERTIFICATE-----
/*certificate content here*/
-----END CERTIFICATE-----

ถ้าฉันให้มันในรูปแบบนี้เบราว์เซอร์จะไม่แสดงข้อผิดพลาดใด ๆ (Firefox) แต่ฉันจะได้รับcurl: (60) SSL certificate : unable to get local issuer certificateข้อผิดพลาดเมื่อฉันทำคำขอขด

เพื่อแก้ไขข้อผิดพลาดนี้ให้ตรวจสอบabc-bunde.crtไฟล์ของคุณ คุณมักจะเห็นอะไรเช่นนี้:

-----BEGIN CERTIFICATE-----
/*additional certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*other certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*different certificate content here*/
-----END CERTIFICATE-----

นี่คือใบรับรองระดับกลางและระดับรูทของคุณ เกิดข้อผิดพลาดเนื่องจากไม่มีใบรับรอง SSL ที่คุณส่งให้แอปพลิเคชันของคุณ

ในการแก้ไขข้อผิดพลาดให้รวมเนื้อหาของไฟล์ทั้งสองนี้ในรูปแบบนี้:

-----BEGIN CERTIFICATE-----
/*certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*additional certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*other certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*different certificate content here*/
-----END CERTIFICATE-----

โปรดทราบว่าไม่มีช่องว่างระหว่างใบรับรองในตอนท้ายหรือตอนเริ่มต้นของไฟล์ เมื่อคุณจัดหาใบรับรองรวมนี้ให้กับใบสมัครของคุณปัญหาของคุณควรได้รับการแก้ไข


1

บน windows - ถ้าคุณเรียกใช้จาก cmd

> curl -X GET "https://some.place"

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

ตั้งค่าตัวแปรสภาพแวดล้อม:

CURL_CA_BUNDLE = C:\Program Files\curl-7.57.0\src\cacert.pem

และโหลดสภาพแวดล้อม

refreshenv

ลองใหม่อีกครั้ง

เหตุผลของปัญหา: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/replies/95548


1

กรณีของฉันแตกต่างกัน ฉันโฮสต์เว็บไซต์ที่อยู่หลังไฟร์วอลล์ ข้อผิดพลาดเกิดจาก pfSense

Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|

ฉันพบสาเหตุโดยไม่ได้ตั้งใจขอบคุณคำตอบนี้


ทุกอย่างดีเมื่อฉันเข้าถึงเว็บไซต์ของฉันจาก WAN

อย่างไรก็ตามเมื่อไซต์ถูกเข้าถึงจากภายใน LAN (เช่นเมื่อ Wordpress curlส่งคำขอไปยังเซิร์ฟเวอร์ของตัวเองแม้ว่าจะใช้ WAN IP 49.x.x.x) เว็บไซต์ก็จะแสดงหน้าล็อกอิน pfSense

pfSense webConfigurator Self-Signed Certificateฉันระบุใบรับรองเป็น ไม่แปลกใจเลยที่curlเกิดข้อผิดพลาด

สาเหตุ:เกิดอะไรขึ้นคือการที่ได้รับโดยใช้ที่อยู่curl IP WAN ของเว็บไซต์ 49.x.x.xแต่ในบริบทของเว็บเซิร์ฟเวอร์ WAN IP เป็นไฟร์วอลล์

แก้ไขข้อบกพร่อง:ฉันพบว่าฉันได้รับใบรับรอง pfSense

วิธีแก้ไข:บนเซิร์ฟเวอร์ที่โฮสต์ไซต์ให้ชี้ชื่อโดเมนของตนเองเป็น 127.0.0.1

ด้วยการใช้วิธีแก้ปัญหาcurlคำขอของเว็บเซิร์ฟเวอร์ได้รับการจัดการอย่างเหมาะสมและไม่ส่งต่อไปยังไฟร์วอลล์ที่ตอบกลับโดยการส่งหน้าเข้าสู่ระบบ


0

นี่คือปัญหาที่เก็บใบรับรอง ssh คุณต้องดาวน์โหลดไฟล์ pem ใบรับรองที่ถูกต้องจากเว็บไซต์ CA เป้าหมายจากนั้นสร้างไฟล์ soft link เพื่อสั่ง ssl Certifacate ที่เชื่อถือได้

openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem

คุณจะได้รับ dd8e9d41

สร้างลิงค์ solf พร้อมหมายเลขแฮชและต่อท้ายไฟล์ด้วย. 0 (จุดศูนย์)

dd8e9d41.0

จากนั้นลองอีกครั้ง


0
  1. ดาวน์โหลดhttps://curl.haxx.se/ca/cacert.pem

  2. หลังจากดาวน์โหลดย้ายไฟล์นี้ไปยังเซิร์ฟเวอร์ wamp ของคุณ

    สำหรับ exp: D: \ wamp \ bin \ php \

  3. จากนั้นเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ php.ini ที่ด้านล่าง

curl.cainfo = "D: \ WAMP \ bin \ PHP \ cacert.pem"

  1. ตอนนี้รีสตาร์ทเซิร์ฟเวอร์ wamp ของคุณ

0

คุณต้องเปลี่ยนใบรับรองเซิร์ฟเวอร์จากcert.pemเป็นfullchain.pem
ฉันมีปัญหาเดียวกันกับ Perl HTTPS Daemon:
ฉันได้เปลี่ยน:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem'
เป็น:
SSL_cert_file => '/etc/letsencrypt/live/mydomain/fullchain.pem'


-1

จนถึงตอนนี้ฉันได้เห็นปัญหานี้เกิดขึ้นภายในเครือข่ายองค์กรเนื่องจากสองสาเหตุหนึ่งหรือทั้งสองอย่างที่อาจเกิดขึ้นในกรณีของคุณ:

  1. เนื่องจากพร็อกซีเครือข่ายทำงานอย่างไรพวกเขาจึงมีใบรับรอง SSL ของตัวเองดังนั้นจึงเปลี่ยนใบรับรองที่ curl เห็น เครือข่ายองค์กรจำนวนมากหรือส่วนใหญ่บังคับให้คุณใช้พรอกซีเหล่านี้
  2. โปรแกรมป้องกันไวรัสบางโปรแกรมที่ทำงานบนพีซีไคลเอนต์ก็ทำหน้าที่คล้ายกับพร็อกซี HTTPS เพื่อให้สามารถสแกนทราฟฟิกเครือข่ายของคุณได้ โปรแกรมป้องกันไวรัสของคุณอาจมีตัวเลือกให้ปิดใช้งานฟังก์ชั่นนี้ (สมมติว่าผู้ดูแลระบบของคุณอนุญาต)

ตามหมายเหตุข้างต้นข้อที่ 2 ด้านบนอาจทำให้คุณรู้สึกไม่สบายใจเกี่ยวกับปริมาณข้อมูล TLS ที่ปลอดภัยซึ่งคาดว่าจะถูกสแกน นั่นคือโลกธุรกิจสำหรับคุณ


-1

มีปัญหานั้นและไม่ได้รับการแก้ไขด้วยเวอร์ชันใหม่กว่า / etc / certs มีใบรับรอง root เบราว์เซอร์กล่าวว่าทุกอย่างเรียบร้อย หลังจากการทดสอบบางอย่างฉันได้รับคำเตือนจาก ssllabs.com ห่วงโซ่ของฉันยังไม่สมบูรณ์ (อันที่จริงมันเป็นสายโซ่สำหรับใบรับรองเก่า หลังจากแก้ไขเชนใบรับรองทุกอย่างเรียบร้อยดีแม้มีการม้วนงอ


-1

ฉันมีปัญหานี้กับ Digicert ของ CA ทั้งหมด ฉันสร้างไฟล์ digicertca.pem ที่ทั้งกลางและรูทวางรวมกันเป็นไฟล์เดียว

curl https://cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem
curl https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt.pem

curl -v https://mydigisite.com/sign_on --cacert DigiCertCA.pem
...
*  subjectAltName: host "mydigisite.com" matched cert's "mydigisite.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
*  SSL certificate verify ok.
> GET /users/sign_in HTTP/1.1
> Host: mydigisite.com
> User-Agent: curl/7.65.1
> Accept: */*
...

Eorekan มีคำตอบ แต่มีเพียงตัวฉันและอีกคนเท่านั้นในการโหวตคำตอบของเขา


-2

โดยเฉพาะสำหรับWindowsผู้ใช้curl-7.57.0-win64-mingwหรือรุ่นที่คล้ายกัน

ช้าไปหน่อยและคำตอบที่มีอยู่นั้นถูกต้อง แต่ฉันยังต้องดิ้นรนเล็กน้อยเพื่อให้มันทำงานบนเครื่อง Windows ของฉันได้แม้ว่ากระบวนการนี้จะค่อนข้างตรงไปตรงมา ดังนั้นการแบ่งปันกระบวนการทีละขั้นตอน

ข้อผิดพลาดนี้โดยทั่วไปหมายถึงว่าขดไม่สามารถตรวจสอบใบรับรองของ URI เป้าหมาย หากคุณเชื่อถือผู้ออกใบรับรอง (CA) คุณสามารถเพิ่มลงในรายการใบรับรองที่เชื่อถือได้

ในการนี้ให้เรียกดู URI (เช่นบน Chrome) และทำตามขั้นตอน

  1. คลิกขวาที่ไอคอนรูปกุญแจล็อค
  2. คลิกที่ใบรับรองมันจะเปิดหน้าต่างที่มีรายละเอียดใบรับรอง
  3. ไปที่แท็บ 'เส้นทางการรับรอง'
  4. คลิกใบรับรอง ROOT
  5. คลิกดูใบรับรองมันจะเปิดหน้าต่างใบรับรองอื่น
  6. ไปที่แท็บรายละเอียด
  7. คลิกคัดลอกไปที่ไฟล์มันจะเปิดตัวช่วยสร้างการส่งออก
  8. คลิกถัดไป
  9. เลือก 'Base-64 encoded X.509 (.CER)'
  10. คลิกถัดไป
  11. ตั้งชื่อที่จำง่ายเช่น 'MyDomainX.cer' (เรียกดูไดเรกทอรีที่ต้องการ)
  12. คลิกถัดไป
  13. คลิกเสร็จสิ้นมันจะบันทึกไฟล์ใบรับรอง
  14. ตอนนี้เปิด.cerไฟล์นี้และคัดลอกเนื้อหา (รวมถึง ----- BEGIN CERTIFICATE ----- และ ----- END CERTIFICATE -----)
  15. ตอนนี้ไปที่ไดเรกทอรีที่curl.exeบันทึกเช่นC:\SomeFolder\curl-7.57.0-win64-mingw\bin
  16. เปิดcurl-ca-bundle.crtไฟล์ด้วยโปรแกรมแก้ไขข้อความ
  17. ผนวกข้อความใบรับรองที่คัดลอกต่อท้ายไฟล์ บันทึก

ตอนนี้คำสั่งของคุณควรดำเนินการปรับใน curl


3
ความคิดเห็นบางประการเกี่ยวกับเหตุผลของการลงคะแนนเสียงจะได้รับการชื่นชม
Arghya C

ฉันไม่พบไฟล์ชื่อ "curl-ca-bundle.crt" ใน "C: \ xampp \ apache \ bin" (windows) เดาคะแนนโหวตลงเนื่องจากเรื่องนี้ ฉันมี "curl.exe" ของฉันในโฟลเดอร์ "bin" ที่กล่าวถึงข้างต้น
kathikeyan A

-4

สิ่งนี้สามารถช่วยคุณในการดื่มสุรา:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

ทดสอบกับ guzzle / guzzle 3. *


-5

วิธีง่ายๆ: ~/.sdkman/etc/configในการเปลี่ยนแปลงsdkman_insecure_ssl=true

ขั้นตอน: เปลี่ยน
นาโนเพื่อ บันทึกและออก~/.sdkman/etc/config
sdkman_insecure_ssl=falsesdkman_insecure_ssl=true

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