2013-10-25 2 views
6

Попытка получить сеанс HTTPS, работающий с использованием клиентских сертификатов от самозаверяющего ЦС. Соединение должно проверить, что все сертификаты действительны, как на стороне клиента, так и на стороне сервера.клиентских сертификатов, выданных моим собственным CA с Apache

процесс я последовал за это округло следующим образом:

  1. Создание сертификата 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. Создание сертификата сервера

    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. Создание сертификата клиента

    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. Настройка 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> 
    

Сейчас я пытаюсь сделать тест соединения:

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

Результирующий вывод Wget шоу (снова и снова), в части:

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

Проверка журнала ошибок SSL с Apache дает мне следующие сообщения:

[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 

Запуск клиента OpenSSL, чтобы проверить, есть ли что-нибудь, чтобы помочь здесь:

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

В ответ я вижу следующее:

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

«Отсутствие сертификата клиента, присланного клиентом», выглядит иначе, чем я ожидаю. Я хочу получить сертификаты клиентов.

Куда я иду не так?

+0

Вероятно, лучше на ServerFault. – Bruno

ответ

2

На самом деле не имеет смысла говорить о «самозанятом ЦС». Ваш заголовок («» Самоподписанные клиентские SSL-сертификаты [...] ») предполагает, что вы говорите о самоподписанном клиентском сертификате. Вы не: вы говорите о клиентских сертификатах, выданных вашим собственным центром сертификации.

Вы указали свою директиву SSLVerifyClient в разделе Directory, что означало бы повторное согласование для получения сертификата клиента, как только клиент сделал запрос, пытающийся получить доступ к этому каталогу.

Поскольку нет DocumentRoot директивы в конфигурации, это не ясно, будет ли запрос на / будет пытаться получить доступ к этому каталогу (это может зависеть от параметров компиляции в зависимости от того, как он был упакован, но /var/www не значение по умолчанию в противном случае).

Ввод SSLVerifyClient непосредственно на ваш виртуальный хост должен по крайней мере сделать openssl s_client см. Запрос клиента-сертификата.Фиксации DocumentRoot может быть недостаточно, так как вам нужно будет сделать запрос HTTP, чтобы вызвать повторное обсуждение.

Смежные вопросы