จะทำให้ Gnu / Linux เชื่อถือใบรับรองที่ Windows เชื่อถือได้หรือไม่


11

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

รายงานการตรวจสอบ SSL

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

สิ่งนี้คือ Chrome / Mozilla / Edge บน Windows เชื่อถือใบรับรองเว็บไซต์ต่อไป :

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามในการปรับใช้ Gnu / Linux (Ubuntu 18.04 ใน Docker) ใบรับรองไม่น่าเชื่อถือ:

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

ฉันลองupdate-ca-certificatesและแม้แต่นำเข้าใบรับรองหลักของ Globalsign update-ca-certificatesรายงานใบรับรองซ้ำในกรณีนั้น อย่างไรก็ตามไม่มีอะไรทำงาน

วิธีการทำซ้ำ

ใช้นักเทียบท่า:

docker run -it ubuntu:18.04

# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it  # <---- "unable to get local issuer certificate"

ฉันจะทำให้ Gnu / Linux เชื่อถือใบรับรองนี้ได้อย่างไร

PS: ใบรับรองเดียวกันจะถูกนำไปใช้อย่างถูกต้องบนเซิร์ฟเวอร์อื่น


ทำไม downvote
Udo G

1
ฉันลงคะแนนเพื่อปิดคำถามนี้เป็นหัวข้อนอกเพราะ OP กำลังขอบางสิ่งที่เขาไม่สามารถมีอิทธิพลต่อตัวเอง เขาบอกว่าเขาไม่สามารถแก้ไขอะไรฝั่งเซิร์ฟเวอร์ดังนั้นนี่อาจเป็นของ superuser ฉันคิดว่ามันอธิบายถึงปัญหาที่ไม่มีลูกค้าฝั่งโซลูชัน
LinuxSecurityFreak

2
ฉันขอโซลูชันด้านลูกค้าโดยเฉพาะ ฉันไม่สามารถมีอิทธิพลต่อเซิร์ฟเวอร์ แต่ฉันมีการควบคุมเต็มรูปแบบของไคลเอ็นต์ O / S (Ubuntu) และฉันต้องการการติดตั้ง O / S นี้โดยเฉพาะเพื่อเชื่อถือใบรับรองเช่นเดียวกับ O / S (Windows) อื่น ๆ มันไม่เกี่ยวกับการแก้ไขไซต์ HTTPS ให้คนอื่น
Udo G


1
คุณไม่ได้ควบคุมเซิร์ฟเวอร์ แต่คุณยังสามารถรายงานปัญหาไปยังผู้ที่ควบคุมเซิร์ฟเวอร์ได้
Michael Hampton

คำตอบ:


11

การแก้ไขที่แท้จริงสำหรับสิ่งนี้คือเพื่อให้แน่ใจว่าเซิร์ฟเวอร์ของคุณแสดงใบรับรองทั้งหมดในกลุ่มและไม่ใช่แค่ใบรับรอง end-entity (เซิร์ฟเวอร์)

ชี้ผู้ดูแลเซิร์ฟเวอร์ของคุณไปที่RFC 5246 มาตรา 7.4.2ซึ่งระบุไว้อย่างชัดเจนว่าข้อความนี้สื่อถึงห่วงโซ่ใบรับรองของเซิร์ฟเวอร์ไปยังไคลเอนต์


หากผู้ดูแลระบบของคุณปฏิเสธ / ไม่สามารถทำเช่นนี้ได้ด้วยเหตุผลบางอย่างตัวเลือกอื่นของคุณคือพยายามและcurlทำงานกับ handshake ที่มีรูปแบบไม่ถูกต้อง

ตามข้อความในรายการส่งจดหมายของ Curl:

บางคนสามารถยืนยันได้ว่า cURL รองรับใบรับรองระดับกลาง (หรือไม่) หรือไม่

ใช่. ใบรับรอง ca ทั้งหมดมีสายใบรับรองขึ้นไปถึงรูท ชุด ca ที่คุณใช้กับขดจำเป็นต้องประกอบด้วย certs สำหรับโซ่ทั้งหมด

/ daniel.haxx.se

คุณควรจะเพิ่ม Root CA และตัวกลางตัวกลางทั้งหมดลงในบันเดิลและชี้curlไปที่มันโดยใช้--cacert <file>ตัวเลือก

