ฉันจำเป็นต้องแปลง. CER เป็น. CRT สำหรับใบรับรอง Apache SSL หรือไม่ ถ้าเป็นอย่างไร


121

ฉันต้องการตั้งค่าเซิร์ฟเวอร์ Apache 2 ด้วย SSL

ฉันมีไฟล์ * .key ของฉัน แต่เอกสารทั้งหมดที่ฉันพบทางออนไลน์มีการระบุไฟล์ * .crt และ CA ของฉันให้ไฟล์ * .cer แก่ฉันเท่านั้น

ไฟล์ * .cer เหมือนกับ * .crt หรือไม่ ถ้าไม่ฉันจะแปลงรูปแบบ CER เป็น CRT ได้อย่างไร


11
CERและCRTส่วนขยายไม่มีความหมายอะไรเลย ผู้ให้บริการ PKI ต่างใช้ส่วนขยายที่แตกต่างกันสำหรับสิ่งเดียวกัน หากไฟล์เป็นไบนารีแสดงว่าอาจมีการเข้ารหัส ASN.1 / DER หากไฟล์นั้นมนุษย์สามารถอ่านได้โดยมี-----BEGIN CERTIFICATE-----การเข้ารหัส PEM คุณมีอะไร (DER หรือ PEM) และคุณต้องการอะไร (DER หรือ PEM)?
jww

คำตอบ:


107

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

แต่วิธีที่ Windows จัดการกับพวกเขาเมื่อคุณดับเบิลคลิกนั้นเป็นเพียงความแตกต่างระหว่างสอง ส่วนขยายทั้งสองแสดงให้เห็นว่ามีใบรับรองสาธารณะ คุณสามารถเปลี่ยนชื่อไฟล์ใบรับรองเพื่อใช้ส่วนขยายหนึ่งแทนอีกไฟล์ในระบบหรือไฟล์การกำหนดค่าที่ฉันเคยเห็น และบนแพลตฟอร์มที่ไม่ใช่ Windows (และแม้แต่ใน Windows) ผู้คนมักไม่ค่อยระมัดระวังเป็นพิเศษว่าพวกเขาใช้ส่วนขยายใดและปฏิบัติต่อทั้งสองอย่างแทนกันเนื่องจากไม่มีความแตกต่างกันตราบใดที่เนื้อหาของไฟล์นั้นถูกต้อง

สิ่งที่ทำให้สับสนมากขึ้นคือการจัดเก็บข้อมูลใบรับรองในไฟล์มีสองวิธีมาตรฐานวิธีหนึ่งคือการเข้ารหัส X.509 แบบ "ไบนารี" และอีกวิธีหนึ่งคือการเข้ารหัส base64 แบบ "ข้อความ" ที่มักขึ้นต้นด้วย " -----BEGIN CERTIFICATE-----" สิ่งเหล่านี้เข้ารหัสข้อมูลเดียวกัน แต่แตกต่างกัน ระบบส่วนใหญ่ยอมรับทั้งสองรูปแบบ แต่ถ้าคุณต้องการคุณสามารถแปลงรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่งผ่าน openssl หรือเครื่องมืออื่น ๆ การเข้ารหัสภายในไฟล์ใบรับรองไม่ขึ้นกับนามสกุลที่ใครให้ไฟล์


ความเข้าใจของฉันคือมันเป็นการเข้ารหัส X.509 ทั้งคู่ คุณไม่ได้พูดอย่างอื่น แต่การใช้ x.509 แบบไม่สมมาตรด้านบนอาจแนะนำเป็นอย่างอื่นให้กับผู้อ่าน สำหรับผู้อ่านเป็นที่น่าสังเกตว่าใบรับรองสามารถแปลงกลับไปกลับมาระหว่างการเข้ารหัส 2 รายการนี้ได้เนื่องจากตามที่คำตอบนี้กล่าวถึงพวกเขาจะมีข้อมูลเดียวกัน ดูคำตอบอื่น ๆ ด้วยคำสั่ง openssl x509 -inform
FreeText

55

ตามเอกสารmod_ssl :

SSLCertificateFile: 
   Name: SSLCertificateFile
   Description: Server PEM-encoded X.509 certificate file

ไฟล์ใบรับรองควรเป็นไฟล์ใบรับรอง X.509 ที่เข้ารหัส PEM:

