ตำแหน่งที่ดีที่สุดสำหรับใบรับรอง SSL และกุญแจส่วนตัวบน Ubuntu


62

บน Ubuntu ดูเหมือนว่าจะเป็นสถานที่ที่ดีที่สุดสำหรับไพรเวตคีย์ที่ใช้ในการลงนามใบรับรอง (สำหรับใช้โดย nginx) /etc/ssl/private/

คำตอบนี้เสริมว่าใบรับรองควรเข้าไป/etc/ssl/certs/แต่ดูเหมือนจะเป็นสถานที่ที่ไม่ปลอดภัย ทำ.crtไฟล์จะต้องมีการเก็บไว้ที่ปลอดภัยหรือว่าพวกเขาถือว่าสาธารณะ?


19
คุณสามารถติด.crtป้ายประกาศของ Times Square ได้หากต้องการ
ceejayoz

คำตอบ:


48

ไฟล์. crt จะถูกส่งไปยังทุกสิ่งที่เชื่อมต่อ มันเป็นสาธารณะ ( chown root:rootและchmod 644)

ในการเพิ่มไปยังตำแหน่งคีย์ส่วนตัว ตรวจสอบให้แน่ใจว่าคุณได้รักษาความปลอดภัยไว้อย่างถูกต้อง ( chown root:ssl-certและchmod 640)


ฉันสงสัยว่าทำไมไดเรกทอรีนั้นไม่ใช่ g + s โดยค่าเริ่มต้น
Collin Anderson

2
ไม่จำเป็นต้องเป็น ไดเรกทอรีคือ 0750 ดังนั้นจึงไม่มีวิธีใดสำหรับผู้ใช้ที่ไม่ได้อยู่ในกลุ่มเพื่อเข้าไปในไดเรกทอรีเพื่ออ่านไฟล์
womble

2
ดูเหมือนว่า ssl-cert เป็นชื่อกลุ่มที่ไม่ถูกต้องบน ubuntu บางทีมันควรจะเป็นสิ่งที่ดีที่สุด: รูทแทน
Atifm

1
@Atifm กลุ่มใบรับรอง ssl-cert ถูกนำมาใช้กับ 16.04 หรือ 18.04 ฉันจำไม่ได้ว่าอันไหน
DylanYoung

1
@DylanYoung: มันมีอยู่ใน Ubuntu 12.04 แน่นอนและฉันเชื่อว่ามันถูกสร้างขึ้นโดยแพคเกจที่ssl-certเคยใช้บางทีเหนือสิ่งอื่นใดสร้างใบรับรอง snakeoil ที่เซ็นชื่อด้วยตนเอง
MestreLion

35

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

/etc/sslเพื่อขยายคำตอบที่ฉันไม่ได้ใช้ตำแหน่งเริ่มต้น
มันง่ายกว่าสำหรับฉันที่จะเก็บระเบิดทั้งหมดไว้ในพื้นที่แยกต่างหากเนื่องจากการสำรองข้อมูล + เหตุผลอื่น ๆ

สำหรับ Apache SSL, ฉันให้เหมืองใน/etc/apache2/ssl/privateหรือคล้ายกันพื้นที่ "ราก" /etc/ใน

ตัวอย่างการตั้งค่า

โพสต์นี้มุ่งสู่ Ubuntu (Debian) + Apache แต่ควรทำงานกับระบบส่วนใหญ่ -
เพียงใช้การอนุญาตและอัปเดตตำแหน่ง / เส้นทางในการกำหนดค่าที่กำหนด (apache / nginx / etc)
หากไฟล์คีย์ SSL ได้รับการปกป้องอย่างถูกต้อง (ไดเรกทอรี & ไฟล์) คุณจะถูกต้อง หมายเหตุบันทึก!

สร้างไดเรกทอรี:

sudo mkdir /etc/apache2/ssl
sudo mkdir /etc/apache2/ssl/private
sudo chmod 755 /etc/apache2/ssl
sudo chmod 710 /etc/apache2/ssl/private

หมายเหตุ:
chmod 710รองรับssl-certกลุ่มภายใต้ Ubuntu
(ดูความคิดเห็น)
การตั้งค่าการอนุญาตเป็น700เปิด/etc/apache2/ssl/privateจะทำงานได้ดี

วางไฟล์ SSL:

ใส่ใบรับรอง www ssl สาธารณะพร้อมกับใบรับรองกลางใน /etc/apache2/ssl
ใส่รหัส ssl ส่วนตัวใน/etc/apache2/ssl/private

