SSL: ข้อผิดพลาด: 0B080074: รูทีนใบรับรอง x509: X509_check_private_key: ค่าคีย์ไม่ตรงกัน


106

ฉันไม่สามารถตั้งค่า SSL ได้ ฉันได้ใช้ Google และพบวิธีแก้ปัญหาเล็กน้อย แต่ไม่มีวิธีใดที่ใช้ได้ผลกับฉัน ฉันต้องการความช่วยเหลือ ...

นี่คือข้อผิดพลาดที่ฉันได้รับเมื่อพยายามรีสตาร์ท nginx:

root@s17925268:~# service nginx restart
Restarting nginx: nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/ssl/ssl.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed

ใบรับรองของฉันมาจาก StartSSL และมีอายุ 1 ปี

นี่คือสิ่งที่ฉันทดสอบ:

  • ใบรับรองและคีย์ส่วนตัวไม่มีช่องว่างต่อท้าย
  • ฉันไม่ได้ใช้ไฟล์ server.key เริ่มต้น
  • ฉันตรวจสอบ nginx.conf และคำสั่งชี้ไปที่คีย์ส่วนตัวและใบรับรองที่ถูกต้อง

ฉันตรวจสอบโมดูลัสด้วยและฉันได้รับโมดูลัสที่แตกต่างกันสำหรับทั้งคีย์และใบรับรอง

ขอขอบคุณสำหรับความช่วยเหลือของคุณ. :)

คำตอบ:


37

ฉันได้รับแฮช MD5 พร้อมผลลัพธ์ที่แตกต่างกันสำหรับทั้งคีย์และใบรับรอง

สิ่งนี้กล่าวได้ทั้งหมด คุณมีคีย์และใบรับรองไม่ตรงกัน

โมดูลัสควรตรงกัน ตรวจสอบว่าคุณมีคีย์ที่ถูกต้อง


หากฉันไม่ได้ทำอะไรบางอย่างคุณต้องการให้คีย์สาธารณะและคีย์ส่วนตัว (ไฟล์ใบรับรองและไฟล์คีย์) แตกต่างกัน
Mark Berry

1
ส่วนmodulus' and the ของเลขชี้กำลังสาธารณะในคีย์และใบรับรองต้องตรงกัน ไม่ต้องสงสัยเลยว่าไฟล์ต่างกัน คีย์ถูกสร้างขึ้นสำหรับใบรับรองเฉพาะหนึ่งรายการ
dev0z

ความผิดฉันเอง. ฉันคิดว่าเขาอ้างถึง MD5 ของไฟล์ ฉันเห็นแล้วว่าใบรับรองมีฟังก์ชันโมดูลัสแยกต่างหาก: จะยืนยันได้อย่างไรว่าโมดูลัสในคีย์ส่วนตัวของคุณตรงกับโมดูลัสในคีย์สาธารณะของใบรับรอง SSL / TLS ก่อนการติดตั้ง .
Mark Berry

173

เมื่อคุณตรวจสอบแล้วว่าไม่ตรงกันคุณก็ยังมีปัญหาอยู่ - จะทำอย่างไรกับมัน บ่อยครั้งใบรับรองอาจประกอบไม่ถูกต้องเท่านั้น เมื่อ CA เซ็นชื่อใบรับรองของคุณพวกเขาจะส่งบล็อกที่มีลักษณะคล้ายกับคุณ

-----BEGIN CERTIFICATE-----
MIIAA-and-a-buncha-nonsense-that-is-your-certificate
-and-a-buncha-nonsense-that-is-your-certificate-and-
a-buncha-nonsense-that-is-your-certificate-and-a-bun
cha-nonsense-that-is-your-certificate-and-a-buncha-n
onsense-that-is-your-certificate-AA+
-----END CERTIFICATE-----

พวกเขาจะส่งชุดรวม (มักจะเป็นใบรับรองสองใบ) ซึ่งแสดงถึงอำนาจในการให้ใบรับรองแก่คุณ จะมีลักษณะดังนี้

