
Negli articoli precedenti di questa serie è stato mostrato come configurare HaAProxy per servire da bastione SSH e come configurare i templates della Windows Enterprise CA per distribuire i certificati dei clients mediante Active Directory.
In questo articolo verranno mostrati i passaggi per configurare i propri clients per collegarsi ai server in SSH passando da bastione ed autenticandosi con i certificati forniti dalla Enterprise CA.
Verrà proposta una configurazione cross-platform che sfrutta OpenSSL che però abbiamo riscontrato avere delle pessime performance su Windows, perciò verrà anche analizzata una configurazione più prestante sul sistema operativo di Microsoft che utilizza il software Stunnel.
REQUISITI
Al fine di poter procedere è necessario essere in possesso di una coppia di chiavi rilasciate dalla CA considerata attendibile da HAProxy per l’autenticazione mediante mTLS.
Se si ha seguito l’articolo precedente si dovrebbe essere in possesso di un certificato valido e la relativa chiave privata nel proprio Trust Store, nei prossimi passaggi verrà mostrato come entrarre la coppia di chiavi per utilizzarle per l’autenticazione con HAProxy.
Linux e MacOS vengono distribuiti con il comando ssh ed il comando openssl pronti all’uso, su Windows, invece, potrebbe essere necessario installare del software aggiuntivo.
Inoltre, per l’utilizzo di Stunnel è necessario installare il relativo pacchetto ed il software ncat, oltre che essere in possesso di una copia del certificato della CA, utilizzata su HAProxy per la validazione dei certificati dei clients, in formato PEM.
Infine si consiglia la lettura del seguente articolo al fine di comprendere meglio il funzionamento della configurazione del client SSH.
Configurazione del client SSH per superare i firewall su Windows, Linux e MacOS
INSTALLAZIONE SSH SU WINDOWS
Il client SSH è una Windows Capability a partire da Windows 10 ed è possibile abilitarlo mediante PowerShell.
Per verificare se la funzionalità è già attiva eseguire il seguente comando in una PowerShell amministrativa:
|
0 |
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
|
Se il client è abilitato l’output mostrato dovrebbe essere simile al seguente:
|
0
1
|
Name : OpenSSH.Client~~~~0.0.1.0
State : Installed
|
Altrimenti, è possibile installarlo con il seguente comando:
|
0 |
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 |
INSTALLAZIONE OPENSSL SU WINDOWS
Mediante PowerShell è possibile verificare se “openssl” è presente sulla propria macchina, per farlo eseguire in una PowerShell con il proprio utente (non da ) il seguente comando:
|
0 |
Get-Command openssl
|
Se è installata la versione nativa per Windows di OpenSSL l’output dovrebbe essere simile al seguente:
|
0
1
2
|
CommandType Name Version Source
----------- ---- ------- ------
Application openssl.exe 3.6.0.0 C:\Program Files\OpenSSL-Win64\bin\openssl.exe
|
È possibile che si stia utilizzando un eseguibile fornito insieme a msys64, in questo caso è possibile installare la versione nativa e modificare il PATH di sistema per puntare alla versione appena installata.
Per installare OpenSSL mediante Chocolatey è possibile eseguire il seguente comando in una PowerShell amministrativa:
|
0 |
choco install -y openssl
|
In alternativa il programma di installazione è disponibile sul sito di Shining Light Productions
Al termine dell’installazione potrebbe essere necessario chiudere la PowerShell e riaprirla prima di poter utilizzare openssl.
ESPORTAZIONE DI UN CERTIFICATO CON CHIAVE PRIVATA DAL PERSONAL TRUST STORE
Nel precedente articolo di questa serie è stato mostrato come richiedere un certificato dallo snap-in certmgr.msc ed importarlo nel Personal Trust Store.
Per poterlo utilizzare dal browser sarebbe sufficiente, tuttavia non è lo stesso caso per il protocollo SSH, perciò necessitiamo di esportarlo.
Per esportare un certificato e la relativa chiave privata è necessario selezionarlo, effettuare click destro, navigare con il mouse su All Tasks e selezionare Export:
Procedere cliccando su Next:
Selezionare Yes, export the private key e cliccare su Next:
Selezionare Export all extended properties e procedere cliccando su Next:
Abilitare Password, sceglierne una e scriverla due volte, modificare l’agoritmo di criptografia in AES256-SHA256 e cliccare su Next:
Cliccare su Browse, selezionare il percorso in cui si vuole esportare il file, poi procedere cliccando su Next:
Concludere la procedura cliccando su Finish:
Infine, confermare cliccando su OK:
ESTRAZIONE DI UNA COPPIA DI CHIAVI DA UN FILE PFX
L’esportazione di una coppia di chiavi (certificato + chiave privata) dallo snap-in di Windows richiede che venga configurata una password o che vengano configurate delle ACL e che il formato dell’output sia PFX.
Per poter utilizzare il mTLS mediante OpenSSL o Stunnel è necessario essere in possesso di due files in formato PEM, perciò bisogna procedere all’estrazione del certificato e della chiave privata dal file PFX.
I comandi mostrati in questo paragrafo sono compatibili con Linux e MacOS.
Il file PFX utilizzato per esempio si chiama user.pfx, è necessario sostituire il nome opportunamente nei propri comandi; inoltre, si assume che la PowerShell o il CMD venga aperto nella directory in cui è stato salvato il file PFX.
Per estrarre il certificato eseguire con il proprio utente in una PowerShell o in un CMD:
|
0 |
openssl pkcs12 -in user.pfx -clcerts -nokeys -out user.crt
|
Inserire la password che si è scelta durante l’esportazione.
Per estrarre la chiave privata eseguire con il proprio utente in una PowerShell o in un CMD:
|
0 |
openssl pkcs12 -in user.pfx -nocerts -nodes -out user.key
|
Inserire la password scelta durante l’esportazione.
CONFIGURAZIONE DEL TUNNEL CON OPENSSL
Per configurare un client per utilizzare il bastione per connettersi ad un server è sufficiente aggiungere una direttiva al proprio file ~/.ssh/config.
Se non esiste la directory .ssh nella propria HOME (tipicamente su Linux /home/<username> e su Windows C:\Users\<username>) è necesario crearla ed assicurarsi che solo il proprio utente ci possa accedere.
Su Windows si consiglia fortemente di disabilitare l’ereditarietà dei permessi su quella folder e di assegnare solamente tre ACL Full control al proprio utente, a SYSTEM e agli Administrators.
Nella directory .ssh creare, se non già esiste, un file di testo (senza estensione) chiamato config, in questo file è possibile configurare le connessioni SSH verso i propri servers.
Aggiungere o modificare nel file config l’host a cui ci si vuole collegare mediante il bastione aggiungendo la direttiva ProxyCommand, in seguito viene riportato un esempio:
|
0
1
2
3
|
Host local-srv01 alias01
HostName local-srv01.pizza.local
User root
ProxyCommand openssl s_client -servername local-srv01.pizza.local -connect 192.168.1.100:22 -cert ~/.ssl/user.crt -key ~/.ssl/user.key -quiet -verify_quiet
|
Le informazioni da modificare dall’esempio precedente sono le seguenti:
- local-srv01 alias01 sostituire con i nomi che si vogliono utilizzare per collegarsi dal client ssh (eg. ssh alias01)
- local-srv01.pizza.local sostituire con l’FQDN del server a cui ci si vuole collegare, vicino ad HostName si può inserire anche solo l’hostname, oppure un alias
- root sostituire con l’utenza con cui ci si vuole autenticare
- 192.168.1.100 sostituire con l’IP o il nome DNS del VIP di HAProxy o dell’IP esposto mediante NAT
- ~/.ssl/user.crt sostituire con il percorso del certificato del client
- ~/.ssl/user.key sostituire con il percorso della chiave privata del client
Se tutto è stato configurato correttamente è possibile collegarsi al server remoto da un terminale eseguendo:
|
0 |
ssh <hostname>
|
Ad esempio:
|
0 |
ssh local-srv01
|
INSTALLAZIONE DEL SOFTWARE AGGIUNTIVO PER STUNNEL
Abbiamo riscontrato che il tunnel effettuato con OpenSSL su Windows ha delle pessime performace e che questo causa dei fastidiosi rallentamenti quando vengono lanciati dei comandi nella sessione SSH.
Per ovviare a questa problematica è possibile implementare il tunner mediante altri software che facciano utilizzo del provider di criptografia nativo di Windows, un esempio di questi software è Stunnel.
Un amministratore, mediante dei files di configurazione, può impostare le connessioni da utilizzare come tunnels e gli utenti possono avviarli da interfaccia grafica, per poi connettersi in SSH come farebbero con il tunnel OpenSSL.
Affinché sia possibile instradare le connessioni SSH verso il tunnel è necessario un software aggiuntivo, ne esistono diversi che svolgono questo ruolo, noi abbiamo testato ncat.
Il software ncat è incluso con l’installazione per Windows di Nmap, tuttavia se non si volesse installare anche Nmap sarebbe possibile effettuare il download dell’eseguibile statico dal sito ufficiale https://nmap.org/ncat/
L’installazione di Nmap mediante Chocolatey necessita di AutoHotkey ed a volte per questo motivo non funziona correttamente, in questi casi si consiglia di utilizzare l’installer ufficale preso dal sito web.
Per installare Nmap con Chocolatey eseguire in una PowerShell amministrativa il seguente comando:
|
0 |
choco install -y nmap
|
L’installazione di Stunnel mediante Chocolatey funziona correttamente, però è comunque possibile effettuarla con un software di installazione ufficiale scaricabile dal sito ufficiale https://www.stunnel.org/downloads.html
Per installare Stunel con Chocolatey eseguire in una PowerShell amministrativa il seguente comando:
|
0 |
choco install -y stunnel
|
CONFIGURAZIONE DI STUNNEL
Prima di partire con la configurazione di Stunnel è necessario copiarsi in una cartella a piacere il certificato della CA ed il certificato e la chiave privata del client, tutti in formato PEM.
La procedura di esportazione del certificato dell’utente è stata mostrata nei paragrafi precedenti, invece il certificato della CA è stato utilizzato nel primo articolo di questa serie, quando è stata mostrata la configurazione di HAProxy.
Per aprire la configurazione di Stunnel è possibile eseguire Edit stunnel.conf dal menù Start:
Oppure, in alternativa, è possibile aprire il file C:\Program Files (x86)\stunnel\config\stunnel.conf con un editor di testo con privilegi amministrativi.
Nel file di configurazione decommentare la seguente riga:
|
0 |
include = conf.d
|
Inoltre, nello stesso file, commentare tutti gli esempi di default, come ad esempio:
|
0
1
2
3
4
5
6
7
|
;[gmail-pop3]
;client = yes
;accept = 127.0.0.1:110
;connect = pop.gmail.com:995
;verifyChain = yes
;CAfile = ca-certs.pem
;checkHost = pop.gmail.com
;OCSPaia = yes
|
Nella cartella C:\Program Files (x86)\stunnel\config\conf.d è possibile aggiungere i files di configurazione dei tunnels.
Per creare la cartella e le configurazioni è possibile utilizzare lo stesso blocco note che si stava utilizzando per modificare il file stunnel.conf, per farlo aprire un nuovo tab cliccando sul simbolo + in alto:
Incollare il seguente contenuto:
|
0
1
2
3
4
5
6
7
8
9
|
[local-srv01]
client = yes
verifyChain = yes
accept = 127.0.0.1:22100
connect = 192.168.1.100:22
sni = local-srv01.pizza.local
checkHost = local-srv01.pizza.local
CAfile = C:\SSL\MyLocalCA.crt
cert = C:\SSL\user.crt
key = C:\SSL\user.key
|
Le informazioni da modificare dall’esempio precedente sono le seguenti:
- 22100 sostituire con la porta che deve essere dedicata al tunnel, su cui Stunnel si deve mettere in ascolto
- local-srv01.pizza.local sostituire con l’FQDN del server a cui ci si vuole collegare
- 192.168.1.100 sostituire con l’IP o il nome DNS del VIP di HAProxy o dell’IP esposto mediante NAT
- C:\SSL\MyLocalCA.crt sostituire con il percorso del certificato della CA
- C:\SSL\user.crt sostituire con il percorso del certificato del client
- C:\SSL\user.key sostituire con il percorso della chiave privata del client
È possibile specificare più di un tunnel nello stesso file a patto che il nome tra le parentesi quadrate sia univoco, per ogni server protetto dal bastione bisogna configurare un tunnel dedicato che utilizzi una porta su cui mettersi in ascolto univoca (in questo caso la 22100).
Cliccare su File e poi su Save with name:
Navigare al percorso C:\Program Files (x86)\stunnel\config, creare la folder conf.d cliccando su New folder e navigarci all’interno:
Nella folder conf.d salvare il file con un nome a piacere che abbia l’estensione .conf:
Per avviare i tunnels è possibile eseguire stunnel GUI Start dal menù Start:
In caso di problemi di configurazione viene aperta una finestra simile alla seguente in cui è indicato l’errore:
In questi casi correggere l’errore, cliccare su Configuration nella UI di Stunnel e poi su Reload Configuration:
Mentre Stunnel è in esecuzione è possibile visualizzare la sua interfaccia grafica cliccando sulla sua icona in basso a destra:
Per fermare i tunnels è possibile eseguire stunnel GUI Stop dal menù Start:
CONFIGURAZIONE DEL TUNNEL CON STUNNEL
Dopo aver configurato Stunnel è possibile impostare il client SSH per instradare le connessioni verso di esso.
Per farlo, analogamente a come è stato descritto nel paragrafo CONFIGURAZIONE DEL TUNNEL CON OPENSSL è necessario aggiungere una direttiva al proprio file ~/.ssh/config.
Se non si ha già creato il file ~/.ssh/config seguire i primi passaggi del paragrafo CONFIGURAZIONE DEL TUNNEL CON OPENSSL per crearlo.
Aggiungere o modificare nel file config l’host a cui ci si vuole collegare mediante il bastione aggiungendo la direttiva ProxyCommand, in seguito viene riportato un esempio:
|
0
1
2
3
|
Host local-srv01 alias01
HostName local-srv01.pizza.local
User root
ProxyCommand ncat.exe 127.0.0.1 22100
|
Le informazioni da modificare dall’esempio precedente sono le seguenti:
- local-srv01 alias01 sostituire con i nomi che si vogliono utilizzare per collegarsi dal client ssh (eg. ssh alias01)
- local-srv01.pizza.local sostituire con l’FQDN, l’hostname o un alias del server a cui ci si vuole collegare
- root sostituire con l’utenza con cui ci si vuole autenticare
- 22100 sostituire con la porta del tunnel configurata su Stunnel per quello specifico server
Se tutto è stato configurato correttamente è possibile collegarsi al server remoto da un terminale eseguendo:
|
0 |
ssh <hostname>
|
Ad esempio:
|
0 |
ssh local-srv01
|
Se viene mostrato un errore simile al seguente:
|
0
1
|
CreateProcessW failed error:2
posix_spawnp: No such file or directory
|
Potrebbe essere causato dal fatto che ncat.exe non è ancora disponibile sul PATH, in questi casi si consiglia di disconnettere la sessione di Windows ed accedere nuovamente.
Se invece l’errore mostrato è simile al seguente:
|
0 |
Ncat: No connection could be made because the target machine actively refused it. .
|
Significa che probabilmente non è stato avviato correttamente Stunnel.
TROUBLESHOOTING ERRORI DI CONNESSIONE DAI LOGS DI HAPROXY
Se viene mostrato un errore simile al seguente durante la connessione:
|
0 |
Connection closed by UNKNOWN port 65535
|
È possibile che stiano avvenendo degli errori durante il TLS handshake e per verificarlo è possibile controllare i logs di HAProxy.
Collegarsi al nodo primario di HAProxy come root ed eseguire il seguente comando per visualizzare i logs:
|
0 |
journalctl -f -u haproxy.service
|
Se l’handshake fallisce a causa di uno SNI non supportato da HAProxy (ad esempio a causa del dominio del server errato), l’errore nei logs è simile al seguente:
|
0 |
Dec 26 19:24:34 haproxy01 haproxy[332609]: 192.168.1.10:59921 [26/Dec/2025:19:24:34.553] fe_ssh/1: SSL handshake failure (error:0A0000EA:SSL routines::callback failed)
|
Se, invece, l’handshake fallisce a causa di errore di autorizzazione l’errore nei logs è simile al seguente:
|
0 |
Jan 07 00:57:20 haproxy01 haproxy[1444]: 172.31.67.12:39484 [07/Jan/2026:00:57:18.747] fe_ssh~ be_ssh_all/<NOSRV> -1/-1/+2017 +0 PR 1/1/0/0/0 0/0 dstIP="-" dstName="my-local-server.pizza.local" dn="/DC=local/DC=pizza/OU=Admins/CN=VALLE Marco/[email protected]" emails=[marco.valle@pizza.com]
|
Mediante le informazioni contenute nel log è possibile verificare la DN e l’email del certificato del client, per poi controllare in seguito che l’utente sia autorizzato dalle ACL di HAProxy.



0 commenti