GNU/Linux >> Linux Esercitazione >  >> Debian

Configura l'autenticazione del certificato in OpenConnect VPN Server (ocserv)

Questo tutorial ti mostrerà come impostare l'autenticazione del certificato nel server OpenConnect VPN (ocserv) su Debian/Ubuntu/CentOS/RHEL. OpenConnect (ocserv) è un'implementazione open source del protocollo VPN Cisco AnyConnect.

In un articolo precedente, ho spiegato i passaggi per configurare il server OpenConnect VPN con il certificato del server Let's Encrypt TLS. Let's Encrypt non emette certificati client, quindi in quell'articolo abbiamo utilizzato l'autenticazione tramite password. Immettere nome utente e password ogni volta può essere una seccatura, soprattutto se il software client, come l'app Cisco AnyConnect su iOS, non offre un'opzione per ricordare le password. Molti software client OpenConnect possono importare certificati utente, che libereranno l'utente dall'immissione di nome utente e password. L'autenticazione del certificato è anche più sicura dell'autenticazione tramite password.

Requisiti

Per seguire questo tutorial, si presume che tu abbia già configurato un server VPN OpenConnect con il certificato del server Let's Encrypt TLS. In caso contrario, segui uno dei seguenti tutorial.

  • Configura OpenConnect VPN Server (ocserv) su Ubuntu 20.04 con Let's Encrypt
  • Configura OpenConnect VPN Server (ocserv) su Debian 11 Bullseye con Let's Encrypt
  • Configura OpenConnect VPN Server (ocserv) su CentOS 8/RHEL 8 con Let's Encrypt

Imposteremo la nostra CA (Autorità di certificazione) per firmare il certificato del cliente. Il ocserv demone dovrebbe continuare a utilizzare il certificato del server TLS emesso da Let's Encrypt, quindi il software client non visualizzerà avvisi di sicurezza.

Impostazione della propria CA (Autorità di certificazione)

Vogliamo utilizzare l'autenticazione del certificato, ma Let's Encrypt non emette il certificato client, quindi dobbiamo creare la nostra CA. Puoi usare openssl per fare il lavoro, ma ocserv consiglia GnuTLS, quindi ti mostrerò come usare GnuTLS.

Installa gnutls-bin pacchetto su server Debian/Ubuntu.

sudo apt install gnutls-bin

Installa gnutls-utils pacchetto su CentOS/RHEL.

sudo dnf install gnutls-utils

Crea una sottodirectory in /etc/ocserv/ per conservare chiavi private e certificati.

sudo mkdir /etc/ocserv/ssl/

Cambia la tua directory di lavoro.

cd /etc/ocserv/ssl/

Genera una chiave privata per la CA con certtool comando, fornito da gnutls-bin o gnutls-utils pacchetto. Per impostazione predefinita, genera una chiave RSA a 3072 bit, che è sufficiente.

sudo certtool --generate-privkey --outfile ca-privkey.pem

Prima di generare il certificato CA, creiamo il file modello del certificato CA. Il formato del file modello può essere trovato nel manuale di certtool (man certtool ).

sudo nano ca-cert.cfg

Aggiungi le seguenti righe al file. Sostituisci i segnaposto con i valori appropriati.

# X.509 Certificate options

# The organization of the subject.
organization = "vpn.example.com"

# The common name of the certificate owner.
cn = "Example CA"

# The serial number of the certificate.
serial = 001

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = -1

# Whether this is a CA certificate or not
ca

# Whether this certificate will be used to sign data
signing_key

# Whether this key will be used to sign other certificates.
cert_signing_key

# Whether this key will be used to sign CRLs.
crl_signing_key

Salva e chiudi il file. Ora genera il certificato CA utilizzando le configurazioni dal file modello.

sudo certtool --generate-self-signed --load-privkey ca-privkey.pem --template ca-cert.cfg --outfile ca-cert.pem

Ora abbiamo un file di certificato CA (ca-cert.pem ).

Generazione certificato cliente

Ora esegui il seguente comando per generare la chiave privata del client.

sudo certtool --generate-privkey --outfile client-privkey.pem

Crea il file modello del certificato client.

sudo nano client-cert.cfg

