2013-10-25 9 views
6

versucht, eine HTTPS-Sitzung mit Client-Zertifikaten von einer selbstsignierten Zertifizierungsstelle arbeiten. Die Verbindung sollte überprüfen, ob alle Zertifikate gültig sind, sowohl auf Client- als auch auf Serverseite.Client-Zertifikate von meiner eigenen CA mit Apache

Der Prozess folgte ich rundweg sich wie folgt:

  1. erstellen Certificate Authority

    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. erstellen Serverzertifikat

    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. erstellen Client-Zertifikat

    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. konfigurieren 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> 
    

Jetzt versuche ich, und eine Testverbindung zu machen:

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

Die resultierende Ausgabe von wget zeigt (über und über), teilweise:

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

Überprüfung der SSL-Fehlerprotokoll von Apache geben Sie mir die folgenden Meldungen:

[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 

die OpenSSL-Client ausführen, um zu sehen, ob es etwas ist hier drin zu helfen:

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

In der Antwort ich folgendes sehen:

"Keine Client-Zertifikat CA-Namen gesendet" sieht anders aus, was ich erwarte. Ich möchte Client-Zertifikate.

Wohin gehe ich falsch?

+0

Wahrscheinlich besser auf ServerFault. – Bruno

Antwort

2

Es macht nicht wirklich Sinn, über eine "selbstsignierte CA" zu sprechen. Ihr Titel ("Self-signed client SSL-Zertifikate [...]") schlägt vor, dass Sie über selbstsignierte Client-Zertifikat sprechen. Sie sind nicht: Sie sprechen über Client-Zertifikate, die von Ihrer eigenen Zertifizierungsstelle ausgestellt wurden.

Sie haben Ihre SSLVerifyClient-Anweisung in einen Directory-Abschnitt eingefügt, der eine Neuaushandlung zum Abrufen des Clientzertifikats nach sich ziehen würde, sobald der Client eine Anforderung zum Zugriff auf dieses Verzeichnis erstellt hat.

Da es keine DocumentRoot Richtlinie in Ihrer Konfiguration ist, ist es nicht klar, ob ein Antrag auf / wird versuchen, dieses Verzeichnis zugreifen (diese auf Kompilierungsoptionen abhängen können, je nachdem wie es verpackt wurde, aber /var/www ist nicht der Standardwert Andernfalls).

Putting SSLVerifyClient direkt in Ihrem virtuellen Host sollte zumindest openssl s_client eine Client-Zertifikat-Anforderung machen sehen.Das Korrigieren der DocumentRoot ist möglicherweise nicht genug, da Sie die HTTP-Anforderung auslösen müssen, um die Neuverhandlung auszulösen.