ฉันสร้างผู้ออกใบรับรองที่ลงนามเองด้วยตนเองสำหรับบริการภายในไม่กี่แห่งใน บริษัท ของเราซึ่งฉันกำหนดค่าตัวเอง (ส่วนใหญ่ทำหน้าที่ผ่าน HTTPS) จากนั้นฉันสร้างใบรับรองสำหรับบริการเหล่านั้นลงนามด้วย CA นี้
ตอนนี้ฉันต้องการเพิ่มส่วนขยาย x509 (จุดแจกจ่าย CRL) ให้กับรูท CA โดยไม่ทำให้ใบรับรองเซิร์ฟเวอร์ที่มีอยู่ซึ่งออกจาก CA นี้ไม่ถูกต้อง เป็นไปได้ไหม
ความรู้สึกของฉันคือ "ใช่" เพราะอย่างที่ฉันเข้าใจการเข้าถึงกุญแจส่วนตัวที่เกี่ยวข้องนั้นเป็นสิ่งที่จำเป็นและเพียงพอสำหรับ "สิทธิ์เต็ม" ในการระบุตัวตนของใบรับรอง นั่นคือยกเว้นว่ามีการจัดเรียงของ nonce รวมกับคีย์สาธารณะในใบรับรองเมื่อมีการสร้าง (น่าจะ)
ฉันยังค่อนข้างใหม่ต่อการจัดการใบรับรอง SSL แต่ฉัน (คิดว่าฉัน) เข้าใจพื้นฐานของเครือข่ายความน่าเชื่อถือมาตรฐาน ฉันยังพอใจกับการใช้งานพื้นฐานของ crypto PKI อื่น ๆ : ฉันจัดการคีย์ SSH และใช้ GPG สำหรับการเซ็นชื่อและการเข้ารหัส ฉันเรียนวิชาวิทยาการคอมพิวเตอร์ถึงแม้ว่าฉันจะเป็นแค่คนทำเสียงเขียนด้วยตนเองในการเข้ารหัส
ฉันไม่เคยทำ CSR สำหรับ IIRC ดั้งเดิม (ฉันคิดว่ามันเป็นผลลัพธ์โดยตรงของopenssl req -new -x509
) ฉันยังคงมีรหัสส่วนตัวดั้งเดิมของ CA และใช้มันฉันสามารถ "ย้อนกลับ" ใบรับรองดั้งเดิมในคำขอลงนามใบรับรอง:
openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key
ฉันหวังว่าสิ่งนี้จะมีประสิทธิภาพ "แยก" ที่ไม่ได้กล่าวถึงข้างต้นและอนุญาตให้ฉันสร้างใบรับรองใหม่ แต่คราวนี้มีcrlDistributionPoints
ฟิลด์และดังนั้นใบรับรองทั้งหมดที่ลงนามกับ CA ดั้งเดิมจะยังคงตรวจสอบกับ CA ใหม่นี้ด้วยข้อยกเว้น ลูกค้าจะดึงไฟล์ CRL ของฉัน (ปัจจุบันว่าง) จาก URL HTTP ที่กำหนดไว้ในฟิลด์
ดังนั้นฉันจึงสร้างไฟล์ปรับแต่งส่วนขยายext.conf
:
[ cert_ext ]
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl
และฉันสร้าง CA รูตเวอร์ชันใหม่จาก CSR:
openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem
ตอนนี้เมื่อฉันดูใบรับรองด้วย openssl x509 -text -in MyNewCA.pem | less
ฉันเห็นส่วนขยาย CRL:
X509v3 extensions:
X509v3 Subject Key Identifier:
82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
X509v3 CRL Distribution Points:
Full Name:
URI:http://security.mycompany.co.za/root.crl`
แต่อนิจจา! ใบรับรองที่ลงนามก่อนหน้านี้ของฉันจะไม่ตรวจสอบกับใบรับรองนี้อีกต่อไป:
openssl verify -verbose -CAfile MyCA.pem git.pem
git.pem: OK
openssl verify -verbose -CAfile MyNewCA.pem git.pem
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate
ส่วนใหญ่ฉันกำลังมองหาข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับวิธีการทำงานของใบรับรองและสาเหตุ แต่ฉันก็ยินดีต้อนรับวิธีแก้ปัญหาที่นำไปสู่ปัญหานี้ดังนั้นนี่คือข้อมูลเบื้องหลังบางส่วนเช่นกัน
ฉันเข้ามายุ่งกับเรื่องนี้ได้อย่างไร: HTTPS สำหรับบริการภายในทำงานได้ยอดเยี่ยมเมื่อ CA ของฉันถูกติดตั้งผ่าน Explorer RMB →ติดตั้ง GUI ใบรับรองบน Windows หรือ/usr/local/share/ca-certificates
ตามด้วยupdate-ca-certificates
Debian และ Ubuntu แต่ฉันเพิ่งพบข้อยกเว้น: Git บน Windows โดยเฉพาะถ้าติดตั้งเพื่อใช้ Windows Secure Channel เป็น SSL back-end ซึ่งเห็นได้ชัดว่าตามค่าเริ่มต้นยืนยันว่าจะต้องมีฟิลด์ CRL ในใบรับรอง SSL
ดังนั้นฉันคิดว่ามันเป็นปัญหาของ Windows Secure Channel เพราะข้อความแสดงข้อผิดพลาดที่ฉันยังคงทำงานดูเหมือนว่าเฉพาะ Microsoft เท่านั้น: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.
ถ้าฉันติดตั้ง Git ด้วย OpenSSL และต่อเชื่อม CA ของฉันเองเข้ากับไฟล์ที่ชี้ไปที่ git.http.sslcainfo แล้วก็ใช้งานได้ แต่ฉันเกรงว่าผู้ใช้ของฉันจะไม่สนใจการยืนยันตัวตน SSL หากพวกเขารู้สึกว่ากระบวนการนี้เป็นความพยายามมากกว่า คลิกผ่าน GUI ตัวติดตั้งใบรับรอง Windows "ที่ง่าย"
-x509toreq
จะกู้คืนข้อมูลที่ไม่ซ้ำกันทั้งหมดจากรูท CA ที่มีอยู่ แต่ไม่ว่าจะมีหรือมีสิ่งผิดปกติเกิดขึ้นกับกระบวนการของฉัน
req -new -x509
และx509 -req -signkey
ทั้งสองค่าเริ่มต้นอนุกรมของใบรับรองที่ลงนามด้วยตนเองเป็นหมายเลขสุ่ม (แม้ว่าสิ่งนี้สามารถถูกแทนที่) ได้อย่างมีประสิทธิภาพ nonce หากใบรับรองลูกของคุณ (หรือใด ๆ ของพวกเขา) มี AuthorityKeyIdentifier ใช้ตัวเลือก 'ผู้ออก + อนุกรม' (แทนหรือนอกเหนือจากตัวเลือก 'keyid') ซึ่งจะเป็นกรณีถ้าคุณใช้ca
กับไฟล์กำหนดค่าเริ่มต้น upstream คุณ จำเป็นต้องสร้างรูทใหม่ด้วยซีเรียลเดียวกันกับอันเก่า -set_serial
ใช้ ...