openssl x509 -inform DER -in certificate.cer -out certificate.pem

วิธีนี้จะแก้ข้อผิดพลาดของใบรับรอง ssl เมื่ออยู่เบื้องหลังzscalerรันvagrantบนwin( vbox homestead) โดยการติดตั้งใบรับรองรูทที่เชื่อถือได้ของเราลงในกล่องคนจรจัด ฉันscp'วันที่พวกเขานำมาใช้ในการแปลงของคุณและ symlinked พวกเขาลง/etc/ssl/certsและยังคัดลอกเนื้อหาลงในca-certificates.crtไฟล์ก่อน reprovisioning และยังคง im รับgoogle-recaptcha tls sslข้อผิดพลาดในfile_get_contentsกล่องนักพัฒนาซอฟต์แวร์
ตำหนิ

54

โดยทั่วไปมีการเข้ารหัสใบรับรอง CER สองประเภทคือ DER และ Base64 เมื่อประเภท DER ส่งกลับข้อผิดพลาดในการโหลดใบรับรอง (รูทีนการเข้ารหัส asn1) ให้ลองใช้ PEM และจะใช้งานได้

openssl x509 -inform DER -in certificate.cer -out certificate.crt

openssl x509 -inform PEM -in certificate.cer -out certificate.crt


3
รูปแบบ DER ใช้ได้ผลสำหรับฉันเมื่อไฟล์ cer ของฉันดูเหมือนไบนารีเมื่อฉันพยายามแก้ไข ... ขอบคุณ!
Brad Parks

1
สำหรับผู้อ่านฉันพบว่าหน้าชายของ openssl มีประโยชน์ ฉันคลุมเครือสำหรับฉันว่าคำสั่งใดทำอะไร (เช่นการแปลงเป็นวิธีใด) พารามิเตอร์ -inform ระบุรูปแบบของไฟล์อินพุต -in ซึ่งใช้งานง่าย แต่ถ้าคุณสับสนนิดหน่อยก็ยินดีที่จะทราบอย่างชัดเจน ดูopenssl.org/docs/manmaster/man1/openssl-x509.html
FreeText

32

ฉันคิดว่าคุณมีไฟล์. cer ที่มีข้อมูลใบรับรองที่เข้ารหัส PKCS # 7 และคุณต้องการแปลงเป็นข้อมูลใบรับรองที่เข้ารหัส PEM (โดยทั่วไปจะเป็นไฟล์. crt หรือ. pem) ตัวอย่างเช่นไฟล์. cer ที่มีข้อมูลเข้ารหัส PKCS # 7 มีลักษณะดังนี้:

----- เริ่มต้น PKCS7 -----
MIIW4gYJKoZIhvcNAQcCoIIW0zCCFs8CAQExADALBgkqhkiG9w0BBwGggha1MIIH
...
POI9n9cd2cNgQ4xYDiKWL2KjLB + 6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G
+ bKhADEA
----- จบ PKCS7 -----

ข้อมูลใบรับรอง PEM มีลักษณะดังนี้:

----- เริ่มต้นการรับรอง -----
MIIHNjCCBh6gAwIBAgIQAlBxtqKazsxUSR9QdWWxaDANBgkqhkiG9w0BAQUFADBm
...
nv72c / OV4nlyrvBLPoaS5JFUJvFUG8RfAEY =
----- สิ้นสุดการรับรอง -----

มีคำสั่ง OpenSSL ที่จะแปลงไฟล์. cer (พร้อมข้อมูล PKCS # 7) เป็นข้อมูล PEM ที่คุณอาจคาดหวังว่าจะพบ ( BEGIN CERTIFICATEบล็อกในตัวอย่างด้านบน) คุณสามารถบังคับข้อมูล PKCS # 7 ให้เป็นรูปแบบ PEM โดยคำสั่งนี้ในไฟล์ที่เราเรียกว่า certfile.cer:

openssl pkcs7 -text -in certfile.cer -print_certs -outform PEM -out certfile.pem

โปรดทราบว่าไฟล์. cer หรือ. pem อาจมีใบรับรองตั้งแต่หนึ่งรายการขึ้นไป (อาจเป็นห่วงโซ่ใบรับรองทั้งหมด)


1
จะเป็นประโยชน์ถ้าคุณมีแหล่งที่มาของสมมติฐานนี้ ฉันคิดว่าผู้คนใช้ (อาจไม่ถูกต้อง) .cer, .crt, .pem แทนกันได้) ดังนั้นการมีแหล่งที่มาของความจริงจะช่วยแก้ไขความเข้าใจผิดได้
PhilT