-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-your-request
-this-is-the-certificate-that-signed-your-request-this
-is-the-certificate-that-signed-your-request-this-is-t
he-certificate-that-signed-your-request-this-is-the-ce
rtificate-that-signed-your-request-A
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-for-that-one
-this-is-the-certificate-that-signed-for-that-one-this
-is-the-certificate-that-signed-for-that-one-this-is-t
he-certificate-that-signed-for-that-one-this-is-the-ce
rtificate-that-signed-for-that-one-this-is-the-certifi
cate-that-signed-for-that-one-AA
-----END CERTIFICATE-----

ยกเว้นว่าน่าเสียดายที่จะไม่มีป้ายกำกับชัดเจน

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

คุณสามารถทดสอบเพื่อดูว่าใบรับรองคิดว่าหมายถึงอะไรโดยการเรียกใช้

openssl x509 -noout -text -in yourcert.cert

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

หากไม่ได้ผลคุณอาจต้องขอใบรับรองใหม่อีกครั้ง เมื่อฉันทำ CSR ฉันต้องการระบุอย่างชัดเจนว่าเซิร์ฟเวอร์มีไว้เพื่ออะไร (แทนที่จะเป็นแค่ ssl.key หรือ server.key) และทำสำเนาด้วยวันที่ในชื่อเช่น mydomain.20150306.key เป็นต้นด้วยวิธีนี้ คู่คีย์ส่วนตัวและคีย์สาธารณะไม่น่าจะปะปนกับชุดอื่น


1
สิ่งนี้แก้ไขให้ฉันใน Nginx!
ท.ท.

25
+1 ขนาดใหญ่สำหรับแสดงวิธีดูว่ามีอะไรอยู่ในห่วงโซ่ใบรับรอง
cbednarski

มีประโยชน์อย่างแน่นอนฉันใช้เวลาหนึ่งชั่วโมงในการพยายามทำความเข้าใจว่าเหตุใด nginx จึงปฏิเสธใบรับรองในขณะที่ฉันเห็นว่ามีข้อมูลอยู่
Jacopofar

3
ตกลงสิ่งนี้ใช้ได้กับฉันด้วยใบรับรอง Comodo และ Ngix เพียงแค่ผลักบล็อกใบรับรองสุดท้ายไปด้านบน ขอบคุณสำหรับคำอธิบายโดยละเอียดและข้อมูลเชิงลึกเกี่ยวกับปัญหานี้
Andy D

1
ช่วยให้ฉัน! คำตอบมีประโยชน์มาก! ขอบคุณมาก!
Oleg Klimenko

71
  1. ตรวจสอบให้แน่ใจว่าใบรับรองและคีย์ของคุณเป็นรูปแบบ PEM หากไม่เป็นเช่นนั้นให้แปลงโดยใช้คำสั่ง openssl
  2. ตรวจสอบแฮช MD5 ของคีย์สาธารณะเพื่อให้แน่ใจว่าตรงกับสิ่งที่อยู่ในคีย์ส่วนตัว

    openssl x509 -noout -modulus -in certificate.crt | openssl md5
    openssl rsa -noout -modulus -in privateKey.key | openssl md5
    

7
คำปรึกษาที่ดี ! ยังคงได้รับข้อผิดพลาดเดียวกันแม้ว่าแฮช md5 จะเหมือนกันสำหรับฉันก็ตาม ^^
Delphine

4
ขอขอบคุณที่รวมวิธีตรวจสอบแฮช ฉันพบว่าฉันมีข้อผิดพลาดในการวางสำเนาและไม่มีเส้นประเดียวตั้งแต่เริ่มต้น pem ของฉัน คุณเพิ่งช่วยฉันปวดหัวมาก ไชโย
Justin Fortier

38

ฉันมีปัญหานี้เนื่องจากฉันเพิ่มบันเดิลและใบรับรองผิดลำดับดังนั้นอาจช่วยคนอื่นได้

ก่อนหน้า (ซึ่งผิด):

cat ca_bundle.crt certificate.crt > bundle_chained.crt

หลังจาก (ซึ่งถูกต้อง)

