OpenSSL ไม่รับ CA ในโฟลเดอร์ certs


9

เราประสบปัญหาในการcurlไม่เชื่อมต่อกับเซิร์ฟเวอร์ HTTPS:

$ curl https://the-problem-site.com    (not the real URL!)   
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)

1112 ในSSL_R_TLSV1_UNRECOGNIZED_NAMEssl.h

ถ้าฉันลองopenssl s_client -connect the-problem-site.com:443แทนฉันก็เห็น

CONNECTED(00000003)   
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
verify error:num=20:unable to get local issuer certificate   
verify return:0   

Certificate chain   
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com   
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA   

/C=US/O=GeoTrust Inc./CN=GeoTrust Global CAคือมันดูเหมือนว่าปัญหาก็คือว่ามันไม่ได้ความไว้วางใจ อย่างไรก็ตามมีการติดตั้งใบรับรองนั้น: มัน/etc/ssl/certs/GeoTrust_Global_CA.pemและถ้าฉันเรียกใช้แทน

openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem

จากนั้นทุกอย่างทำงานได้ ใบรับรองยังแสดงเป็นไฟล์ที่มีชื่อแฮชb0f3e76e.0และอยู่ในca-certificates.crtนั้น อย่างไรก็ตามเท่าที่ฉันเห็น Curl หรือ openssl ไม่พยายามอ่านใบรับรองใด ๆ ถ้าฉันstraceพวกเขาแล้วก็ไม่มีความพยายามที่จะอ่านจาก/usr/lib/ssl/certsหรือ/etc/ssl/certsเลยไม่ได้มีข้อผิดพลาด มันอ่าน openssl.cnf update-ca-certificatesเราได้ทำงาน

