Enkripsi lalu lintas TLS menurut algoritma GOST-2012 dengan Stunnel


Pada artikel ini saya ingin menunjukkan cara mengkonfigurasi Stunnel untuk menggunakan algoritma kriptografi Rusia dalam protokol TLS. Sebagai bonus, saya akan menunjukkan cara mengenkripsi saluran TLS menggunakan algoritma GOST yang diterapkan pada inti crypto Rutoken EDS 2.0.


Tapi pertama-tama, mari kita cari tahu apa tujuan Stunnel. Singkatnya - ini adalah program di mana Anda dapat menggeser seluruh logika enkripsi lalu lintas antara server dan klien. Ini dilakukan sebagai berikut: misalkan Anda memiliki klien dan server yang berkomunikasi satu sama lain tanpa menggunakan enkripsi, otentikasi, dan pemeriksaan integritas. Anda dapat menulis ulang klien dan server sehingga semua pesan keluar dan masuk ditransmisikan di antara mereka sendiri, dengan mempertimbangkan semua poin ini, tetapi mengapa kesulitan seperti itu, jika Anda bisa menggesernya ke bahu aplikasi lain? Untuk mengatasi masalah ini, Stunnel tepat.


Anda hanya perlu mengkonfigurasi klien sehingga semua lalu lintasnya ditransmisikan ke klien Stunnel, pada gilirannya, itu membangun koneksi yang aman ke server, mengirim data ke server Stunnel. Stunnel pada server mendekripsi lalu lintas masuk dan mengalihkan data ke input server. Di atas lebih mudah untuk diwujudkan dengan melihat diagram ini.



Perlu dicatat bahwa server tidak harus persis Stunnel, untuk bekerja dengan algoritma kriptografi. Sangat menyenangkan bahwa ada stand demo siap pakai yang mendukung kriptografi Rusia, daftar yang ada dalam presentasi bersama RusCrypto'2019 .


Kami membutuhkan server stabil yang menyediakan otentikasi dua arah.
Kami telah memilih server CryptoPro sebagai yang paling andal dengan implementasi penuh standar GOST TLS. Terima kasih kepada mereka untuk itu :)


Kedengarannya cukup sederhana, mari kita coba mengatur proses ini.


Langkah persiapan


Kami akan membutuhkan:


  1. Openssl
  2. Stunnel
  3. mesin
  4. Akses ke server uji CryptoPro untuk memverifikasi koneksi TLS

OpenSSL untuk Windows dapat diambil dari sini , dan untuk pengguna Linux - dari repositori atau dikumpulkan dengan mengunduh versi terbaru dari sini . Itu juga dapat diambil dari Rutoken SDK , dari direktori openssl \ openssl-tool-1.1 , arsip ini akan berguna bagi kita lebih jauh, karena itu mengandung rekayasa yang menarik bagi kita. Stunnel dapat ditemukan di sini . Versi> = 5.56 diperlukan untuk operasi.


Anda dapat mengunduh rtengine dari Rutoken SDK , itu terletak di direktori openssl \ rtengine \ bin . Anda harus meletakkannya di tempat semua mesin openssl disimpan. Anda dapat menemukan cara mereka menggunakannya


openssl.exe version -a 