30

CERคือใบรับรอง X.509 ในรูปแบบไบนารีซึ่งเข้ารหัสDER
CRTคือใบรับรองไบนารี X.509 ที่ห่อหุ้มด้วยการเข้ารหัสข้อความ ( ฐาน -64 )

ไม่ใช่การเข้ารหัสแบบเดียวกัน


13
คำตอบนี้ผิดเพียง ทั้ง. CER และ. CRT สามารถใช้การเข้ารหัส DER หรือ PEM (ข้อความ) ได้ นามสกุล. pem และ. dder สะท้อนการเข้ารหัส, .cer และ. crt ไม่ รายละเอียดเพิ่มเติม .
eis

1
จริงๆแล้วมันควรจะตรงกันข้าม แต่ส่วนขยายทั้งหมดเหล่านี้สับสนมาเป็นเวลานานดังนั้นคุณไม่ควรพึ่งพาส่วนขยายเหล่านี้
Claudio Floreani

16

คำตอบสำหรับคำถามวิธีแปลงไฟล์. cer เป็นไฟล์. crt (เข้ารหัสต่างกัน!) คือ:

openssl pkcs7 -print_certs -in certificate.cer -out certificate.crt

5
สิ่งนี้ไม่ได้ผลสำหรับฉัน! ฉันใช้:openssl x509 -inform der -in certificate.cer -out certificate.pem
sj59

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:unable to load PKCS7 object
friederbluemle

@friederbluemle ลองดูคำตอบนี้หรือยัง serverfault.com/questions/417140/…
Alexander Presber

นี่คือสิ่งที่ฉันต้องทำเพื่อให้ได้ใบรับรอง positiveSSL ของฉันพร้อมที่จะแปลงเป็น PKCS12 เพื่อใช้ใน Azure
Owen

16

ฉันใช้คำสั่ง:

openssl x509 -inform PEM -in certificate.cer -out certificate.crt

แต่ CER เป็นใบรับรอง X.509 ในรูปแบบไบนารีซึ่งเข้ารหัส DER CRT คือใบรับรองไบนารี X.509 ที่ห่อหุ้มด้วยการเข้ารหัสข้อความ (ฐาน -64)

ด้วยเหตุนี้คุณจึงควรใช้:

openssl x509 -inform DER -in certificate.cer -out certificate.crt

จากนั้นนำเข้าใบรับรองของคุณ:

คัดลอก CA ของคุณไปยัง dir:

/usr/local/share/ca-certificates/

ใช้คำสั่ง:

sudo cp foo.crt /usr/local/share/ca-certificates/foo.crt

อัปเดตร้าน CA:

sudo update-ca-certificates



3

ไฟล์. cer และ. crt ควรเปลี่ยนกันได้เท่าที่นำเข้าในที่เก็บคีย์

ดูเนื้อหาของไฟล์. cer ลบอะไรก่อน-----BEGIN CERTIFICATE-----บรรทัดและหลัง-----END CERTIFICATE-----บรรทัด คุณจะเหลือบรรทัด BEGIN / END ที่มีสิ่งที่เข้ารหัส Base64 อยู่ระหว่างพวกเขา

-----BEGIN CERTIFICATE-----
MIIDQTCCAqqgAwIBAgIJALQea21f1bVjMA0GCSqGSIb3DQEBBQUAMIG1MQswCQYD
...
pfDACIDHTrwCk5OefMwArfEkSBo/
-----END CERTIFICATE-----

จากนั้นนำเข้าสู่ไฟล์คีย์ของคุณโดยใช้ keytool

keytool -import -alias myalias -keystore my.keystore -trustcacerts -file mycert.cer

สิ่งที่ช่วยฉันคือความคิดเห็นของคุณเกี่ยวกับ BASE-64 ENCODING เห็นได้ชัดว่าใบรับรองปกติเป็นการเข้ารหัสพิเศษและไม่สามารถอ่านข้อความธรรมดาได้ ขอบคุณ
DRapp

-2

แค่ทำ

openssl x509 -req -days 365 -in server.cer -signkey server.key -out server.crt

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