นี่คือ Ubuntu 10.04 ที่มี openssl 0.9.8k เราสามารถสร้างปัญหาขึ้นมาใหม่ได้จากการติดตั้งสองแบบแยกกัน (แม้ว่ามันจะเป็นไปได้ก็ตาม ถ้าฉันพยายามทดสอบเดียวกันบน CentOS VM กับ OpenSSL 0.9.8e straceแล้วมันทำงานได้ดีและฉันสามารถเห็นมันอ่านไฟล์ใบรับรองใน ไม่มีการเข้าถึงไฟล์ที่เทียบเท่าในจุดเดียวกันในช่องของ Ubuntu ถ้าฉันคัดลอกopenssl.cnfไฟล์จาก CentOS VM ไปยังเครื่อง Ubuntu มันก็ไม่ต่างอะไร ไม่มีอะไรที่ชัดเจนในสภาพแวดล้อมหรือไฟล์. rc ที่อาจเป็นสาเหตุของปัญหานี้

ความคิดใดที่ฉันทำผิด ควรใช้งานได้เช่นเปิด openssl และ curl เพื่อรับ CA ที่ติดตั้งโดยอัตโนมัติจากบรรทัดคำสั่งหรือไม่ สิ่งนี้ได้รับการกำหนดค่าอย่างไร? ขอบคุณ!


จุดข้อมูลอื่น: ในการติดตั้งเซิร์ฟเวอร์ 13 ตัวcurlจะรับไฟล์ใบรับรองและทำงานได้ดี openssl s_clientยังไม่ถึงแม้ว่า ทำไมถึงเป็นเช่นนั้น?


เรากำลังประสบปัญหาเดียวกัน ฉันรู้สึกผิดพลาดใน openssl!
milosgajdos

@Rup คุณพบวิธีแก้ปัญหานี้หรือไม่? โปรดเพิ่มและทำเครื่องหมายคำตอบหากเป็นเช่นนั้น เรากำลังเห็นพฤติกรรมเดียวกันนี้
Mike S

@ MikeS ไม่เท่าที่ฉันรู้ขออภัย แต่ฉันไม่ได้อยู่ในทีมนั้น ฉันจะถามพวกเขาในวันพรุ่งนี้
รูปี

คำตอบ:


4

มีไลบรารีการเข้ารหัสลับหลายระบบในระบบของคุณ:

  • OpenSSL (มาตรฐานทองคำพร้อมใบอนุญาตแบบ BSD (ฟรีมาก) ที่มีประโยคที่ค่อนข้างมีปัญหา (ป้องกันความเข้ากันได้ของ GPL แต่ไม่มีสิ่งใด "เลวร้าย") ซึ่ง จำกัด การยอมรับในโลก GNU)
  • GnuTLS (การแทนที่จาก FSF นั้นมาในสองรสชาติ, มีลิขสิทธิ์ LGPLv2 (แต่ไม่ถูกลบ) และ LGPLv3 ที่ได้รับอนุญาต (และไม่สามารถใช้ร่วมกับโปรแกรม GPLv2 เท่านั้น) ในอดีตไม่น่าสนใจเท่า OpenSSL สักหน่อย แต่เข้มงวดกว่า เช่นกันซึ่งช่วยเพิ่มความปลอดภัย)
  • NSS (ห้องสมุดของ Netscape / Mozilla ไม่ค่อยใช้ภายนอกไม่ค่อยใช้มาตรฐานใหม่ช้า)
  • ผู้เยาว์เช่น PolarSSL, MatrixSSL, NaCl / Salt

แน่นอนว่าพวกเขาทั้งหมดมีความคล้ายคลึงและแตกต่างกัน ซอฟต์แวร์ที่ใช้พวกเขา (เพื่อวัตถุประสงค์ในการเข้ารหัสลับหรือเพื่อใช้ SSL / TLS) บางครั้งสนับสนุนการใช้มากกว่าหนึ่งในไลบรารีเหล่านี้ (เช่น Lynx เว็บเบราว์เซอร์โดยทั่วไปจะเชื่อมโยงกับ OpenSSL แต่สนับสนุน GnuTLS ด้วยเช่นกัน เพื่อเอาใจคน GNU)

cURL ยังเป็นหนึ่งในโครงการที่สนับสนุนโดยใช้หนึ่งในสาม crypto library ที่สำคัญ ส่วนใหญ่เป็นเพราะ cURL เป็นไลบรารีหลักที่ตั้งใจใช้โดยโปรแกรมอื่นเมื่อพวกเขาต้องการดาวน์โหลด (หรืออัพโหลด) สิ่งต่าง ๆ โดยใช้การเชื่อมต่อ http, ftp และอื่น ๆ curlเครื่องมือบรรทัดคำสั่งอาจจะมาจากทั้งสองสายพันธุ์เหล่านี้

ตอนนี้ฉันค่อนข้างแน่ใจว่าปัญหาที่คุณพบกับระบบที่ไม่ได้ติดตั้งใหม่คือ:

OpenSSL และ GnuTLS รองรับการใช้/etc/ssl/certs/<hash>.<number>ไดเรกทอรี-style CA OpenSSL เวอร์ชั่น 0.x และ GnuTLS ใช้อัลกอริธึมที่แตกต่างกันในการคำนวณแฮชดังกล่าวกว่า OpenSSL เวอร์ชัน 1.x ที่ใช้ (ทั้งคู่สามารถอยู่ร่วมกันในระบบได้หากใบรับรองที่ต่างกันมีแฮชเดียวกันคุณเพียงใช้หมายเลขที่ต่างกันแต่ด้วยเหตุผลบางอย่างca-certificatesแพ็คเกจของ Debian / Ubuntu ดูเหมือนจะไม่ทำเช่นนี้) นอกจากนี้ GnuTLS บางเวอร์ชันไม่ สนับสนุนการใช้ไดเรกทอรี แต่ใช้ไฟล์เท่านั้น/etc/ssl/certs/ca-certificates.crt(ซึ่งมักจะจัดการโดยca-certificatesสคริปต์ผู้ดูแลแพ็คเกจ แต่สามารถเบี่ยงเบนได้); คุณดูเหมือนจะใช้เวอร์ชั่นที่เก่ากว่าดังนั้นนี่อาจเป็นสิ่งที่คุณตี

openssl s_clientโดยค่าเริ่มต้น (เช่นโดยไม่ต้อง-CApathหรือ-CAfileตัวเลือก) ไม่ได้ดูได้ทุกที่สำหรับใบรับรอง

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

ลองopenssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443เพิ่มเติมเพื่อopenssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443เลียนแบบพฤติกรรมของ GnuTLS เวอร์ชันเก่า

ตรวจสอบอีกครั้งว่ามี OpenSSL 1.x อยู่ทุกที่ในระบบของคุณหรือไม่ (อูบุนตูเป็นที่รู้จักกันดีว่ามีการอัปเดตที่สำคัญแม้กระทั่งในรุ่น LTS) และถ้าใช่ให้ตรวจสอบแฮชของไฟล์:

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

โดยปกติคำสั่งที่สองและที่สามควรล้มเหลว (OpenSSL 0.x) หรือคำสั่งที่หนึ่งและที่สามควรแสดงแฮชเดียวกัน แต่คำสั่งที่สองควรแสดงแฮชอื่น (OpenSSL 1.x) GnuTLS จะใช้เอาต์พุตจากคำสั่งที่สอง (หากติดตั้ง OpenSSL 1.x); ถ้าติดตั้ง OpenSSL 0.x นั่นคือแฮชเดียวกัน คุณสามารถสร้าง symlink ด้วยตนเอง

ฉันสามารถอัปเดตการโพสต์นี้เมื่อคุณให้ข้อเสนอแนะการแก้จุดบกพร่อง

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