Tetapi hanya memindahkan mesin ke folder yang diinginkan tidak cukup, Anda masih perlu mengkonfigurasi openssl sendiri untuk bekerja dengannya. Kami mencari tahu di mana file konfigurasi openssl.cnf terletak dengan perintah yang sama seperti di atas (di bawah stunnel Windows hadir dengan versi openssl sendiri, sehingga file konfigurasi terletak di jalur \ to \ stunnel \ config \ openssl.cnf


 #   : openssl_conf = openssl_def ... #   : # OpenSSL default section [openssl_def] engines = engine_section [engine_section] rtengine = rtengine_section [rtengine_section] engine_id = rtengine dynamic_path = /path/to/rtengine.so MODULE_PATH = /usr/lib/librtpkcs11ecp.so default_algorithms = CIPHERS, DIGEST, PKEY, RAND 

Mari kita verifikasi bahwa rtengine terhubung, untuk ini kami menghubungkan token dan daftar semua algoritma enkripsi:


 openssl ciphers -v 

Biarkan saya mengingatkan Anda bahwa pada Windows Anda perlu memeriksa openssl, yang terletak di sebelah stunnel
Jika di antara mereka, GOST kami akan hadir, maka semuanya telah diatur dengan benar.


Waktunya telah tiba untuk yang paling menarik: memeriksa koneksi dengan server uji GOST CryptoPro. Daftar server ini dijelaskan di sini ( https://www.cryptopro.ru/products/csp/tc26tls ). Masing-masing server ini bekerja dengan algoritma sendiri untuk otentikasi dan enkripsi. Selain itu, pada port 443, 1443, 2443, ... layanan diluncurkan yang hanya menerima parameter tertentu. Jadi, misalnya, di http://tlsgost-256auth.cryptopro.ru , enkripsi dilakukan dengan otentikasi menggunakan algoritma GOST2012-GOST8912-GOST8912-GOST8912 dan kunci 256-bit. Juga, port 443 menggunakan XchA-ParamSet, port 1443 menggunakan XchB-ParamSet, port 2443 menggunakan A-ParamSet, dll.


Sekarang kita tahu kunci mana yang kita butuhkan, mari kita dapatkan sertifikat root dari server uji, kerjakan kunci untuk bekerja, dan tandatangani permintaan untuk sertifikat kita.


Cara sederhana (bekerja di bawah Windows dan Linux)


  1. Untuk mendapatkan sertifikat root, kami akan pergi ke situs tes CA LLC "CRIPTO-PRO" . Dan klik tombol untuk mendapatkan sertifikat. Tab baru akan muncul, di mana Anda harus memilih metode enkripsi Base64 dan klik tombol "Unduh sertifikat CA" . File certnew.cer yang dihasilkan disimpan.
  2. Ikuti tautannya . Instal semua plugin yang diminta dari kami. Kami klik pada tombol "Buat kunci" , dan pilih algoritma "GOST R 34.10-2012 256-bit" untuk generasi. Selanjutnya, buat permintaan sertifikat, di kolom "Aplikasi" Anda dapat memilih semuanya. Di kolom Aplikasi Tambahan: Otentikasi Klien dan Pengguna Pusat Pendaftaran CryptoPro.
  3. Kami kembali membuka situs tes CA, tetapi kali ini kami mengklik tombol "Kirim permintaan siap PKCS # 10 atau PKCS # 7 yang dikodekan dalam Base64" . Kami menempelkan isi permintaan kami ke dalam bidang, klik tombol "Masalah" dan muat sertifikat user.crt dalam format Base64. File yang dihasilkan disimpan.

Melalui baris perintah


  1. Untuk mendapatkan sertifikat root, kami akan pergi ke situs tes CA LLC "CRIPTO-PRO" . Dan klik tombol untuk mendapatkan sertifikat. Tab baru akan muncul, di mana Anda harus memilih metode enkripsi Base64 dan klik tombol "Unduh sertifikat CA" . File certnew.cer yang dihasilkan disimpan.


  2. Sekarang buat kunci.


     pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B -l --id 45 # 45 --   ASII id  (E) 

    Perlu dicatat bahwa kunci yang dihasilkan pada token tidak dapat disalin dari token. Ini adalah salah satu keunggulan utama penggunaannya.


  3. Buat permintaan sertifikat:


     openssl req -engine rtengine -new -key="pkcs11:id=E" -keyform engine -out client.req 

  4. Kami kembali membuka situs tes CA, tetapi kali ini kami mengklik tombol "Kirim permintaan siap PKCS # 10 atau PKCS # 7 yang dikodekan dalam Base64" . Kami menempelkan isi permintaan kami ke dalam bidang, klik tombol Masalah dan mengunggah sertifikat user.crt dalam format Base64. File yang dihasilkan disimpan.



Ada pertanyaan terakhir: Mengapa semua ini ??? Mengapa kami mendapatkan semua sertifikat, kunci, dan permintaan ini?


Faktanya adalah bahwa mereka dibutuhkan oleh protokol TLS untuk otentikasi dua arah. Ini bekerja sangat sederhana.


Kami memiliki sertifikat server, dan kami menganggapnya tepercaya.


Klien kami memverifikasi bahwa server yang bekerja sama dengan kami memiliki sertifikat serupa.
Server ingin memastikan bahwa ia berfungsi dengan pengguna yang diketahuinya. Untuk ini, kami membuat permintaan sertifikat untuk bekerja melalui kunci kami.


Kami mengirim permintaan ini dan server menandatanganinya dengan tanda tangan digitalnya. Sekarang kita dapat menyajikan sertifikat ini setiap kali, ditandatangani oleh CA root, dengan demikian menegaskan bahwa kita adalah kita.


Mengkonfigurasi Stunnel


Tetap hanya mengkonfigurasi saluran kami dengan benar. Untuk melakukan ini, buat file stunnel.conf dengan pengaturan Stunnel default dan tulis yang berikut di sini:


 ;      - debug = 7 output = /path/to/stunnel.log ;    TLSv1 sslVersion=TLSv1 ;  . engine=rtengine ;     [remote system] client=yes ;  engine,     engineId=rtengine ;   2 (  ) verify = 2 ;     CAFile = /path/to/certnew.cer ;     cert=/path/to/user.crt ;     . key=pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;id=E ;   Stunnel      accept = localhost:8080 connect = tlsgost-256auth.cryptopro.ru:2443 

Sekarang, jika semuanya dilakukan dengan benar, Anda dapat memulai Stunnel dengan konfigurasi kami dan terhubung ke server:


 stunnel.exe /path/to/stunnel.conf 

Buka browser dan pergi ke localhost: 8080. Jika semuanya benar, maka yang berikut akan ditampilkan:



Jika tidak, maka kita melihat log dan menggunakan debugger untuk memahami apa masalahnya.


Jika Anda memiliki pertanyaan, maka Anda dapat mengomentari :)

Source: https://habr.com/ru/post/id477650/


All Articles