C'è un comodo script distribuito insieme a openssl, CA.sh
per fare la maggior parte di questa roba. La sua posizione è specifica per la distribuzione. In Debian e derivati puoi localizzarlo usando:
# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh
E RedHat e derivati l'equivalente (approssimativo) è:
# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo : @updates
Matched from:
Filename : /etc/pki/tls/misc/CA
Questo è uno script bash molto semplice che facilita la creazione della struttura di directory necessaria per gestire una CA (questo è descritto nella sezione [ CA_default ]
di openssl.cnf). Ti consiglio di usarlo e guarda il codice per imparare cosa sta facendo in realtà.
# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify
Questo script utilizzerà i valori predefiniti forniti in openssl.cnf e / o puoi fornire un file di configurazione come argomento a openssl $command
utilizzando l'opzione -config
se non si utilizza CA.sh
.
Anche la posizione del file openssl.cnf
è specifica per la distribuzione, e puoi usare gli stessi comandi sopra per trovarla. Quello che vuoi è quello fornito dal pacchetto openssl
.
Probabilmente vorrai modificare le seguenti sezioni:
[ CA_default ]
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
[ req ]
default_bits = 2048
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
Dopo aver modificato openssl.cnf
in base alle proprie esigenze, è possibile generare un certificato CA. A seconda che tu abbia bisogno che questa CA sia firmata da una CA di terze parti riconosciuta o meno, puoi generare una CA autofirmata o una CSR da inviare per la firma.
./CA.sh -newca
Ti verrà chiesto in modo interattivo di porre alcune domande, i valori predefiniti verranno visualizzati tra parentesi quadre. Riconoscerai le opzioni che hai modificato in openssl.cnf
qui.
- Genera un certificato per il server
È possibile creare una richiesta di certificato per il server utilizzando lo stesso script:
./CA.sh -newreq
Anche in questo caso ti verrà chiesto di fare diverse domande, la più importante è il nome comune del certificato, che deve corrispondere al nome risolvibile DNS per l'IP del server (oppure puoi usare altri mezzi, come /etc/hosts
, non raccomandato, difficile da mantenere e scalare)
Quello che otterrete è una richiesta di firma del certificato (CSR in breve). Questo sarà firmato dall'autorità di certificazione (CA) che hai creato prima.
./CA.sh -sign
- Genera certificati per i clienti
Ripeti i passaggi per creare un CSR e fargli firmare dalla CA. Nel fare ciò, prestate molta attenzione a come compilate i campi Nome comune, Organizzazione e Unità organizzativa, poiché in seguito saranno necessari per configurare il server.
Un modo pulito per distribuire i certificati client insieme alle rispettive chiavi private e il certificato CA utilizza i bundle p12:
openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem
-out clientcert.p12
Supponiamo che il server a cui ti stai riferendo sia un server Web Apache. Una volta ottenuto il certificato del server, si configura il VHOST
appropriato per servire qualsiasi contenuto verrà protetto dall'autenticazione SSL reciproca. Un esempio potrebbe essere questo phpmyadmin
host virtuali. Funziona su un server Apache 2.4, quindi per favore non usarlo così com'è e rivederlo attentamente e testarlo per adattarlo alle tue esigenze.
Listen 443 https
<VirtualHost 120.120.120.120:443>
DocumentRoot "/srv/www/html"
ServerAdmin [email protected]
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCertificateFile /etc/pki/tls/private/phpmyadmin.company.com/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/private/phpmyadmin.company.com/newkey.pem
SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem
SSLEngine on
SSLStrictSNIVHostCheck on
SSLVerifyClient require
SSLVerifyDepth 5
ServerName phpmyadmin.company.com
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule . - [F]
Alias /console /usr/share/phpMyAdmin
ErrorLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/error.log -f /var/log/httpd/phpmyadmin/error.log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/access.log -f /var/log/httpd/phpmyadmin/access.log.%Y%m%d 86400" logstash_json
<Directory /usr/share/phpMyAdmin/>
Require ssl
Require ssl-verify-client
SSLRequireSSL
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 256
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
and %{SSL_CLIENT_S_DN_OU} eq "Development" \
and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
SSLRenegBufferSize 131072
</Directory>
</VirtualHost>
È possibile utilizzare il controllo di accesso per directory come necessario, la parte importante è che i certificati client mostrati devono rispettare le restrizioni imposte dalle direttive SSLRequire
, cioè devono corrispondere all'Organizzazione, Unità organizzativa e Condizioni di Common Name (o altri campi del certificato come meglio credi). Questi campi sono presi dai certificati client.
- Genera un elenco di revoche di certificati
Per poter revocare l'accesso a un certificato client, è necessario generare un CRL.
Il comando per farlo (fornito nella parte superiore della struttura della directory CA):
openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem
Successivamente, puoi revocare i certificati client secondo necessità utilizzando:
openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem
References:
OpenSSL documentazione online e Apache documentazione online.