Categories
FrontPost Geek Lavoro Sicurezza

OpenVPN X509 – Windows XP vs Linux

In questo howto realizzerò una connessione OpenVpn tra un sistema GNU/Linux debian based e un client Windows XP, mediante certificati X509.

Preparazione del server

installazione di openvpn mediante apt


# apt-get install openvpn
# mkdir -p /etc/openvpn/vpn1/certs


creazione dei certificati mediante OpenSSL


creazione della CA
# /usr/lib/ssl/misc/CA.sh -newca (assegnamo le caratteristiche della ca)

abbiamo la dir demoCA che contiene la nostra Certification Authority


# /usr/lib/ssl/misc/CA.sh -newreq (richiediamo il primo certificato)
# /usr/lib/ssl/misc/CA.sh -sign (e lo firmiamo)

a questo punto abbiamo due file:

  • newreq.pem che contiene la richiesta di certificato e la chiave privata criptata associata a tale certificato.
  • newcert.pem che il certificato x509 firmato dalla CA

decrittiamo la chiave privaa


# openssl rsa -in newreq.pem -out vpnserver.key

e rinominiamo il file di cerficato per chiarezza


# mv newcert.pem vpnserver.pem

adesso abbiamo

  • vpnserver.pem che contiene il certificato x509 del vpnserver
  • vpnserver.key che contiene la chiave privata IN CHIARO del vpnserver

spostiamo i certificati nella loro nuova casa


# mv vpnserver.pem /etc/openvpn/vpn1/certs
# mv vpnserver.key /etc/openvpn/vpn1/certs
# chmod 400 /etc/openvpn/vpn1/certs/vpnserver.key (MOLTO IMPORTANTE)

e ci mettiamo anche il certificato della CA


# cp demoCA/cacert.pem /etc/openvpn/vpn1/certs

creiamo il file di definizione Diffie-Hellman direttamente al suo posto


# openssl dhparm -out /etc/openvpn/vpn1/certs/dh1024.pem 1024

se possediamo un file di revoche lo copiamo nella dir dei certificati


# cp crl.pem /etc/openvpn/vpn1/certs

a questo punto non ci resta che creare il file di configurazione per il server


# vi /etc/openvpn/vpn1/local.conf

##### local.conf server ######
# la porta da utilizzare
port 1194
# il protocollo di trasporto
proto udp
# il device tun da utilizzare
dev tun
# il certificato della CA
ca /etc/openvpn/vpn1/certs/cacert.pem
# il certificato del server OpenVPN
cert /etc/openvpn/vpn1/certs/vpnserver.pem
# la chiave privata del certificato
key /etc/openvpn/vpn1/certs/vpnserver.key
# il certificato di definizione Diffie-Hellman
dh /etc/openvpn/vpn1/certs/dh1024.pem
# eventuale CRL (certificate revocation list)
crl-verify /etc/openvpn/vpn1/certs/crl.pem
# subnet da utilizzare per i client
# N.B. quando si sceglie questa subnet, tenere conto che lo spazio di
# indirizzamento deve essere quadruplo rispetto al numero di client
# in quanto verra' utilizzata una rete /30 per ogni client collegato
# es. una rete di classe C e' adatta per un max di 64 client
server 192.168.100.0 255.255.255.0
# il file che contiene il db degli ip assegnati quando OpenVPN viene stoppato
# intervenedo su questo file si possono assegnare gli ip in base al certificato che viene presentato
# dal client
ifconfig-pool-persist /etc/openvpn/vpn1/ipp.txt
# informazioni di keepalive del link vpn
keepalive 10 120
# compressione del trasporto
comp-lzo
# persistenza di chiavi e tunnel
persist-key
persist-tun
# logfile
status /etc/openvpn/vpn1/openvpn-status.log
# livello di verbosity del log
verb 3
#### end local.con vpnserver ######

realizziamo un certificato utente


# /usr/lib/ssl/misc/CA.sh -newreq
# /usr/lib/ssl/misc/CA.sh -sign
# openssl pkcs12 -in newcert.pem -inkey newreq.pem -certfile demoCA/cacert.pem -export -out primoclient.p12

