เราเรียกใช้ซอฟต์แวร์เวอร์ชันต่อไปนี้:

  • Ubuntu 18.04.5
  • Apache 2.4.29
  • ม้วนงอ 7.58.0

เราใช้แอปพลิเคชันด้านการศึกษา และด้วยส่วนหนึ่งนี้ เรามี API จำนวนมากที่อัปโหลดไฟล์ไปยังเว็บไซต์บุคคลที่สามhttps://api.turnitinuk.comจากเว็บเซิร์ฟเวอร์ของเราhttps://nclhe-moodle.ncl-coll.ac.uk .

เราต่ออายุใบรับรอง SSL สำหรับ nclhe-moodle.ncl-coll.ac.uk ในเดือนธันวาคม 2020 บนเว็บเซิร์ฟเวอร์ได้สำเร็จและทุกอย่างดำเนินการตามที่เราคาดไว้ แต่ทันใดนั้นในเดือนกุมภาพันธ์ 2021 เราเริ่มได้รับข้อผิดพลาดและการอัปโหลดดังต่อไปนี้ ล้มเหลว.

curl: (60) SSL certificate : unable to get local issuer certificate

(ฉันไม่เข้าใจว่าใบรับรองผู้ออกในเครื่องคืออะไร มันคือไคลเอนต์ (เว็บเซิร์ฟเวอร์) หรือเซิร์ฟเวอร์)

ไม่แน่ใจว่าทำไม เพิ่งเริ่มต้นในเดือนกุมภาพันธ์ 2021 เมื่อต่ออายุใบรับรองในเดือนธันวาคม 2020

ถ้าฉันข้ามการตรวจสอบใบรับรอง IPS บนพร็อกซีเซิร์ฟเวอร์ของเรา API ของเราจะทำงานได้สำเร็จ

นี่คือสิ่งที่ฉันได้พยายามแก้ไขปัญหานี้:

  • รันคำสั่งนี้บนเว็บเซิร์ฟเวอร์:

    curl -vs https://api.turnitinuk.com
    

    ข้อผิดพลาดด้านล่าง:

    * Rebuilt URL to: https://api.turnitinuk.com/
    *   Trying 199.47.86.35...
    * TCP_NODELAY set
    * Connected to api.turnitinuk.com (199.47.86.35) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    *   CAfile: /etc/ssl/certs/ca-certificates.crt
      CApath: /etc/ssl/certs
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * TLSv1.3 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (OUT), TLS alert, Server hello (2):
    * SSL certificate problem: unable to get local issuer certificate
    * stopped the pause stream!
    * Closing connection 0
    
  • เรียกใช้คำสั่ง OpenSSL ต่อไปนี้เพื่อรับสายใบรับรองจากอินสแตนซ์ Moodle

    openssl s_client -showcerts -servername nclhe-moodle.ncl-coll.ac.uk -connect nclhe-moodle.ncl-coll.ac.uk:443
    
  • ดาวน์โหลดใบรับรองทั้ง 3 รายการในสายใบรับรองของhttps://nclhe-moodle.ncl-coll.ac.ukและตรวจสอบว่ามีอยู่ใน/etc/ssl/certs/ca-certificates.crtไฟล์แล้ว แน่นอนว่าหนึ่งในนั้นคือใบรับรองระดับกลาง ไม่ได้อยู่ในไฟล์ ca-certificates.crt

  • แปลงไฟล์ 1 .cer เป็น .crt โดยใช้คำสั่งต่อไปนี้

    openssl x509 -inform PEM -in QuoVadis_Global_SSL_ICA_G3.cer -out QuoVadis_Global_SSL_ICA_G3.crt
    
  • อัปโหลดไฟล์ .crt ไปยัง/usr/local/share/ca-certificatesไดเร็กทอรี

  • เรียกใช้คำสั่ง

    sudo update-ca-certificates
    
  • เมื่อดู/etc/ssl/certs/ca-certificates.crtไฟล์แล้วใบรับรองที่ขาดหายไปจะอยู่ในไฟล์และมีการสร้างลิงก์สมมาตร 2 รายการใน/etc/ssl/certsไดเร็กทอรีดังนี้

    • QuoVadis_Global_SSL_ICA_G3.pem -> /usr/local/share/ca-certificates/QuoVadis_Global_SSL_ICA_G3.crt

    • 35e514f6.0 -> QuoVadis_Global_SSL_ICA_G3.pem

  • หยุดและรีสตาร์ท apache

    sudo /etc/init.d/apache2 stop
    sudo /etc/init.d/apache2 start
    
  • ลองใหม่อีกครั้งแต่ก็ยัง error เหมือนเดิม

