Configura l'autenticazione reciproca SSL (bidirezionale)

25

Un sacco di tutorial, un sacco di pagine, un sacco di domande e differiscono nell'implementazione di questo problema " Configura l'autenticazione reciproca SSL (bidirezionale) ". Devo farlo con Linux, e non so da dove cominciare o quali istruzioni seguire.

Quello che devo fare è:

  • Ho un server e molti client, possono accedere al codice solo sul server se hanno un certificato firmato dal server.
  • Il server
  • può generare tali certificati e disabilitarli server principale sarebbe la CA .. che significa che deve generare certificati per altri e poi firmarli.

Avevo capito cosa fare

  1. genera certificato CA
  2. genera certificati per altri utenti.
  3. dai un certificato agli utenti.
  4. firma i certificati.
  5. verifica il certificato.
  6. rigenera certificato per utente o disabilitato.
  7. l'utente può semplicemente firmare da un dispositivo. (il certificato non deve essere copiato)

Ho perso qualcosa? devo essere un utente root? c'è qualche bomba pronta per questo? dove posso trovarlo. perché c'è più di un file openssl.cnf su linux? dove dovrei mettere il certificato CA qualsiasi informazione sarebbe apprezzata.

    
posta SafeY 26.04.2013 - 16:26
fonte

1 risposta

17

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
  • Genera CA

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

  • Configura il server

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.

    
risposta data 27.04.2013 - 13:46
fonte

Leggi altre domande sui tag