cat certificate.crt ca_bundle.crt > bundle_chained.crt

และโปรดอย่าลืมอัปเดต conf ที่เหมาะสม (ssl_certificate ตอนนี้ต้องชี้ไปที่ chainined crt) เป็น

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     bundle_chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

จากnginx manpage :

หากใบรับรองเซิร์ฟเวอร์และบันเดิลเชื่อมต่อกันผิดลำดับ nginx จะไม่สามารถเริ่มทำงานได้และจะแสดงข้อความแสดงข้อผิดพลาด:

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)

3
นี่เป็นคำตอบที่ดีกว่าคำถามที่ยอมรับ
baldrs

10

หากเกิดเหตุการณ์นี้และคุณใช้ Let 's เข้ารหัส / certbot เหตุผลที่มีแนวโน้มมากที่สุดที่คุณใช้แทนchain.pemfullchain.pem

ควรเป็นดังนี้:

ssl_certificate /etc/certbot/live/example.com/fullchain.pem;
ssl_certificate_key /etc/certbot/live/example.com/privkey.pem;

ดูเอกสาร certbot“ ใบรับรองของฉันอยู่ที่ไหน”


หรือลำดับของใบรับรองในบันเดิลไม่ถูกต้อง: อันดับแรกให้ทำการเข้ารหัสจากนั้นใบรับรองของตัวเอง
ingopingo

6

ฉันมีปัญหาเดียวกันและในที่สุดก็แก้ไขได้โดยเปลี่ยนลำดับของบล็อก pem ในไฟล์ใบรับรอง

บล็อกใบรับรองควรอยู่ที่จุดเริ่มต้นของไฟล์จากนั้นบล็อกกลางจากนั้นบล็อกรูท

ฉันตระหนักถึงปัญหานี้โดยการเปรียบเทียบไฟล์ใบรับรองที่มีปัญหากับไฟล์ใบรับรองการทำงาน


1

5 เซนต์ของฉันเกี่ยวกับปัญหา:

ฉันมีปัญหาเดียวกัน หลังจากนั้นประมาณ 1 ชั่วโมงฉันพบว่าฉันวางใบรับรองไม่ถูกต้อง

หากคุณมีข้อผิดพลาดเช่นนี้โปรดตรวจสอบใบรับรองของคุณ


1

ในกรณีของฉันฉันต้องการเปลี่ยนใบรับรอง SSL เนื่องจากฉันเปลี่ยนเซิร์ฟเวอร์ของฉันดังนั้นฉันจึงต้องสร้าง CSR ใหม่ด้วยคำสั่งนี้:

 openssl req -new -newkey rsa:2048 -nodes -keyout mysite.key -out mysite.csr

ฉันได้ส่งไฟล์ mysite.csr ไปยังผู้ให้บริการ SSL ของ บริษัท และหลังจากที่ฉันได้รับใบรับรอง crt จากนั้นฉันได้รีสตาร์ท nginx และฉันได้รับข้อผิดพลาดนี้

 (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)

หลังจากการตรวจสอบหลายครั้งข้อผิดพลาดคือโมดูลจากไฟล์คีย์ไม่เหมือนกันกับโมดูลจากไฟล์ crt

ดังนั้นเพื่อให้มันใช้งานได้ฉันได้สร้างไฟล์ csr ใหม่ แต่ฉันต้องเปลี่ยนชื่อไฟล์ด้วยคำสั่งนี้

 openssl req -new -newkey rsa:2048 -nodes -keyout mysite_new.key -out mysite_new.csr

จากนั้นฉันได้รับไฟล์ crt ใหม่จากผู้ให้บริการของ บริษัท รีสตาร์ท nginx และใช้งานได้


0

นอกจากนี้ยังสามารถเกิดขึ้นได้เมื่อ CA ของคุณออกใบรับรองระดับกลาง