คำถามอื่นจากฉัน:

ใน/etc/ssl/certsไฟล์ของฉันCA ทั้งหมดมีการเชื่อมโยงแบบ sym-link /usr/share/ca-certificatesแยกจาก CA ที่ฉันเพิ่งใช้ซึ่งเชื่อมโยงแบบ sym-link กับ/usr/local/share/ca-certificates. นี่เป็นปัญหาที่ต้องคำนึงถึงว่าใบรับรองเป็นส่วนหนึ่งของ/etc/ssl/certs/ca-certificates/crtไฟล์หรือไม่

ฉันนิ่งงันเล็กน้อยเกี่ยวกับสิ่งอื่นที่จะลองและได้ค้นคว้าสิ่งนี้อย่างกว้างขวางเพื่อลองและแก้ไขด้วยตนเอง ใครก็ได้ช่วยที

ขอบคุณมากล่วงหน้า

Mac


อัปเดตล่าสุด - ปัญหายังไม่ได้รับการแก้ไข ไฟล์จะถูกอัปโหลดโดยอัตโนมัติผ่าน API ดังนั้นแอปพลิเคชัน turnitin จะอยู่ภายในhttps://nclhe-moodle.ncl-coll.ac.ukผู้ใช้เข้าสู่ระบบ คลิกปุ่มสองสามปุ่ม และแอปจะอัปโหลดไฟล์ผ่าน API ไปยังhttps: //api.turnitinuk.com . สิ่งเดียวที่เปลี่ยนแปลงคือใบรับรอง SSL ได้รับการต่ออายุสำเร็จในเดือนธันวาคม 2020 แต่ปัญหานี้ไม่เคยเริ่มต้นจนถึงเดือนกุมภาพันธ์ 2021

answer

จากการอ่านคำถามของคุณ ลูกค้าคือเซิร์ฟเวอร์ของมหาวิทยาลัย และเซิร์ฟเวอร์คือเซิร์ฟเวอร์ TurnitinUK

ข้อความกำลังบอกคุณว่าเซิร์ฟเวอร์ของมหาวิทยาลัยไม่เชื่อถือเซิร์ฟเวอร์ TurnitinUK

สิ่งที่คุณต้องมีคือการเพิ่มบริการใบรับรอง AAAลงในca-certificates.crtไฟล์ของคุณ- ไม่มีอีกต่อไป ไฟล์นี้เป็นที่เก็บ trust-anchor ของคุณและ trust-anchor คือ Root CA ที่ TurnitinUK ใช้ ไม่ใช่ add-all-certificates-I-can-find-in-a-vain-hope-that-things-will-work store :-)

อย่างที่คุณสังเกตเห็น เซิร์ฟเวอร์จะส่งใบรับรองทั้งหมดให้คุณ (รวมถึงรูท ซึ่งไม่จำเป็น) ดังนั้นคุณไม่จำเป็นต้องเพิ่มใบรับรองที่ฝั่งไคลเอ็นต์ของคุณ (คุณไม่ควรทำเช่นนั้น) สิ่งที่คุณต้องทำคือบอกลูกค้าว่าคุณเชื่อถือใบรับรองสุดท้ายในห่วงโซ่ (ใบรับรอง Root CA) และความมหัศจรรย์ของ PKI จะจัดการส่วนที่เหลือ ใบรับรองใดๆ ที่ลงนามโดย Root CA นั้นเชื่อถือได้ (เมื่อเพิ่มไปยัง trust-store แล้ว) ดังนั้น CA รองและใบรับรองเอนทิตีปลายทางของคุณจึงเชื่อถือได้ทั้งหมดเมื่อเซิร์ฟเวอร์แสดงให้คุณเห็น

ลองทำความสะอาดโดย/usr/local/share/ca-certificatesปล่อยให้AAA Certificate Servicesอันเดียวแล้วเรียกใช้update-ca-certificatesใหม่