Назад | Перейти на главную страницу

Ошибка установления связи OpenSSL (14094410) - ошибочная проверка сертификата клиента с мобильного телефона

Я запускаю прокси-сервер через Apache с modssl, который мы используем для проксирования POST-сообщений с мобильных устройств на другой внутренний сервер. Это успешно работает для большинства клиентов, но запросы от конкретной модели телефона (Nokia 2690) показывают странный сбой при рукопожатии.

Похоже, что OpenSSL либо запрашивает (или пытается прочитать незапрошенный) сертификат клиента с телефона (что особенно странно, потому что реализация kssl j2me не поддерживает сертификаты клиентов). Я отключил клиентские сертификаты с помощью SSLVerifyClient none как в конфигурации виртуального хоста, так и в файле modssl conf. След из error.log на уровне отладки (подробности отредактированы):

[client 41.220.207.10] Connection to child 0 established (server www.myserver.org:443)
[info] Seeding PRNG with 656 bytes of entropy
[debug] ssl_engine_kernel.c(1866): OpenSSL: Handshake: start
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: before/accept initialization
[debug] ssl_engine_io.c(1882): OpenSSL: read 11/11 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d0] (BIO dump follows)
[debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1882): OpenSSL: read 49/49 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90db] (BIO dump follows)
[debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 read client hello A
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write server hello A
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write certificate A
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write server done A
[debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 flush data
[debug] ssl_engine_io.c(1882): OpenSSL: read 5/5 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d0] (BIO dump follows)
[debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1882): OpenSSL: read 2/2 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d5] (BIO dump follows)
[debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+
[debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+
[debug] ssl_engine_kernel.c(1879): OpenSSL: Read: SSLv3 read client certificate A
[debug] ssl_engine_kernel.c(1898): OpenSSL: Exit: failed in SSLv3 read client certificate A
[client 41.220.207.10] SSL library error 1 in handshake (server www.myserver.org:443)
[info] SSL Library Error: 336151568 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
[client 41.220.207.10] Connection closed to child 0 with abortive shutdown (server www.myserver.org:443)

Я пробовал временно включить все шифрование и все протоколы с помощью modssl, ни одна из которых, похоже, не была проблемой. Телефон должен использовать RSA_RC4_128_MD5 и SSLv3, все из которых доступны.

Я упускаю что-то более фундаментальное о том, что здесь не так? Похоже, запрос сертификата мог быть частью сбоя повторного согласования. Я пробовал включить SSLInsecureRenegotiation On на виртуальном хосте, если проблема заключалась в том, что SSL телефона не поддерживает новый протокол, но безрезультатно.

В настоящее время работает: Apache / 2.2.16 (Ubuntu) mod_ssl / 2.2.16 OpenSSL / 0.9.8o Apache proxy_html / 3.0.1

У меня была та же проблема, и оказалось, что проблема на самом деле в сообщении об ошибке - это сбивает с толку. Если вы посмотрите на точные байты протокола, прочитанные сервером (которые вы удалили - вот соответствующая часть из моего журнала):

ssl_engine_io.c (1854): | 0000: 15 03 01 00 02

ssl_engine_io.c (1854): | 0000: 02 28

0x15 относится к ContentType 21, который является предупреждающим сообщением. «03 01» - это версия, а «00 02» - длина фактического сообщения.

«02 28» означает фатальную ошибку 40 и относится к handshake_failure, что просто означает, что сервер не предложил ничего, что мог бы использовать клиент. Другими словами, у Nokia нет необходимых корневых сертификатов для распознавания вашего ssl-сертификата.

Когда возникает эта ошибка, конечный автомат протокола сервера ожидает чтения дополнительного сертификата клиента. Таким образом, «SSLv3 читает клиентский сертификат A» - это просто сервер, сообщающий, в каком состоянии он находился, когда получил предупреждающее сообщение от клиента.

Просто немного сбивает с толку.