Certificati SSL con Apache+mod_ssl

Il logo di Apache Software FoundationIn questo post riporto alcuni miei vecchi appunti su come generare e installare un certificato SSL su un web server Apache 1.3.* con il modulo mod_ssl. Per informazioni più dettagliate e complete rimando alla documentazione che si trova all’indirizzo https://www.modssl.org/docs/ e alla pagina `man` di openssl. Una versione html di quest’ultima si trova all’indirizzo https://www.openssl.org/docs/.

Ricorrendo al toolkit `openssl` è possibile generare una chiave privata RSA, che in un secondo momento assoceremo ad un CSR (Certificate Signing Request). Vediamo come generare la chiave privata RSA e come assegnarla al webserver Apache. L’esempio che segue si riferisce alla distribuzione FreeBSD 6.0-RELEASE con Apache 1.3.33, ma è facilmente estendibile a qualsiasi altra piattaforma:

  1. Per prima cosa va creata la chiave privata RSA, ovvero una chiave a 1024 bit RSA che viene criptata mediante un DES triplo e salvata in un file .pem come testo ASCII. Per rendere più complesso il criptaggio e – di conseguenza – più sicura la chiave, utilizzeremo una serie di file come random seed. Si tratta di file qualsiasi che sono stati precedentemente compressi con `gzip`:
    $ openssl genrsa -des3 -rand file1:file2:file3:file4:file5 -out server.key 1024Verrà richiesta l’immissione di una password. È importantissimo conservare la password in un posto sicuro: se per qualsiasi motivo la password viene smarrita, la chiave generata sarà completamente inutilizzabile! Non si sottovaluti questa raccomandazione, perché un errore del genere può determinare l’esborso di una discreta somma di denaro: per generare un nuovo certificato a causa dello smarrimento di una chiave privata, la Certificate Authority a cui ci si è rivolti (ad esempio: VeriSign), Thawte, etc.) richiederà nuovamente il pagamento dell’importo già versato per il rilascio del certificato precedente. Si tratta di una somma che supera – nel momento in cui scrivo – i 400,00 EURO/anno!
  2. Dal momento che si è impostata una password per la chiave così generata, ad ogni riavvio di Apache sarà necessario immetterla o – meglio – passarla ad Apache mediante un semplice script bash che può essere richiamato direttamente in httpd.conf:
    SSLPassPhraseDialog exec:/usr/local/etc/apache/password.shLo script sarà semplicemente qualcosa di simile a quanto segue:
    #!/bin/sh
    echo "password123"
    . Se non si vuole utilizzare alcuna password (scelta sconsigliata!!!) resta sempre la possibilità di rimuovere il criptaggio a DES triplo dalla chiave. Se si opta per una soluzione simile, ci si assicuri almeno che la chiave sia leggibile soltanto da root: se altri dovessero riuscire ad ottenere la chiave privata decriptata, il certificato ad essa associato andrà revocato immediatamente, per ovvi motivi. Detto questo, ecco come rimuovere il criptaggio dalla chiave:
    $ openssl rsa -in server.key -out server.pem

Ora che abbiamo la chiave privata, possiamo generare il CSR (Certificate Signing Request). Il CSR potrà essere utilizzato in due modi:

  • Inviando il CSR ad una Certificate Authority, questa verificherà l’identità del richiedente e rilascerà un certificato firmato
  • Utilizzando il CSR per generare un certificato autoprodotto

Ci occupiamo qui della seconda ipotesi: il caso in cui il CSR venga utilizzato per generare un certificato autoprodotto, ovvero non riconosciuto da alcuna Certificate Authority. Certificati di questo tipo non danno al navigatore alcuna garanzia di attendibilità, ma sono tecnicamente equivalenti ai certificati veri e propri e permettono quindi garantire la massima sicurezza nella trasmissione/ricezione di dati durante la navigazione.

Durante la procedura di creazione del CSR verranno richieste alcune informazioni mediante semplici prompt testuali. Queste informazioni andranno poi a costituire gli attributi X.509 del certificato. Il dato più importante da immettere riguarda il “Common Name (e.g., YOUR name)” che deve corrispondere al FQDN (Fully Qualified Domain Name) del server per il quale verrà effettuata la connessione protetta SSL. Il comando per generare il CSR è il seguente:

$ openssl req -new -key server.key -out server.csrFatto questo, si procede generando il certificato autoprodotto mediante il comando:

$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crtIl certificato così prodotto avrà una validità di 10 anni.

Non resta ora che apportare le modifiche alla configurazione del webserver Apache. Va innanzitutto individuata la directory in cui spostare il certificato, nel nostro caso:

/usr/local/apache/etc/ssl.crt/
/usr/local/apache/etc/ssl.key/

Una volta spostati i certificati è sufficiente modificare il file httpd.conf in maniera tale che, ad ogni riavvio di Apache, vengano caricate le impostazioni per i Virtual Host che devono rispondere anche in SSL. Ecco un esempio abbastanza semplice che lavora sulla porta standard 443:

# SSL Virtual Hosts
<IfDefine SSL>
<VirtualHost _default_:443>
ServerAdmin webmaster@agliardi.it
DocumentRoot /usr/local/apache/share/htdocs
ServerName www.agliardi.it
ScriptAlias /cgi-bin/ /usr/local/apache/share/htdocs/cgi-bin/
SSLEngine on
SSLCertificateFile /usr/local/apache/etc/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/etc/ssl.key/server.pem
SSLPassPhraseDialog exec:/usr/local/etc/apache/password.sh
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /usr/local/apache/var/log/ssl_request_log
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x "%r" %b"
</VirtualHost>
</IfDefine>
Queste istruzioni provocano la creazione di un Virtual Host SSL chiamato www.agliardi.it e accessibile sulla porta 443, all’indirizzo IP di default del webserver. Si possono aggiungere tutti i Virtual Host SSL di cui si ha bisogno, ma va fatta attenzione a specificare una porta differente per ognuno di loro! A meno che non si abbia a disposizione un indirizzo IP dedicato per ogni dominio, il che capita piuttosto raramente.

Non resta ora che riavviare Apache e puntare il browser all’indirizzo https://www.agliardi.it!

Condivido

Leave a comment