ตั้งเจ้าของ:

sudo chown -R root:root /etc/apache2/ssl/
sudo chown -R root:ssl-cert /etc/apache2/ssl/private/

หมายเหตุ:
หากคุณไม่มีกลุ่มใบรับรอง SSLให้ใช้ 'root: root' ที่บรรทัดด้านบนหรือข้ามบรรทัดที่ 2

ตั้งค่าการอนุญาต:

ใบรับรองสาธารณะ

sudo chmod 644 /etc/apache2/ssl/*.crt

รหัสส่วนตัว

sudo chmod 640 /etc/apache2/ssl/private/*.key

หมายเหตุ:
การอนุญาตกลุ่มถูกกำหนดเป็นอ่าน (640) เนื่องจากกลุ่ม ssl-cert ของ Ubuntu '600' ก็ใช้ได้เช่นกัน

เปิดใช้งานโมดูล Apache SSL

sudo a2enmod ssl

แก้ไขไฟล์ไซต์ Apache และเปิดใช้งาน

(ดูย่อหน้าสุดท้าย) *

sudo nano /etc/apache/sites-available/mysiteexample-ssl.conf
sudo a2ensite mysiteexample-ssl
#             ^^^^^^^^^^^^^^^^^ <-Substitute your ".conf" filename(s)

เริ่มบริการ Apache2 ใหม่

sudo service apache2 restart

หรือ

sudo systemctl restart apache2.service

เสร็จสิ้น ทดสอบไซต์ SSL ใหม่ของคุณ

* สิ่งนี้นอกเหนือไปจากคำถาม แต่คุณสามารถคัดลอกไฟล์การกำหนดค่าไซต์ Apache SSL เริ่มต้น ( sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/mysiteexample-ssl.conf) เป็นจุดเริ่มต้นที่ดี / ตัวอย่างของไดเรคทีฟ / ไดเรคทีฟ / ไดเร็กตอรี่ปกติที่ใช้ภายใต้ไฟล์ 'conf' Apache / SSL . โดยปกติแล้วจะชี้ไปที่ใบรับรอง SSL ที่ลงนามเอง + คีย์ (snakeoil), บันเดิล CA รวมถึงคำสั่งทั่วไปที่ใช้สำหรับไซต์ SSL ที่กำหนด

หลังจากการคัดลอกเพียงแก้ไขไฟล์. conf ใหม่และเพิ่ม / ลบ / อัปเดตตามต้องการด้วยข้อมูลใหม่ / พา ธ ด้านบนจากนั้นดำเนินการsudo a2ensite mysiteexample-sslเพื่อเปิดใช้งาน


ไม่แน่ใจว่าทำไมคุณแนะนำให้ตั้งค่า 710 สำหรับการอนุญาตสำหรับ / etc / apache2 / ssl / private การตั้งค่าบิตเรียกใช้งานสำหรับไดเรกทอรี (สำหรับกลุ่ม) โดยไม่ตั้งค่าบิตอ่านสำหรับไดเรกทอรี (สำหรับกลุ่ม) ไม่สมเหตุสมผลสำหรับฉัน คุณตั้งใจจะตั้งเป็น 750 หรือไม่?
chriv

@chriv ฉันเพิ่งตั้งค่าการอนุญาตตามวิธีที่ฉันเห็นมันตั้งค่าภายใต้พื้นที่ SSL เริ่มต้นของ Ubuntu ดู / etc / ssl / certs & / etc / ssl / private & ssl-certs ใช้กลุ่ม ดูstackoverflow.com/a/23408897/503621
bshea

1
คำอธิบายอย่างละเอียดและละเอียดมากสำหรับคำถามทั่วไปที่มีคำตอบที่เป็นไปได้มากมาย ขอขอบคุณ. เพียงเพิ่มสองสิ่ง<VirtualHost *:443>ส่วนของคุณในของคุณsites-available/mysite.confควรมีใบรับรองดังนี้:SSLEngine on SSLCertificateFile /etc/apache2/ssl/mysite.crt SSLCertificateKeyFile /etc/apache2/ssl/private/mysite.key
George Dimitriadis

BTW - นอกจากนี้ยังเป็นไปได้ที่จะรวมการกำหนดค่าของคุณ: 80 และ: 443 ไว้ในไฟล์ Apache ".conf" หนึ่งไฟล์ฉันจะเปลี่ยนเส้นทางการกดปุ่มอะไรก็ได้: 80 ที่: 443 / SSL ต่อไป นอกจากนี้ยังเป็นไปได้ที่จะนำการตั้งค่า SSL พื้นฐานในไฟล์. conf และสร้างไฟล์เพิ่มเติม 'รายละเอียด' การตั้งค่า SSL (เพื่อตั้งค่า ciphers ที่ใช้ / etc เป็นต้น) และรวมไว้ในไฟล์. config ทั้งหมดของคุณนอกพื้นที่เสมือน ฉันใช้การตั้งค่าเหล่านี้เพื่อ SSL แข็ง 'บิตและฉันรวมไว้ในแต่ละเว็บไซต์เสมือน. ฉันสามารถรับ A + ได้ที่SSL Labsในลักษณะนี้
bshea

10

คำตอบทั้งหมดที่นี่ดูเหมือนตกลง แต่ฉันต้องการพูดถึงสิ่งหนึ่งที่ฉันพบว่าเป็นปัญหา ... หากคุณต้องต่อใบรับรองของคุณกับตัวกลางหรือรากเพื่อสร้างไฟล์ลูกโซ่อย่าใส่มันลง/etc/ssl/certsไปเพราะเมื่อc_rehashมีการเรียกใช้อาจสร้างลิงก์แฮช symlink ให้กับ certs ของคุณได้เนื่องจากรากหรือตัวกลางอยู่ภายใน

จากนั้นไปตามถนนในภายหลังหากใบรับรองของคุณหมดอายุและคุณลบออกและไม่ทราบว่าจะเรียกใช้อีกครั้งc_rehashคุณอาจใช้แฮงค์ symlink ใน/etc/ssl/certsไดเรกทอรีของคุณและสิ่งแปลก ๆ เริ่มเกิดขึ้นเมื่อเครื่องท้องถิ่นพยายามเชื่อมต่อกับตัวเองผ่าน SSL และไม่พบรากที่จะตรวจสอบความถูกต้อง ตัวอย่างเช่นด้วย curl ฉันก็เริ่มได้รับ:

curl: (60) SSL certificate problem: unable to get issuer certificate

ไม่นานหลังจากที่ทำความสะอาดบาง .crt เก่าและตัดแบ่ง .pem /etc/ssl/certsไฟล์ที่ฉันมีใน

เก็บอย่างน้อยโซ่ของคุณที่อื่นหลีกเลี่ยงปัญหานี้ ฉันลงเอยด้วยการ/etc/ssl/local_certsถือ certs และโซ่ของฉันดังนั้นพวกเขาจะไม่หลงทางอยู่ในระเบียบของ certs CA ที่คุณจะพบเจอ/etc/ssl/certs


2

ไม่มีสถานที่ที่ไม่ปลอดภัยจริงๆหากการอนุญาตสำหรับแต่ละไฟล์ / ไดเรกทอรีถูกตั้งค่าเป็นสิ่งที่ต้องการchown root :0 private.keyและchmod 600 private.keyเพื่อให้มีเพียงรูทเท่านั้นที่สามารถอ่านได้ CSR และไฟล์ใบรับรองมีความอ่อนไหวน้อยกว่าที่คุณพูด

ด้วยสิทธิ์เหล่านั้นเส้นทางที่คุณพูดถึงและ / usr / local / ssl ควรจะดี


1
บ่อยครั้งที่แอปพลิเคชันที่เข้าถึงคีย์ส่วนตัวกำลังทำงานในฐานะผู้ใช้ที่ไม่ใช่รูท ฉันขอแนะนำให้รักษาการเข้าถึงสำหรับกลุ่ม ssl-cert
Shane Madden

1
เข้าใจ แต่เว็บเซิร์ฟเวอร์อย่าง Apache จะสร้างกระบวนการรูท 'parent' และสมมติว่า nginx ด้วย
Jonathan Ross

1

สถานที่ตั้งถูกต้อง:

  • /etc/ssl/certs/สำหรับ.crtไฟล์
  • /etc/ssl/privateสำหรับ.keyไฟล์

เจ้าของจะต้องเป็นroot:rootทั้งคู่ (ใช้sudo chmod root:root <file>เพื่อเปลี่ยนแปลงหากจำเป็น)

สิทธิ์ :

  • 644สำหรับ.crtไฟล์
  • 600สำหรับ.keyไฟล์

nginxนี้จะทำงาน

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