i certificati client emesso dal mio CA con Apache

Cercando di ottenere una sessione HTTPS di lavoro utilizzo di client certificati self-signed CA. La connessione deve verificare che tutti i certificati sono validi, sia il client che lato server.

Il processo che ho seguito è ingaggiata come segue:

  1. Creazione Di Autorità Di Certificazione

    openssl genrsa -out CA.key 4096
    openssl req -new -key CA.key -out CA.csr
    openssl x509 -req -days 365 -in CA.csr -out CA.crt -signkey CA.key
    
  2. Creare Il Certificato Del Server Di

    openssl genrsa -out server.key 4096
    openssl req -new -key server.key -out server.csr
    openssl ca -in server.csr -cert CA.crt -keyfile CA.key -out server.crt
    
  3. Creare Certificato Client

    openssl genrsa -out client.key 4096
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -cert CA.crt -keyfile CA.key -out client.crt
    
  4. Configurare Apache

    <VirtualHost _default_:443>
      SSLEngine on
      SSLCertificateFile "server.crt"
      SSLCertificateKeyFile "server.key"
      SSLCACertificateFile "CA.crt"
      <Directory "/var/www">
          SSLVerifyClient optional
          SSLVerifyDepth 10
          SSLOptions +StdEnvVars +ExportCertData
      </Directory>
    </VirtualHost>  
    

Ora provo a fare un test di connessione:

wget \
    --post-data 'id=1234' \
    --certificate=client.crt \
    --ca-certificate=CA.crt  \
    https://test.example.com:443

L’output risultante dal wget mostra (più e più volte), in parte:

HTTP request sent, awaiting response... No data received.
Retrying.

Controllo SSL log degli errori di Apache mi danno i seguenti messaggi:

[debug] ssl_engine_io.c(1606): [client xx.xx.xx.xx] total of 41 bytes in buffer, eos=1
[client xx.xx.xx.xx] Requesting connection re-negotiation
[debug] ssl_engine_io.c(1908): OpenSSL: I/O error, 5 bytes expected to read on BIO#80b075190 [mem: 80b0ca003]
[debug] ssl_engine_kernel.c(771): [client xx.xx.xx.xx] Performing full renegotiation: complete handshake protocol (client does support secure renegotiation)
[debug] ssl_engine_kernel.c(1892): OpenSSL: Handshake: start
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: SSL renegotiate ciphers
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: SSLv3 write hello request A
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: SSLv3 flush data
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: SSLv3 write hello request C
[info] [client xx.xx.xx.xx] Awaiting re-negotiation handshake
[debug] ssl_engine_kernel.c(1892): OpenSSL: Handshake: start
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: before accept initialization
[debug] ssl_engine_io.c(1908): OpenSSL: I/O error, 5 bytes expected to read on BIO#80b075190 [mem: 80b0ca003]
[debug] ssl_engine_kernel.c(1929): OpenSSL: Exit: error in SSLv3 read client hello B
[error] [client xx.xx.xx.xx] Re-negotiation handshake failed: Not accepted by client!?
[debug] ssl_engine_io.c(1650): [client xx.xx.xx.xx] read from buffered SSL brigade, mode 0, 8192 bytes
[debug] ssl_engine_io.c(1725): [client xx.xx.xx.xx] buffered SSL brigade exhausted
[debug] ssl_engine_io.c(1650): [client xx.xx.xx.xx] read from buffered SSL brigade, mode 2, 0 bytes
[info] [client XX:XX:XX:XX::xx] Connection to child 3 established (server register.kiosk.tain.com:443)
[info] Seeding PRNG with 656 bytes of entropy
[debug] ssl_engine_kernel.c(1892): OpenSSL: Handshake: start 
[debug] ssl_engine_kernel.c(1900): OpenSSL: Loop: before/accept initialization

Eseguire il openssl client per vedere se c’è qualcosa per aiutare qui:

openssl s_client \
    -showcerts \
    -connect test.example.com:443 \
    -cert client.crt \
    -key client.key \
    -CAfile CA.crt

Nella risposta vedo il seguente:

---
Server certificate
subject=/C=XX/ST=XXXXX/O=XXXX/CN=test.example.com
issuer=/O=XXXX/L=XXXXX/ST=XXXXX/C=SE/CN=XXXX Certificate Authority
---
No client certificate CA names sent
---
SSL handshake has read 3846 bytes and written 519 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit

“Nessun client certificato CA nomi inviato” un aspetto diverso a quello che sto aspettando. Voglio i certificati client.

Dove sto andando di male?

Probabilmente meglio in ServerFault.

OriginaleL’autore user2919956 | 2013-10-25

One Reply
  1. 2

    Non ha davvero senso parlare di un “self-signed “CA”. Il titolo (“Self-signed certificati SSL client […]“) suggerisce che si sta parlando di auto-firmato il certificato del client. Non siete: stai parlando di client certificati rilasciati dal proprio CA.

    Hai messo il tuo SSLVerifyClient direttiva all’interno di un Directory sezione, che implica una ri-negoziazione per ottenere il certificato client, una volta che il cliente ha fatto una richiesta cercando di accedere alla directory.

    Poiché non vi è alcuna DocumentRoot direttiva nella configurazione, non è chiaro se una richiesta su / si tenta di accedere a questa directory (questo può dipendere opzioni di compilazione, a seconda di come è stato confezionato, ma /var/www non è il valore di default altrimenti).

    Mettere SSLVerifyClient direttamente nel tuo host virtuale dovrebbe almeno fare openssl s_client vedere un cliente-richiesta di certificato. Fissare il DocumentRoot potrebbe non essere sufficiente, dato che avresti bisogno di fare la richiesta HTTP per attivare la rinegoziazione.

    OriginaleL’autore Bruno

Lascia un commento