Tutorial ini akan menunjukkan cara mengatur otentikasi sertifikat di server OpenConnect VPN (ocserv) di Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) adalah implementasi sumber terbuka dari protokol VPN Cisco AnyConnect.
Pada artikel sebelumnya, saya menjelaskan langkah-langkah untuk mengatur server OpenConnect VPN dengan sertifikat server Let's Encrypt TLS. Let's Encrypt tidak mengeluarkan sertifikat klien, jadi dalam artikel itu, kami menggunakan otentikasi kata sandi. Memasukkan nama pengguna dan kata sandi setiap saat bisa merepotkan, terutama jika perangkat lunak klien, seperti aplikasi Cisco AnyConnect di iOS, tidak menawarkan opsi untuk mengingat kata sandi. Banyak perangkat lunak klien OpenConnect dapat mengimpor sertifikat pengguna, yang akan membebaskan pengguna dari memasukkan nama pengguna dan kata sandi. Otentikasi sertifikat juga lebih aman daripada otentikasi kata sandi.
Persyaratan
Untuk mengikuti tutorial ini, diasumsikan bahwa Anda telah menyiapkan server OpenConnect VPN dengan sertifikat server Let's Encrypt TLS. Jika tidak, ikuti salah satu tutorial berikut.
- Siapkan OpenConnect VPN Server (ocserv) di Ubuntu 20.04 dengan Let's Encrypt
- Mengatur OpenConnect VPN Server (ocserv) di Debian 11 Bullseye dengan Let's Encrypt
- Siapkan OpenConnect VPN Server (ocserv) di CentOS 8/RHEL 8 dengan Let's Encrypt
Kami akan menyiapkan CA (Certificate Authority) kami sendiri untuk menandatangani sertifikat klien. ocserv
daemon harus terus menggunakan sertifikat server TLS yang dikeluarkan oleh Let's Encrypt, sehingga perangkat lunak klien tidak akan menampilkan peringatan keamanan.
Menyiapkan CA Anda Sendiri (Otoritas Sertifikat)
Kami ingin menggunakan otentikasi sertifikat, tetapi Let's Encrypt tidak mengeluarkan sertifikat klien, jadi kami perlu membuat CA kami sendiri. Anda dapat menggunakan openssl
untuk melakukan pekerjaan itu, tetapi ocserv merekomendasikan GnuTLS, jadi saya akan menunjukkan cara menggunakan GnuTLS.
Instal gnutls-bin
paket di server Debian/Ubuntu.
sudo apt install gnutls-bin
Instal gnutls-utils
paket di CentOS/RHEL.
sudo dnf install gnutls-utils
Buat sub-direktori di /etc/ocserv/
untuk memegang kunci dan sertifikat pribadi.
sudo mkdir /etc/ocserv/ssl/
Ubah direktori kerja Anda.
cd /etc/ocserv/ssl/
Buat kunci pribadi untuk CA dengan certtool
perintah, yang disediakan oleh gnutls-bin
atau gnutls-utils
kemasan. Secara default, ini menghasilkan kunci RSA 3072 bit, yang sudah cukup.
sudo certtool --generate-privkey --outfile ca-privkey.pem
Sebelum membuat sertifikat CA, mari buat file template sertifikat CA. Format file template dapat ditemukan di certtool manual (man certtool
).
sudo nano ca-cert.cfg
Tambahkan baris berikut ke file. Ganti placeholder dengan nilai yang sesuai.
# X.509 Opsi sertifikat# Organisasi subjek.organisasi ="vpn.example.com"# Nama umum pemilik sertifikat.cn ="Contoh CA"# Nomor seri sertifikat.serial =001# Dalam berapa hari, terhitung mulai hari ini, sertifikat ini akan kedaluwarsa. Gunakan -1 jika tidak ada tanggal kedaluwarsa.expiration_days =-1# Apakah ini sertifikat CA atau bukanca# Apakah sertifikat ini akan digunakan untuk menandatangani datasigning_key# Apakah kunci ini akan digunakan untuk menandatangani sertifikat lain.cert_signing_key# Apakah kunci ini akan digunakan untuk menandatangani CRLs.crl_signing_key
Simpan dan tutup file. Sekarang buat sertifikat CA menggunakan konfigurasi dari file template.
sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem
Sekarang kita memiliki file sertifikat CA (ca-cert.pem
).
Membuat Sertifikat Klien
Sekarang jalankan perintah berikut untuk menghasilkan kunci pribadi klien.
sudo certtool --generate-privkey --outfile client-privkey.pem
Buat file template sertifikat klien.
sudo nano client-cert.cfg
Tambahkan baris berikut ke dalam file. Uid harus berupa nama pengguna di /etc/ocserv/ocpasswd
berkas.
# X.509 Opsi sertifikat# Organisasi subjek.organisasi ="vpn.example.com"# Nama umum pemilik sertifikat.cn ="John Doe"# ID pengguna pemilik sertifikat.uid ="nama pengguna"# Dalam berapa hari, terhitung mulai hari ini, sertifikat ini akan kedaluwarsa. Gunakan -1 jika tidak ada tanggal kedaluwarsa.expiration_days =3650# Apakah sertifikat ini akan digunakan untuk server TLStls_www_client# Apakah sertifikat ini akan digunakan untuk menandatangani datasigning_key# Apakah sertifikat ini akan digunakan untuk mengenkripsi data (diperlukan# di TLS RSA ciphersuite). Perhatikan bahwa lebih disukai menggunakan# kunci yang berbeda untuk enkripsi dan penandatanganan.encryption_key
Simpan dan tutup file. Kemudian jalankan perintah berikut untuk menghasilkan sertifikat klien, yang akan ditandatangani oleh kunci pribadi CA.
sudo certtool --generate-certificate --load-privkey client-privkey.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --template client-cert .cfg --outfile client-cert.pem
Gabungkan kunci pribadi klien dan sertifikat dalam file PKCS #12 yang dilindungi oleh PIN.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder
Sekarang kami memiliki kunci pribadi klien dan sertifikat yang digabungkan menjadi satu file client.p12
.
Perhatikan bahwa aplikasi Ciso AnyConnect di iOS tidak mendukung sandi AES-256. Itu akan menolak untuk mengimpor sertifikat klien. Jika pengguna menggunakan perangkat iOS, maka Anda dapat memilih 3des-pkcs12
sandi.
sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outderKunci pribadi klien dan sertifikat digabungkan menjadi satu file
ios-client.p12
.Permintaan Penandatanganan Sertifikat
Langkah ini hanya diperlukan jika ada beberapa pengguna VPN, dan pengguna ingin menggunakan kunci pribadinya sendiri.
Untuk menjaga kerahasiaan kunci pribadi pengguna akhir, pengguna dapat membuat permintaan penandatanganan sertifikat (CSR) dengan kunci pribadi mereka sendiri, lalu mengirim permintaan sertifikat ke admin, yang kemudian menerbitkan sertifikat klien kepada pengguna. Pertama, mereka harus membuat kunci pribadi dan template sertifikat klien menggunakan perintah yang disebutkan di atas. Kemudian buat CSR dengan perintah berikut.
request.pem
file ditandatangani oleh kunci pribadi pengguna.certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pemSelanjutnya, pengguna mengirimkan
request.pem
danclient-cert.cfg
file ke admin, yang menjalankan perintah berikut untuk menghasilkan sertifikat klien.sudo certtool --generate-certificate --load-ca-certificate ca-cert.pem --load-ca-privkey ca-privkey.pem --load-request request.pem --template client-cert.cfg --outfile client-cert.pemSetelah itu admin mengirimkan
client-cert.pem
file sertifikat kepada pengguna.Mengaktifkan Otentikasi Sertifikat di ocserv Daemon
Edit file konfigurasi ocserv.
sudo nano /etc/ocserv/ocserv.confPada tutorial sebelumnya, kami menambahkan baris berikut untuk mengaktifkan otentikasi kata sandi.
auth ="plain[passwd=/etc/ocserv/ocpasswd]"Untuk mengaktifkan otentikasi sertifikat, batalkan komentar pada baris berikut.
auth ="sertifikat"Jika dua baris di atas tidak diberi komentar, itu berarti pengguna harus melewati otentikasi kata sandi dan otentikasi sertifikat. Jadi, jika otentikasi sertifikat cukup untuk membuktikan identitas, maka beri komentar di baris pertama.
Jika Anda mengizinkan pengguna untuk memilih autentikasi sertifikat atau autentikasi kata sandi, maka Anda harus memiliki baris berikut sebagai gantinya.
enable-auth ="plain[passwd=/etc/ocserv/ocpasswd]"auth ="certificate"Sekarang temukan parameter ca-cert. Di Debian/Ubuntu, disetel ke
ca-cert =/etc/ssl/certs/ssl-cert-snakeoil.pemPada CentOS 8/RHEL 8, disetel ke
ca-cert =/etc/ocserv/ca.pemKami perlu menggunakan sertifikat CA kami sendiri untuk memverifikasi sertifikat klien, jadi ubah baris ini menjadi
ca-cert =/etc/ocserv/ssl/ca-cert.pemSelanjutnya, cari baris berikut.
cert-user-oid =0.9.2342.19200300.100.1.1Anda tidak perlu mengubahnya. Saya hanya ingin memberi tahu Anda bahwa
0.9.2342.19200300.100.1.1
mewakili UID yang diajukan dalam sertifikat klien. Baris di atas memberitahuocserv
daemon untuk menemukan nama pengguna dari bidang UID sertifikat klien. Jika sertifikat klien berhasil diverifikasi oleh sertifikat CA danocserv
daemon dapat menemukan nama pengguna yang cocok di/etc/ocserv/ocpasswd
file, maka klien dapat login.Simpan dan tutup file. Kemudian restart ocserv.
sudo systemctl restart ocservMenggunakan Otentikasi Sertifikat di Debian/Ubuntu/CentOS/RHEL Desktop
Gunakan
scp
perintah untuk mengunduhclient.p12
file ke desktop Debian/Ubuntu/CentOS/RHEL Anda.scp [dilindungi email]:/etc/ocserv/ssl/client.p12 ~Kemudian instal
openconnect
perangkat lunak klien.Debian/Ubuntu:
sudo apt install openconnectCentOS/RHEL:
sudo dnf install epel-releasesudo dnf install openconnectUntuk menggunakan autentikasi sertifikat, jalankan
sudo openconnect -b vpn.example.com -c client.p12Anda akan diminta untuk membuka kunci pribadi klien dengan frasa sandi yang telah Anda atur sebelumnya dalam tutorial ini.
Jika frasa sandi dimasukkan dengan benar, Anda sekarang harus terhubung ke server VPN.
Menggunakan Otentikasi Sertifikat di Desktop Windows dan MacOS
Unduh klien OpenConnect GUI untuk Window atau MacOS dari OpenConnect GUI Github Page. Kemudian buat profil koneksi VPN baru dan impor file PKCS #12 ke bidang sertifikat pengguna. Klik tombol Simpan. Anda harus memasukkan PIN untuk membuka kunci pribadi. Setelah diimpor, Anda tidak perlu lagi memasukkan nama pengguna dan sandi.
Menggunakan Autentikasi Sertifikat di Perangkat iOS
Pengguna iOS dapat menggunakan aplikasi Cisco AnyConnect. Untuk mengimpor sertifikat klien di aplikasi AnyConnect, Anda dapat mengirim file PKCS #12 terlebih dahulu ke alamat email Anda dalam lampiran. Kemudian buka aplikasi email di iOS. Ketuk lampiran beberapa detik dan bagikan dengan AnyConnect. Kemudian masukkan PIN untuk mengimpor file.
Setelah diimpor, edit koneksi VPN Anda di AnyConnect. Buka
Advanced
->Certificate
dan pilih sertifikat klien. Simpan setelan Anda.
Sekarang Anda tidak perlu lagi memasukkan nama pengguna dan kata sandi di perangkat iOS Anda. Aplikasi Cisco AnyConnect tidak mengingat nama pengguna dan kata sandi, jadi dalam mode otentikasi kata sandi, koneksi VPN akan terputus saat telepon tidak digunakan. Dalam mode autentikasi sertifikat, aplikasi akan secara otomatis terhubung kembali ke server VPN jika koneksi terputus.
Masalah dengan Klien AnyConnect di iOS
Versi terbaru klien AnyConnect di iOS mengalami masalah saat menggunakan autentikasi sertifikat dalam protokol TLS 1.3. Jika Anda melihat kesalahan berikut di log ocserv (
sudo journalctl -eu ocserv
), Anda memiliki masalah yang sama.Kesalahan GnuTLS (di worker-vpn.c:795):Peringatan fatal TLS telah diterima.Entah Anda perlu menggunakan otentikasi kata sandi di klien AnyConnect iOS atau menonaktifkan TLS 1.3 di file konfigurasi ocserv. Untuk menonaktifkan TLS1.3, temukan
tls-priorities
parameter di/etc/ocserv/ocserv.conf
file, dan tambahkan:-VERS-TLS1.3
di akhir untuk menonaktifkan TLS 1.3.tls-priorities ="NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS -TLS1.3 "Simpan dan tutup file. Kemudian restart ocserv.
sudo systemctl restart ocservCatatan :Jika Anda melihat
SSL 3.3
frase di log ocserv, jangan panik. SSL 3.3 adalah kata lain dari TLS 1.2. Anda menggunakan koneksi TLS yang aman.
Instal phpMyAdmin dengan Apache (LAMP) di Debian 10 Buster Cara Mengaktifkan Protokol HTTP2 dengan Nginx di Debian 8 Jessie ServerDebian