Ya, Anda dapat memiliki permintaan proxy nginx ke server HTTP, dan kemudian itu sendiri menanggapi klien melalui HTTPS. Saat melakukan ini, Anda akan ingin memastikan bahwa koneksi proxy nginx <-> tidak mungkin terendus oleh siapa pun yang diharapkan sebagai penyerang Anda. Pendekatan yang cukup aman mungkin termasuk:
- proksi ke host yang sama (seperti yang Anda lakukan)
- proksi ke host lain di belakang firewall Anda
Proksi ke host lain di Internet publik sepertinya tidak cukup aman.
Berikut adalah petunjuk untuk mendapatkan sertifikat Let's Encrypt menggunakan server web yang sama yang Anda gunakan sebagai proxy.
Meminta sertifikat awal Anda dari Let's Encrypt
Ubah server
klausa Anda untuk memungkinkan subdirektori .well-known
dilayani dari direktori lokal, misalnya:
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
Di sinilah server Let's Encrypt akan mencari jawaban atas tantangan yang dikeluarkannya.
Anda kemudian dapat menggunakan klien certbot untuk meminta sertifikat dari Let's Encrypt menggunakan plugin webroot (sebagai root):
certbot certonly --webroot -w /var/www/sub.domain.com/ -d sub.domain.com -d www.sub.domain.com
Kunci, sertifikat, dan rantai sertifikat Anda sekarang akan dipasang di /etc/letsencrypt/live/sub.domain.com/
Mengkonfigurasi nginx untuk menggunakan sertifikat Anda
Pertama buat klausa server baru seperti ini:
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
[…]
}
}
Muat ulang nginx:
service nginx reload
Verifikasi bahwa HTTPS sekarang berfungsi dengan mengunjungi https://sub.domain.com
dan https://www.sub.domain.com
di peramban Anda (dan peramban lain yang secara spesifik ingin Anda dukung) dan memeriksa bahwa mereka tidak melaporkan kesalahan sertifikat.
Direkomendasikan: juga tinjau raymii.org: Keamanan SSL yang kuat pada nginx
dan uji konfigurasi Anda di Labs SSL .
(Disarankan) Redirect permintaan HTTP ke HTTPS
Setelah Anda mengonfirmasi bahwa situs Anda berfungsi dengan https://
versi URL, alih-alih beberapa pengguna menyajikan konten tidak aman karena mereka pergi http://sub.domain.com
, arahkan mereka ke versi situs HTTPS.
Ganti seluruh server
klausa port 80 Anda dengan:
server {
listen 80;
server_name sub.domain.com www.sub.domain.com;
rewrite ^ https://$host$request_uri? permanent;
}
Anda juga harus menghapus tanda komentar pada baris ini di konfigurasi port 443, sehingga browser ingat untuk tidak mencoba versi HTTP situs ini:
add_header Strict-Transport-Security "max-age=31536000";
Perpanjang sertifikat Anda secara otomatis
Anda dapat menggunakan perintah ini (sebagai root) untuk memperbarui semua sertifikat yang dikenal dengan certbot dan memuat ulang nginx menggunakan sertifikat baru (yang akan memiliki jalur yang sama dengan sertifikat yang ada):
certbot renew --renew-hook "service nginx reload"
certbot hanya akan mencoba untuk memperbarui sertifikat yang berumur lebih dari 60 hari, jadi aman (dan disarankan!) untuk menjalankan perintah ini dengan sangat teratur , dan secara otomatis jika memungkinkan. Misalnya, Anda bisa memasukkan perintah berikut /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"
Anda dapat menguji pembaruan dengan menjalankan-kering, yang akan menghubungi server staging Let's Encrypt untuk melakukan tes nyata menghubungi domain Anda, tetapi tidak akan menyimpan sertifikat yang dihasilkan:
certbot --dry-run renew
Atau Anda dapat memaksa pembaruan awal dengan:
certbot renew --force-renew --renew-hook "service nginx reload"
Catatan: Anda dapat mengeringkan lari sesering yang Anda inginkan, tetapi pembaruan nyata tunduk pada batas tingkat Mari Enkripsi .