Aggiungi le seguenti righe nel file. L'uid deve essere un nome utente nel /etc/ocserv/ocpasswd file.

# X.509 Certificate options
# The organization of the subject.
organization = "vpn.example.com"

# The common name of the certificate owner.
cn = "John Doe"

# A user id of the certificate owner.
uid = "username"

# In how many days, counting from today, this certificate will expire. Use -1 if there is no expiration date.
expiration_days = 3650

# Whether this certificate will be used for a TLS server
tls_www_client

# Whether this certificate will be used to sign data
signing_key

# Whether this certificate will be used to encrypt data (needed
# in TLS RSA ciphersuites). Note that it is preferred to use different
# keys for encryption and signing.
encryption_key

Salva e chiudi il file. Quindi esegui il comando seguente per generare il certificato client, che verrà firmato dalla chiave privata della 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

Combina la chiave privata del client e il certificato in un file PKCS #12 protetto da un PIN.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher aes-256 --outfile client.p12 --outder

Ora abbiamo la chiave privata e il certificato del client combinati in un unico file client.p12 .

Tieni presente che l'app Ciso AnyConnect su iOS non supporta la crittografia AES-256. Rifiuterà di importare il certificato client. Se l'utente utilizza un dispositivo iOS, puoi scegliere 3des-pkcs12 cifra.

sudo certtool --to-p12 --load-privkey client-privkey.pem --load-certificate client-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ios-client.p12 --outder

La chiave privata del client e il certificato combinati in un unico file ios-client.p12 .

Richiesta di firma del certificato

Questo passaggio è necessario solo se sono presenti più utenti VPN e l'utente desidera utilizzare la propria chiave privata.

Per mantenere segrete le chiavi private degli utenti finali, gli utenti possono generare una richiesta di firma del certificato (CSR) con le proprie chiavi private, quindi inviare richieste di certificato all'amministratore, che quindi rilascia i certificati client agli utenti. Innanzitutto, devono generare la chiave privata e il modello di certificato del client utilizzando i comandi sopra menzionati. Quindi genera una CSR con il seguente comando. Il request.pem il file è firmato dalla chiave privata dell'utente.

certtool --generate-request --load-privkey client-privkey.pem --template client-cert.cfg --outfile request.pem

Successivamente, l'utente invia il request.pem e client-cert.cfg file all'amministratore, che esegue il comando seguente per generare il certificato client.

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.pem

Successivamente, l'amministratore invia client-cert.pem certificato all'utente.

Abilitazione dell'autenticazione del certificato in ocserv Daemon

Modifica il file di configurazione di ocserv.

sudo nano /etc/ocserv/ocserv.conf

Nel tutorial precedente, abbiamo aggiunto la riga seguente per abilitare l'autenticazione della password.

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Per abilitare l'autenticazione del certificato, decommenta la riga seguente.

auth = "certificate"

Se le due righe precedenti non sono commentate, significa che l'utente deve superare sia l'autenticazione della password che l'autenticazione del certificato. Quindi, se l'autenticazione del certificato è sufficiente per dimostrare l'identità, commenta la prima riga.

Se consenti agli utenti di scegliere l'autenticazione del certificato o l'autenticazione della password, dovresti invece avere le seguenti righe.

enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"
auth = "certificate"

Ora trova il parametro ca-cert. Su Debian/Ubuntu, è impostato su

ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem

Su CentOS 8/RHEL 8, è impostato su

ca-cert = /etc/ocserv/ca.pem

Dobbiamo utilizzare il nostro certificato CA per verificare il certificato client, quindi cambia questa riga in

ca-cert = /etc/ocserv/ssl/ca-cert.pem

Quindi, trova la riga seguente.

cert-user-oid = 0.9.2342.19200300.100.1.1

Non è necessario cambiarlo. Voglio solo dirti che 0.9.2342.19200300.100.1.1 rappresenta l'UID archiviato nel certificato client. La riga sopra indica ocserv demone per trovare il nome utente dal campo UID del certificato client. Se il certificato client viene verificato con successo dal certificato CA e da ocserv daemon può trovare un nome utente corrispondente in /etc/ocserv/ocpasswd file, il client può accedere.

Salva e chiudi il file. Quindi riavvia ocserv.

