Daftar Isi
disclaimer (menurut komentar pada artikel sebelumnya)
Nama domain
The terakhir kali kami berakhir pada bahwa dalam wadah buruh pelabuhan meluncurkan web server nginx, mendistribusikan file index.html statis. Kali ini kami akan memperluas fungsionalitas web server dengan menambahkan enkripsi data dan pengalihan paksa dari http ke https.
Untuk melakukan ini, Anda perlu memecahkan masalah organisasi: faktanya adalah bahwa sertifikat enkripsi hanya dapat diperoleh untuk nama domain atau sekelompok nama. Untuk alasan ini, kami pergi ke salah satu pendaftar nama domain dan memilih nama yang cocok dengan merek (tujuan, slogan, dll.) Tanpa melupakan tujuan nama domain tingkat atas. Dalam kasus saya, dartservice.ru sempurna . Selama proses pendaftaran, Anda harus mengisi formulir informasi pemilik termasuk nama, alamat pos dan email. Kemudian Anda harus pergi ke manajemen catatan DNS di panel kontrol pencatatan dan membuat tiga catatan:
- Setidaknya dua data NS. Ini adalah nama server nama domain pencatat dan namanya disediakan oleh pencatat saat membeli nama domain.
- Rekor. Ini secara langsung merupakan catatan hubungan antara nama domain dan alamat IP server.
Dalam kasus saya, data DNS terlihat seperti ini:
Setelah melakukan ini, Anda seharusnya tidak mengharapkan hasil langsung. Pertukaran informasi antara server DNS biasanya membutuhkan waktu 1 hingga 12 jam untuk zona RU. Kemudian ... tambahkan tes lain ke proyek /test/http/client.http
SSL
Secara umum, tentu saja SSL adalah nama yang sudah ketinggalan zaman. Versi baru dari protokol ini disebut TLS 1.0 ... 1.3, tetapi mekanismenya tetap sama - enkripsi data selama transisi antara protokol lapisan aplikasi (dalam kasus kami HTTP) dan protokol lapisan transport (TCP / IP). Faktanya, Anda membutuhkan:
- Dapatkan sertifikat enkripsi dari otoritas sertifikasi khusus, yang mengonfirmasi kepemilikan domain terkait.
- NGINX.
- .
- , http https.
Saat ini secara umum diterima untuk menggunakan sertifikat gratis yang secara otomatis dikeluarkan oleh layanan enkripsi Let's . Salah satu batasan dari sertifikat tersebut adalah masa berlakunya. Hanya 90 hari. Setelah itu, sertifikat harus didapatkan kembali. Untuk memperoleh sertifikat secara otomatis (tanpa campur tangan manusia), protokol ACME dan aplikasi dikembangkan yang secara berkala melakukan tindakan untuk mengonfirmasi kepemilikan domain. Mari mengenkripsi merekomendasikan menggunakan aplikasi certbot . Itu ditulis dalam python dan membutuhkan repositori dan python3 sendiri untuk diinstal. Oleh karena itu, kami akan menggunakan kontainer buruh pelabuhan dengan certbot diinstal dari registri DockerHub . Mari pilih versi stabil terbaru dari certbot / certbot: v1.5.0...
Sekarang mari kita cari tahu mekanisme untuk mendapatkan sertifikat menggunakan protokol ACME:
- Pada peluncuran pertama, Certbot membuat kunci privat dan publik, kemudian membuat akun administrator domain di layanan Let's encrypt, mentransfer kunci publik dan informasi domain.
- Setelah itu Let's encrypt mengirimkan pesan, yang certbot harus masuk dengan kunci pribadi dan mengembalikannya.
- ertbot harus menempatkan di server file khusus yang tersedia untuk dibaca di dartservice.ru/.well-known/acme-challenge untuk mengonfirmasi kepemilikan domain ini.
- Certbot membuat permintaan sertifikat , mengirimkannya ke Let's encrypt dan menerima sertifikat untuk domain sebagai gantinya.
Mari tambahkan wadah aplikasi ke skrip kita docker-compose.yaml :
Parameter baru di sini comand : di sini adalah perintah yang akan dijalankan setelah wadah dimulai. Dalam hal ini, certonly (dapatkan sertifikat). Memperoleh sertifikat dilakukan secara online, yaitu perlu menjawab beberapa pertanyaan secara konsisten. Meneruskan tanda setelah perintah memungkinkan Anda melakukan ini tanpa campur tangan manusia: --webroot (metode konfirmasi) --webroot-path = / usr / share / nginx / html / letsencrypt (jalur tempat file konfirmasi kepemilikan domain akan ditempatkan) --email admin @ email.com (surat administrator domain) --setuju-untuk(terima persyaratan perjanjian lisensi) --no-eff-email (jangan laporkan email ke pengembang certbot) -d dartservice.ru (daftar domain).
Mari konfigurasikan wadah NGINX:
Perubahan di sini adalah membuka port https (443) dan memasang folder dengan sertifikat SSL dan file konfirmasi kepemilikan domain.
Parameter penting adalah folder kunci Diffie-Hellman. Singkatnya: kunci ini diperlukan untuk bertukar kunci enkripsi dengan aman antara server dan klien saat membuat koneksi. Lebih lengkapnya di sini .
Mari kita buat kunci seperti itu, tetapi kita akan menghadapi masalah berikut: kunci dibuat oleh program openssl, ini adalah utilitas konsol Linux yang tidak mungkin muncul di mesin Windows kami. Solusi paling sederhana adalah menjalankan skrip kami, membuka konsol penampung web dan membuat kunci di sana, meneruskan folder host yang dipasang ke penampung di jalur keluaran untuk file:
Jalankan skrip:
docker-compose up -d
Kami meminta daftar kontainer yang berjalan:
docker-compose ps
Buka konsol kontainer:
docker exec -it srv_web_1 bash
Kami mulai membuat kunci di folder konfigurasi NGINX (yang, seperti yang kami ingat, dipasang dari host):
openssl dhparam -out /etc/nginx/conf.d/dhparams.pem 2048
Pindahkan kunci ke ./dhparams/dhparam-2048.pem
Keluar dari konsol penampung Ctrl-D , hentikan skrip:
docker-compose down
Sekarang mari kita ubah konfigurasi NGINX ./conf.d/defaulf.conf :
Tambahkan lokasi baru ^ ~ /.well-known/acme-challenge untuk melayani file statis dari folder / usr / share / nginx / html / letsencrypt . Di sinilah file konfirmasi certbot akan ditempatkan. Mari kita siapkan pengalihan untuk semua permintaan lainnya ke https.
Semuanya siap untuk tanda terima sertifikat SSL pertama.
Mari salin proyek kita ke VPS ke folder baru / opt / srv_1 / dengan perintah:
scp -r ./* root@91.230.60.120:/opt/srv_1/
Mari terhubung dari VScode melalui SSH ke VPS.
Mari pergi ke folder server yang sedang berjalan:
cd /opt/srv_0/
dan hentikan skrip:
docker-compose down
Sekarang buka folder server baru cd / opt / srv_1 / dan jalankan skrip:
docker-compose up
Di konsol, kita melihat bahwa certbot membuat file konfirmasi zeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4 dan melaporkannya ke layanan Let's encrypt, yang kemudian meminta file ini dari empat alamat IP yang berbeda dan kemudian mengeluarkan sertifikat. Sertifikat dalam bentuk rantai lengkap dan kunci pribadi disimpan di folder yang sesuai. Sertifikat ini berlaku selama 90 hari (sampai 05.10.2020).
Saatnya membuat lokasi kedua untuk koneksi aman dalam konfigurasi NGINX di server ./conf.d/defaulf.conf :
Mulai ulang skrip
docker-compose restart
Mari kita lihat bagaimana browser bereaksi terhadap sertifikat kami:
Google Chrome menyukai sertifikat kami. Sekarang tugasnya lebih rumit - kami akan menguji keamanan dan ketersediaan untuk berbagai browser dari koneksi SSL kami https://www.ssllabs.com/ssltest/ . Kami memasukkan alamatnya, dan kami mendapatkan hasilnya:
Semuanya baik-baik saja dengan sertifikat dan pertukaran kunci (terima kasih kepada Diffie-Hellman), tetapi robot uji telah menurunkan peringkat (menurut kami "B" adalah "4") karena mendukung protokol TLS1.0 dan TLS1.1 yang sudah ketinggalan zaman ... Menonaktifkannya dalam konfigurasi NGINX tidaklah sulit, namun, melihat laporan pengujian lebih lanjut, kami melihat bahwa, misalnya, browser beberapa perangkat seluler dalam hal ini tidak akan dapat terhubung:
Masih ada beberapa tugas layanan yang harus dilakukan.
Jumlah upaya untuk mendapatkan sertifikat untuk domain tidak boleh melebihi 5 dalam 7 hari. Setelah itu, layanan Let's encrypt dapat memblokir kita. Namun, menjalankan skrip selama pengembangan setiap kali certbot akan mencoba melakukan ini, jadi dalam skrip docker-compose.dev.yaml, ubah parameter perintah dari wadah certbot :
Bendera --dry-run adalah uji coba tanpa mendapatkan sertifikat.
Mari tulis tes:
Kode sumber github .
Kesimpulan
Jadi, dalam langkah ini, kami mengamankan komunikasi antara server dan aplikasi klien dan mengajarkan browser untuk "mempercayai" domain kami.
Pada artikel berikutnya, kami akan menulis halaman web yang bergetar dengan hitungan mundur ke peluncuran layanan kami, mengumpulkannya dan meletakkannya di server kami.