ci vengono chieste 2 password: la prima serve a decrittare la chiave privata (la password che abbiamo impostato15 secondi fa) la seconda risulta essere MOLTO importante in quanto serve a crittare nuovamente la private key a a creare il pacchetto PKCS12. Questo formato e’ lo standard di distribuzione dei certificati+chiavi+certificatoCA. Al client dovremo consegnare il file p12 e la password di utilizzo.

consegnamo il file p12 al client.
purtroppo siamo costretti a consegnare anche il file cacert.pem nonostante sia già contenuto nel p12
Questa operazione diminuisce il livello di eleganza della nostra soluzione.

Configurazione client

installiamo openvpn su un client windows xp prelevando il windows installer dal sito http://www.openvpn.net
mettiamo il file p12 che ci e’ stato consegnato nel supporto che preferiamo (smart card o importazione nel repository di windows).
mettiamo il file cacert.pem in una directory. Per esempio c:/client/cacert.pem

passiamo a openvpn un file di configurazione come questo:


#### local.conf client###
# questo un client
client
# che usa il device tun
dev tun
# mediante il protocollo udp
proto udp
# si collega al server a questo indirizzo
remote xxx.xxx.xxx.xxx
# non effettua il bind
nobind
# definiamo la persistenza
persist-key
persist-tun
# il certificato della CA
ca c:/client/cacert.pem
# usiamo il gestore di certificati di win per cercare ed utilizzare il certificato che abbia all'interno del subject un campo con questo valore. Se abbiamo messo il certificato in una smart card sara' condizione necessaria e sufficiente inserire la smart card al momento di avviare il client OpenVPN.
cryptoapicert "SUBJ:mario rossi"
# compressione del trasporto
comp-lzo
# verbosity del log
verb 3

a questo punto si devono definire le rotte IP all’interno del tunnel e il gioco è fatto.

By Luca Sartoni

Team Lead at Automattic, WordPress contributor, co-organiser at WordCamp Europe, blogger, photographer, geek, nerd.

7 replies on “OpenVPN X509 – Windows XP vs Linux”

Si puo’ avere un sempio di come definire le rotte sia lato linux che windows? E’ la cosa che mi fa impazzire di piu’ e quella su cui sistematicamente mi infrango 🙁

ciao, io stavo cercando di seguire il tuo how-to per fare esattamente una vpn per roadwarriors, ma mi blocco subito:
firewall:/etc/openvpn# openssl rsa -in newreq.pem -out vpnserver.pem
unable to load Private Key
27192:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:644:Expecting: ANY PRIVATE KEY
firewall:/etc/openvpn#

ho googleato credo abbastanza ma non capisco che voglia, hai qualche idea per caso?

Grazie
M.

mi rispondo da solo 🙂
openssl rsa -in (chiave privata) -out nomechiave desiderata 🙂

grazie, scusate la fretta di scrivere ma credo che ci sia cascato qualcun altro e che ci vada una correzione 🙂

Grazie
M.

io ad oggi per le rotte non ho trovato un modo molto “pulito” ma di certo è funzionale…
ho creato uno script che in avvio tiri su le rotte (anche se lo faccio manualmente in quanto non funziona ancora benissimo) in ogni caso per far si che si vedano due interi network la rotta da aggiungere è la seguentesu linux :
route add -net 10.0.0.x/255.255.255.0 gw 175.26.0.x

dove 10.0.0.x/255.255.255.0 sono network e subnet della rete remota che si desidera raggiungere ed
gw 175.26.0.x è l’indirizzo dell’interfaccia remota che ha accesso al network 10.0.0.x

cioè se in locale abbiamo 192.168.0.0 come network e come ip vpn 175.26.0.1 ed in remoto 10.0.0.0 come network e come ip vpn 175.26.0.2 la rotta da aggiungere sarà

route add -net 10.0.0.0/255.255.255.0 gw 175.26.0.2

in parole povere bisogna impostare nella rotta come gateway l’indirizzo dell’interfaccia vpn remota.

Su windows la logica di funzionamento è la stassa cambia solo la sintassi del comando,
nel nostro esempio diventerebbe:
route ADD 10.0.0.0 MASK 255.255.255.0 175.26.0.2 -p

e da ricordarsi che in questo modo su windows la rotta verrà aggiunta permanentemente mentre su linux no al successivo riavvio sarà necessario reimpostarla.

spero di essere stato chiaro ed utile ciao a tutti

Leave a Reply