ฉันพบปัญหานี้ (สองครั้ง) กับ nginx และไม่มีวิธีแก้ไขใด ๆ ในโพสต์นี้ที่อธิบายปัญหา บล็อกโพสต์ที่นี่โดยสุภาพบุรุษผู้แสนดีชื่อมาร์โคได้ตอกไว้และฉันกำลังวางมันไว้ที่นี่สำหรับใครก็ตามที่พบเจอกับสิ่งที่ฉันเห็นhttps://medium.com/@mrkdsgn/steps-to-install-a-go-daddy-ssl-certificate-on-nginx-on-ubuntu-14-04-ff942b9fd7ff

ในกรณีของฉัน go-daddy เป็น CA และนี่เป็นข้อมูลเฉพาะสำหรับวิธีที่พวกเขาออกใบรับรองและชุดใบรับรองระดับกลาง

นี่คือข้อความที่ตัดตอนมาจากบล็อกโพสต์ของ Marco

ด้วย Nginx หาก CA ของคุณมีใบรับรองระดับกลางคุณต้องสร้างไฟล์ใบรับรองแบบโซ่เดียวที่มีใบรับรองของคุณและใบรับรองระดับกลางของ CA

คุณสามารถใช้คำสั่งนี้เพื่อสร้างไฟล์รวมชื่อ example.com.chained.crt:

cat example.com.crt intermediate.crt > example.com.chained.crt


0

กรณีของฉันปัญหาคือฉันสร้างใบรับรองโดยไม่ต้องป้อนข้อมูลใด ๆ ในอินเทอร์เฟซ cli เมื่อฉันสร้างเครโทสใหม่และรุกทุกฟิลด์: เมืองรัฐและอื่น ๆ ทั้งหมดก็เรียบร้อยดี

 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

0

มันเกิดขึ้นกับฉันเมื่อฉันรวม bundle.crt และใบรับรองหลัก สาเหตุคือฉันคัดลอกใบรับรองหลักด้านล่าง bundle.crt มันควรจะเป็นวิธีอื่น ๆ

1 / ใบรับรองหลัก 2 / bundle.crt


0

สำหรับ Nginx:

  1. openssl req -newkey rsa:2048 -nodes -keyout domain.com.key -out domain.com.csr

  2. ไฟล์ SSL domain_com.crtและไฟล์แล้วคัดลอกไฟล์ใหม่ในการวางdomain_com.ca-bundledomain.com.chained.crt

3: เพิ่มไฟล์ nginx:

  1. ssl_certificate /home/user/domain_ssl/domain.com.chained.crt;
  2. ssl_certificate_key /home/user/domain_ssl/domain.com.key;

รีสตาร์ท Nginx


0

SL_CTX_use_PrivateKey ("/ etc / nginx / ssl / file") ล้มเหลว (SSL: ข้อผิดพลาด: 0B080074: x509 รูทีนใบรับรอง: X509_check_private_key: ค่าคีย์ไม่ตรงกัน)

ข้อผิดพลาดนี้อาจเกิดขึ้นได้เมื่อคีย์ส่วนตัวของใบรับรอง ( ssl_certificate_keyเช่น.keyหรือ.pemไฟล์) ไม่ตรงกับไฟล์ใบรับรองสาธารณะ ( ssl_certificate) ในการกำหนดค่า Nginx ของคุณ (ตรวจสอบnginx.confหรือในsites-enabled/) ตรวจสอบว่าไฟล์ทั้งสองตรงกัน

ตรวจสอบบันทึกข้อผิดพลาด Nginx สำหรับรายละเอียดเพิ่มเติม (เช่น/var/log/nginx/error.log)


0

ในกรณีของฉันฉันต้องเชื่อมต่อใบรับรองของโดเมนของฉัน

cat myDomain.crt EntityCertCA.crt TrustedRoot.crt > bundle.crt

และในไฟล์ config /etc/nginx/nginx.conf

 ssl_certificate "/etc/pki/nginx/bundle.crt";

เริ่มบริการใหม่และตกลงทั้งหมด

systemctl restart nginx.service

ที่มาขั้นตอนที่ 2: https://www.namecheap.com/support/knowledgebase/article.aspx/9781/2238/nginx-ssl-error0b080074x509-certificate-routines-x509checkprivatekeykey-values-mismatch

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