sudo systemctl restart ocserv

Utilizzo dell'autenticazione del certificato su desktop Debian/Ubuntu/CentOS/RHEL

Usa scp comando per scaricare il client.p12 file sul desktop Debian/Ubuntu/CentOS/RHEL.

scp [email protected]:/etc/ocserv/ssl/client.p12 ~

Quindi installa openconnect software client.

Debian/Ubuntu:

sudo apt install openconnect

CentOS/RHEL:

sudo dnf install epel-release
sudo dnf install openconnect

Per utilizzare l'autenticazione del certificato, esegui

sudo openconnect -b vpn.example.com -c client.p12

Ti verrà chiesto di sbloccare la chiave privata del client con la passphrase che hai impostato in precedenza in questo tutorial.

Se la passphrase è stata inserita correttamente, ora dovresti essere connesso al server VPN.

Utilizzo dell'autenticazione del certificato su desktop Windows e MacOS

Scarica il client GUI OpenConnect per Windows o MacOS dalla pagina Github della GUI OpenConnect. Quindi crea un nuovo profilo di connessione VPN e importa il file PKCS #12 nel campo del certificato utente. Fare clic sul pulsante Salva. Sarà necessario inserire il PIN per sbloccare la chiave privata. Una volta importato, non è più necessario inserire nome utente e password.

Utilizzo dell'autenticazione del certificato su un dispositivo iOS

Gli utenti iOS possono utilizzare l'app Cisco AnyConnect. Per importare il certificato client nell'app AnyConnect, puoi prima inviare il file PKCS #12 al tuo indirizzo e-mail in un allegato. Quindi apri l'app di posta su iOS. Tocca l'allegato per qualche secondo e condividilo con AnyConnect. Quindi inserisci il PIN per importare il file.

Una volta importato, modifica la tua connessione VPN in AnyConnect. Vai a Advanced -> Certificate e selezionare il certificato client. Salva le tue impostazioni.

Ora non devi più inserire nome utente e password sul tuo dispositivo iOS. L'app Cisco AnyConnect non ricorda nome utente e password, quindi nella modalità di autenticazione della password, la connessione VPN si interromperà quando il telefono non è in uso. In modalità di autenticazione del certificato, l'app si riconnetterà automaticamente al server VPN se la connessione viene interrotta.

Problemi con AnyConnect Client su iOS

L'ultima versione del client AnyConnect su iOS presenta un problema quando si utilizza l'autenticazione del certificato nel protocollo TLS 1.3. Se vedi il seguente errore nel log di ocserv (sudo journalctl -eu ocserv ), hai lo stesso problema.

GnuTLS error (at worker-vpn.c:795): A TLS fatal alert has been received.

O devi utilizzare l'autenticazione della password nel client iOS AnyConnect o disabilitare TLS 1.3 nel file di configurazione ocserv. Per disabilitare TLS1.3, trova le tls-priorities parametro nel /etc/ocserv/ocserv.conf file e aggiungi :-VERS-TLS1.3 alla fine per disabilitare TLS 1.3.

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3"

Salva e chiudi il file. Quindi riavvia ocserv.

sudo systemctl restart ocserv

Nota :Se vedi SSL 3.3 frase nei registri di ocserv, niente panico. SSL 3.3 è un'altra parola per TLS 1.2. Stai utilizzando una connessione TLS sicura.


Debian
  1. Come configurare WireGuard VPN su Ubuntu (una guida passo passo)

  2. Come impostare e configurare un'autorità di certificazione su Ubuntu 22.04

  3. Server VPN PPTP

  4. Come configurare un server SFTP su Debian 11 Server

  5. Configura l'autenticazione a più fattori per SSH su Ubuntu 20.04

Configura il tuo server VPN WireGuard su Debian 11 e Debian 10

Configura OpenConnect VPN Server (ocserv) su Debian 10 Buster

Configura OpenConnect VPN Server (ocserv) su Ubuntu 18.04/16.04 con Let's Encrypt

Configura OpenConnect VPN Server (ocserv) su Ubuntu 20.04 con Let's Encrypt

Configura l'autenticazione a due fattori SSH (2FA) su Ubuntu Server

Come configurare un VPN Pptp sul proprio server Ubuntu?