it-swarm-eu.dev

Configurare l'autenticazione reciproca SSL (bidirezionale)

Molti tutorial, molte pagine, molte domande e differiscono nell'implementazione di questo problema "Configura autenticazione reciproca SSL (bidirezionale". Devo farlo con Linux e non so da dove iniziare o quali istruzioni seguire.

Quello che devo fare è:

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

Avevo capito cosa fare

  1. generare certificato CA
  2. generare certificati per altri utenti.
  3. dare certificato agli utenti.
  4. firmare certificati.
  5. verifica certificato.
  6. rigenerare 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 bash pronto per questo? dove posso trovarlo. Perché c'è più di un file openssl.cnf su Linux? dove dovrei mettere il certificato CA ogni informazione sarebbe apprezzata.

25
SafeY

C'è un utile script distribuito insieme a openssl, CA.sh Per fare la maggior parte di queste cose. La sua posizione è specifica per la distribuzione. In Debian e derivati ​​puoi trovarlo 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 guardare il codice per sapere cosa sta realmente facendo.

# ./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 è possibile fornire un file di configurazione come argomento per 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 trovarlo con gli stessi comandi sopra. Quello che vuoi è quello fornito dal pacchetto openssl.

Probabilmente vuoi 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
  • Generare la CA

Dopo aver modificato openssl.cnf Per soddisfare le tue esigenze, puoi generare un certificato CA. A seconda che sia necessaria o meno questa CA firmata da una CA di terze parti riconosciuta, è possibile generare una CA autofirmata o un CSR da inviare per la firma.

./CA.sh -newca

Verrà richiesto in modo interattivo di porre alcune domande, le impostazioni predefinite verranno visualizzate tra parentesi quadre. Riconoscerai le opzioni modificate 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

Ancora una volta, ti verrà chiesto di porre 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 ridimensionare)

Ciò che otterrai è una richiesta di firma del certificato (abbreviazione CSR). Questo sarà firmato dall'autorità di certificazione (CA) creata in precedenza.

./CA.sh -sign

  • Genera certificati per i clienti

Ripeti i passaggi per creare un CSR e farlo firmare dalla CA. Nel fare ciò, prestare molta attenzione a come compilare i campi Nome comune, Organizzazione e Unità organizzativa, poiché saranno richiesti in seguito per configurare il server.

Un modo semplice per distribuire i certificati client insieme alle rispettive chiavi private e il certificato CA sta utilizzando 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 riferisci sia un server Web Apache. Una volta ottenuto il certificato del server, si configura il VHOST appropriato per servire qualunque contenuto sarà 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 rivedilo e testalo attentamente 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>

Puoi utilizzare tutti i controlli di accesso per directory di cui hai bisogno, la parte importante è che i certificati client mostrati devono essere conformi alle restrizioni imposte dalle direttive SSLRequire, cioè devono corrispondere a Organizzazione, Unità organizzativa e Condizioni comuni del nome (o altri campi del certificato come ritieni opportuno). 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 della CA):

openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem

Successivamente, revoca i certificati client secondo necessità utilizzando:

openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem

Riferimenti:

OpenSSL documentazione online e Apache documentazione online.

18
dawud