ข้อผิดพลาดใบรับรอง SSL: ตรวจสอบข้อผิดพลาด: num = 20: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น


11

ฉันพยายามรับการเชื่อมต่อ SSL กับเซิร์ฟเวอร์ LDAPS (Active Directory) แต่ยังคงมีปัญหาอยู่ ฉันพยายามใช้สิ่งนี้:

openssl s_client -connect the.server.edu:3269 

ด้วยผลลัพธ์ต่อไปนี้:

verify error:num=20:unable to get local issuer certificate 

ฉันคิดว่าโอเคเซิร์ฟเวอร์เก่าที่ใช้งานจริงไม่กี่ปี บางที CA ไม่มีอยู่จริง จากนั้นฉันก็ดึงใบรับรองจากผลลัพธ์ไปยังไฟล์ pem และลอง:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

และนั่นก็ไม่ได้ผลเช่นกัน

ฉันพลาดอะไรไป ไม่ควรที่จะใช้งานได้ตลอดเวลา?

ssl  openssl 

เพื่อความชัดเจนปรากฏว่า LDAPS เมื่อให้บริการจาก Windows ไม่แสดงใบรับรอง CA เมื่อทำการเชื่อมต่อ ดังนั้นคุณควรได้รับใบรับรอง CA X.509 ส่งออกเป็น base64 และกำหนดตามที่อธิบายไว้ในคำตอบด้านล่าง ในกรณีของฉันการใช้ python-ldap คุณกำหนดมันที่ขอบเขต GLOBAL (ไม่ใช่อินสแตนซ์ ldap.initialize () ของคุณ) เป็น: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') หลังจากนี้ฉันสามารถใช้ STARTTLS (ภายในพอร์ต LDAP 389) ตามที่คาดไว้
mbrownnyc

คำตอบ:


4

ดังนั้นนี่คือสิ่งที่ฉันเห็นในชื่อใบรับรอง CA:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

นั่นคือชื่อของใบรับรองที่ฉันได้นำเข้าหลังจากที่ฉันทำ -showcerts ในการลองครั้งที่สองด้านบน ฉันแสดงรายการ certs ใน keystore โดยทำสิ่งนี้:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

ฉันเห็นใบรับรอง CA ตรงนั้น

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

เพื่อให้แน่ใจว่า openssl กำลังใช้ที่เก็บคีย์ที่ฉันใช้กับเซิร์ฟเวอร์ฉันกำลังใช้อาร์กิวเมนต์ -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

รู้ว่าที่เก็บคีย์ java สำหรับ CA มีรหัสผ่านฉันพยายามใช้ตัวเลือก -pass pass: password ดังนี้:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

แต่นั่นก็ไม่ได้ผลเช่นกัน

สิ่งที่ตลกเกี่ยวกับการที่ไฟล์ cacerts มีรหัสผ่านและ openssl ไม่ได้บ่นว่ามันไม่สามารถอ่านไฟล์ cacerts ดูเหมือนว่าคาวสำหรับฉัน นั่นหรือสิ่งอื่นใดที่ส่งเสียงระฆัง


3

ข้อผิดพลาดนั้นเป็นวิธีของ openssl ในการพูดว่า "ฉันไม่สามารถทำตามห่วงโซ่ใบรับรองไปยังรูทที่เชื่อถือได้" ฉันเพิ่งทำคำสั่งเดียวกันกับเซิร์ฟเวอร์โฆษณาของตัวเองและได้รับใบรับรองเต็มรูปแบบ แต่ใบรับรองบนสุดมีข้อผิดพลาดที่แน่นอน หากคุณมี pub-key ของ CA ที่ลงนามใบรับรองคุณสามารถระบุด้วยตัวเลือก-CAfileหรือ-CApath


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

ในกรณีดังกล่าวอาจเป็นไปได้ว่าการตรวจสอบความถูกต้องล้มเหลวด้วยเหตุผลอื่นเช่นการหมดอายุ
sysadmin1138

1

ฉันพยายามรับการเชื่อมต่อ SSL กับเซิร์ฟเวอร์ LDAPS (Active Directory) แต่ยังคงมีปัญหาอยู่ ฉันพยายามใช้สิ่งนี้:

หากคุณใช้ OpenLDAP คุณสามารถตั้งค่า:

TLS_REQCERT=never

ในopenldap.confไฟล์ของคุณซึ่งสั่งให้ OpenLDAP ไม่พยายามตรวจสอบใบรับรอง มีตัวเลือกที่คล้ายกันหากคุณกำลังตรวจสอบสิทธิ์ LDAP กับ Apache

หากคุณต้องการทำการตรวจสอบใบรับรองจริง ๆ สิ่งต่อไปนี้อาจช่วยได้:

ฉันพลาดอะไรไป ไม่ควรที่จะใช้งานได้ตลอดเวลา?

ฉันไม่คิดอย่างนั้น แม้ว่าสิ่งต่อไปนี้อาจฟังดูชัดเจน แต่เป็นเพียงแขกที่ดีที่สุดของฉัน:

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

รับใบรับรอง CA โดยทำสิ่งเดียวกันโดยเปิดตัวเลือก -showcerts คว้าใบรับรองอื่น นั่นควรเป็นใบรับรอง CA ใช่ไหม

ไม่จำเป็นเลย ไม่มีการรับประกันว่าเซิร์ฟเวอร์ระยะไกลจะแสดงใบรับรอง CA ในผลลัพธ์ คุณต้องดูผู้ออกใบรับรองเซิร์ฟเวอร์ก่อน:

openssl x509 -in server.crt -noout -text | grep Issuer

... แล้วดูว่าหนึ่งในใบรับรองอื่น ๆ ที่คุณมีตรงกับ บริษัท ผู้ออกใบรับรองนั้นหรือไม่

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