เมื่อเบราว์เซอร์ของคุณทำงานคุณสามารถเข้าถึงใบรับรอง CA ที่ถูกต้องได้จากที่นั่น บนแท็บใบรับรอง (แตกต่างกันไปสำหรับแต่ละเบราว์เซอร์ แต่ฉันแน่ใจว่าคุณจะรู้ว่าสิ่งนั้นอยู่ที่ใด) ดูห่วงโซ่ใบรับรอง ดับเบิลคลิกที่ Root CA แรกGlobalSign Root CA - G1และในรายละเอียดแท็บคลิกคัดลอกไปยังไฟล์ ... root.cerบันทึกเป็น ทำเช่นเดียวกันกับAlphaSSL CA - SHA256 - G2issuing.cerและบันทึกเป็น เข้าร่วมกับทั้งสองร่วมกันในไฟล์เดียว (เช่นchain.cer) -cacertและการใช้งานที่เป็นอาร์กิวเมนต์ไป

ชี้เป็นความกรุณาโดย @AB ใบรับรองหายไปนอกจากนี้ยังสามารถพบได้ที่นี่


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

โปรดทราบว่าใน Windows, IE / Edge และ Chrome แบ่งปันแคชเดียวกันในขณะที่ Firefox ใช้ของตัวเอง

นอกเหนือไปจากข้างต้น IE / ขอบและ Chrome (ตามที่พวกเขาร่วมกองการเข้ารหัสลับเดียวกัน) จะใช้นามสกุลภายในใบรับรองเรียกว่าAuthorityInformationAccess ตัวเลือกนี้มีตัวเลือกcaIssuerซึ่งให้ URL ซึ่งสามารถดาวน์โหลดใบรับรอง CA ของใบรับรองเอนทิตีของเอนทิตีได้ ดังนั้นแม้ว่าหนึ่งในเบราว์เซอร์เหล่านี้จะไม่เก็บใบรับรองที่หายไปจากการเรียกดูก่อนหน้านี้ แต่ก็สามารถดึงข้อมูลได้หากจำเป็น โปรดทราบว่า Firefox ไม่ทำเช่นนี้ซึ่งเป็นสาเหตุที่บางครั้ง Firefox สามารถแสดงข้อผิดพลาดของใบรับรองเมื่อ IE / Edge และ Chrome ทำงานได้


1
ไม่ใช่เซิร์ฟเวอร์ของฉันดังนั้นจึงไม่สามารถแก้ไขอะไรฝั่งเซิร์ฟเวอร์ ฉันพยายามใช้ชุดข้อมูล CA จากcurl.haxx.se/docs/caextract.html (เนื่องจาก Firefox เชื่อถือใบรับรอง) และผ่านการใช้งาน--cacert cacert.pemแต่ CURL ยังไม่ยอมรับใบรับรอง
Udo G

1
มันเป็นเซิร์ฟเวอร์ของคุณ เรียกใช้echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443และคุณจะเห็นใบรับรองเพียงใบเดียวที่นำเสนอโดยเซิร์ฟเวอร์ของคุณ ควรมีสอง - ใบรับรอง end-entity (ซึ่งนำเสนอ) และ CA ที่ออก - Alpha SSL - ใบรับรอง SHA256 - G2 หลังไม่ได้ถูกส่งโดยเซิร์ฟเวอร์ แต่ควร
garethTheRed

2
@garethTheRed: ฉันเข้าใจว่าเซิร์ฟเวอร์ไม่ได้แสดงใบรับรองทั้งหมด แต่เซิร์ฟเวอร์ไม่ได้อยู่ภายใต้การควบคุมของฉัน (นั่นคือสิ่งที่ฉันหมายถึงด้วย "ไม่ใช่เซิร์ฟเวอร์ของฉัน") ฉันแค่พยายามเข้าถึง API บนเซิร์ฟเวอร์ต่างประเทศ ใน Windows เบราว์เซอร์ของฉันไม่บ่นเกี่ยวกับใบรับรองมีเพียง Linux / Debian / Ubuntu เท่านั้น
Udo G

@AB: ขอบคุณมาก! การติดตั้งใบรับรองหลักทั้งหมดจากหน้านั้นแก้ไขปัญหาได้ อย่างไรก็ตามฉันต้องการเข้าใจว่าทำไมขั้นตอนแบบแมนนวลจึงเป็นสิ่งจำเป็น
Udo G

2
หายไปกลางใบรับรอง (ดังกล่าวโดย @garethTheRed) สามารถพบได้มี: support.globalsign.com/customer/portal/articles/... ในตอนแรก OP พยายามเพิ่มเฉพาะใบรับรองหลักซึ่งอาจมีอยู่แล้วดังนั้นจึงไม่ประสบความสำเร็จ
AB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.