ใช่คุณสามารถมีคำขอพร็อกซี nginx ไปยังเซิร์ฟเวอร์ HTTP จากนั้นตอบสนองต่อลูกค้าผ่าน HTTPS เมื่อทำสิ่งนี้คุณจะต้องแน่ใจว่าการเชื่อมต่อพร็อกซี nginx <-> ไม่น่าจะถูกดมกลิ่นโดยใครก็ตามที่เป็นผู้โจมตีที่คุณคาดหวัง วิธีที่ปลอดภัยเพียงพออาจรวมถึง:
- พร็อกซี่ไปยังโฮสต์เดียวกัน (เช่นคุณ)
- พร็อกซี่ไปยังโฮสต์อื่น ๆ ที่อยู่เบื้องหลังไฟร์วอลล์ของคุณ
การส่งต่อไปยังโฮสต์อื่นบนอินเทอร์เน็ตสาธารณะนั้นไม่น่าปลอดภัยพอ
นี่คือคำแนะนำในการรับใบรับรอง Let's Encrypt โดยใช้เว็บเซิร์ฟเวอร์เดียวกับที่คุณใช้เป็นพร็อกซี
การขอใบรับรองเริ่มต้นจาก Let's Encrypt
แก้ไขserver
อนุประโยคของคุณเพื่ออนุญาตให้ไดเรกทอรีย่อย.well-known
ให้บริการจากไดเรกทอรีท้องถิ่นเช่น:
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
[…]
location /.well-known {
alias /var/www/sub.domain.com/.well-known;
}
location / {
# proxy commands go here
[…]
}
}
http://sub.domain.com/.well-known
เป็นที่ที่เซิร์ฟเวอร์ Let's Encrypt จะค้นหาคำตอบสำหรับความท้าทายที่เกิดขึ้น
จากนั้นคุณสามารถใช้ไคลเอนต์certbotเพื่อขอใบรับรองจาก Let's Encrypt โดยใช้ปลั๊กอินwebroot (เป็น root):
certbot certonly --webroot -w /var/www/sub.domain.com/ -d sub.domain.com -d www.sub.domain.com
ตอนนี้คีย์ใบรับรองและสายใบรับรองของคุณจะได้รับการติดตั้งแล้ว /etc/letsencrypt/live/sub.domain.com/
การกำหนดค่า nginx เพื่อใช้ใบรับรองของคุณ
ขั้นแรกให้สร้างเซิร์ฟเวอร์ใหม่ข้อดังนี้:
server {
listen 443 ssl;
# if you wish, you can use the below line for listen instead
# which enables HTTP/2
# requires nginx version >= 1.9.5
# listen 443 ssl http2;
server_name sub.domain.com www.sub.domain.com;
ssl_certificate /etc/letsencrypt/live/sub.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub.domain.com/privkey.pem;
# Turn on OCSP stapling as recommended at
# https://community.letsencrypt.org/t/integration-guide/13123
# requires nginx version >= 1.3.7
ssl_stapling on;
ssl_stapling_verify on;
# Uncomment this line only after testing in browsers,
# as it commits you to continuing to serve your site over HTTPS
# in future
# add_header Strict-Transport-Security "max-age=31536000";
access_log /var/log/nginx/sub.log combined;
# maintain the .well-known directory alias for renewals
location /.well-known {
alias /var/www/sub.domain.com/.well-known;
}
location / {
# proxy commands go here as in your port 80 configuration
[…]
}
}
โหลดซ้ำ nginx:
service nginx reload
ตรวจสอบว่าตอนนี้ HTTPS ทำงานได้โดยไปที่https://sub.domain.com
และhttps://www.sub.domain.com
ในเบราว์เซอร์ของคุณ (และเบราว์เซอร์อื่น ๆ ที่คุณต้องการให้การสนับสนุนเป็นพิเศษ) และตรวจสอบว่าพวกเขาไม่รายงานข้อผิดพลาดของใบรับรอง
แนะนำ: นอกจากนี้ยังตรวจสอบraymii.org: แข็งแกร่งรักษาความปลอดภัย SSL บน Nginx
และทดสอบการตั้งค่าของคุณในSSL Labs
(แนะนำ) เปลี่ยนเส้นทางคำขอ HTTP ไปยัง HTTPS
เมื่อคุณยืนยันว่าเว็บไซต์ของคุณทำงานกับhttps://
เวอร์ชันของ URL ได้แทนที่จะให้ผู้ใช้บางรายแสดงเนื้อหาที่ไม่ปลอดภัยเพราะไปแล้วให้http://sub.domain.com
เปลี่ยนเส้นทางไปยังเว็บไซต์รุ่น HTTPS
แทนที่ 80 พอร์ตทั้งหมดของคุณserver
ด้วย:
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
rewrite ^ https://$host$request_uri? permanent;
}
ตอนนี้คุณควรยกเลิกการใส่เครื่องหมายบรรทัดนี้ในการกำหนดค่าพอร์ต 443 เพื่อให้เบราว์เซอร์จำไม่ได้ว่าจะลองใช้เว็บไซต์ HTTP เวอร์ชัน:
add_header Strict-Transport-Security "max-age=31536000";
ต่ออายุใบรับรองของคุณโดยอัตโนมัติ
คุณสามารถใช้คำสั่งนี้ (เป็น root) เพื่อต่ออายุใบรับรองทั้งหมดที่รู้จักกับ certbot และโหลด nginx โดยใช้ใบรับรองใหม่ (ซึ่งจะมีเส้นทางเดียวกันกับใบรับรองที่มีอยู่ของคุณ):
certbot renew --renew-hook "service nginx reload"
certbot จะพยายามต่ออายุใบรับรองที่มีอายุมากกว่า 60 วันเท่านั้นดังนั้นจึงปลอดภัย (และแนะนำ!) ให้เรียกใช้คำสั่งนี้เป็นประจำอย่างสม่ำเสมอและโดยอัตโนมัติหากเป็นไปได้ทั้งหมด เช่นคุณสามารถใส่คำสั่งต่อไปนี้ใน/etc/crontab
:
# at 4:47am/pm, renew all Let's Encrypt certificates over 60 days old
47 4,16 * * * root certbot renew --quiet --renew-hook "service nginx reload"
คุณสามารถทดสอบการต่ออายุด้วยการรันแบบแห้งซึ่งจะติดต่อ Let's Encrypt staging เซิร์ฟเวอร์เพื่อทำการทดสอบการติดต่อโดเมนของคุณ แต่จะไม่เก็บใบรับรองผลลัพธ์:
certbot --dry-run renew
หรือคุณสามารถบังคับให้ต่ออายุก่อนกำหนดได้ด้วย:
certbot renew --force-renew --renew-hook "service nginx reload"
หมายเหตุ: คุณสามารถแห้งวิ่งหลายครั้งตามที่คุณต้องการ แต่การต่ออายุจริงอาจมีการLet 's เข้ารหัสขีด จำกัด ของอัตรา