Рукопожатие Tls завершается ошибкой, несмотря на общие наборы шифров.

У меня возникли проблемы с безопасным подключением к www.howsmyssl.com/a/check. Я использую wolfSSL для подключения, однако рукопожатие всегда терпит неудачу (предупреждение FATAL ERROR 40). Я попытался пронюхать сеть, чтобы заглянуть в пакеты, чтобы увидеть, что именно отправляется и какие наборы шифров поддерживаются, и я вижу, что, согласно тесту от ssllabs, у howsmyssl.com и моего клиента есть общие наборы шифров. Так что я действительно не знаю, где произошла ошибка. Это трассировка клиента:

trace

А это ссылка на результаты анализа www. Howsmyssl.com. Здесь видно, что у них общие наборы шифров (например, 0xc02f), поэтому я думаю, что соединение должно пройти, или я что-то упускаю?

EDIT: Вот журналы отладки wolfssl

[0;32mI (6565) openssl_example: OpenSSL demo thread start OK[0m
[0;33mW (6565) openssl_example: Size of long = 4, Size of longlong = 8
[0m
[0;32mI (6565) openssl_example: get target IP address[0m
[0;32mI (6595) openssl_example: OK[0m
[0;32mI (6595) openssl_example: 104.196.190.195[0m
wolfSSL Entering wolfSSL_Init
wolfSSL Entering wolfCrypt_Init
[0;32mI (6595) openssl_example: create SSL context ......[0m
wolfSSL Entering WOLFSSL_CTX_new_ex
wolfSSL Entering wolfSSL_CertManagerNew
wolfSSL Leaving WOLFSSL_CTX_new, return 0
[0;32mI (6615) openssl_example: OK[0m
wolfSSL Entering wolfSSL_CTX_set_verify
wolfSSL Entering wolfSSL_CTX_load_verify_buffer
Getting into SSL_FILETYPE_PEM if
Processing CA PEM file
wolfSSL Entering PemToDer
Adding a CA
wolfSSL Entering GetExplicitVersion
wolfSSL Entering GetSerialNumber
Got Cert Header
wolfSSL Entering GetAlgoId
wolfSSL Entering GetObjectId()
Got Algo ID
Getting Cert Name
Getting Cert Name
Got Subject Name
wolfSSL Entering GetAlgoId
wolfSSL Entering GetObjectId()
Got Key
Parsed Past Key
wolfSSL Entering DecodeCertExtensions
wolfSSL Entering GetObjectId()
wolfSSL Entering DecodeSubjKeyId
wolfSSL Entering GetObjectId()
wolfSSL Entering DecodeAuthKeyId
wolfSSL Entering GetObjectId()
wolfSSL Entering DecodeBasicCaConstraint
wolfSSL Entering GetAlgoId
wolfSSL Entering GetObjectId()
    Parsed new CA
    Freeing Parsed CA
    Freeing der CA
        OK Freeing der CA
wolfSSL Leaving AddCA, return 0
1
   Processed a CA
wolfSSL Entering PemToDer
Couldn't find PEM header
-372
CA Parse failed, no progress in file.
Do not continue search for other certs in file
Processed at least one valid CA. Other stuff OK
[0;32mI (6715) openssl_example: create socket ......[0m
[0;32mI (6725) openssl_example: OK[0m
[0;32mI (6725) openssl_example: bind socket ......[0m
[0;32mI (6735) openssl_example: OK[0m
[0;32mI (6735) openssl_example: socket connect to remote www.howsmyssl.com ......[0m
[0;32mI (6865) openssl_example: OK[0m
[0;32mI (6865) openssl_example: create SSL ......[0m
wolfSSL Entering SSL_new
wolfSSL Leaving SSL_new, return 0
[0;32mI (6865) openssl_example: OK[0m
wolfSSL Entering SSL_set_fd
wolfSSL Entering SSL_set_read_fd
wolfSSL Leaving SSL_set_read_fd, return 1
wolfSSL Entering SSL_set_write_fd
wolfSSL Leaving SSL_set_write_fd, return 1
[0;32mI (6885) openssl_example: SSL connected to www.howsmyssl.com port 443 ......[0m
wolfSSL Entering SSL_connect()
growing output buffer

Shrinking output buffer

connect state: CLIENT_HELLO_SENT
received record layer msg
got ALERT!
Got alert
wolfSSL error occurred, error = 40
wolfSSL error occurred, error = -313
[0;32mI (7065) openssl_example: OK[0m
wolfSSL Entering wolfSSL_get_cipher
wolfSSL Entering SSL_get_current_cipher
wolfSSL Entering SSL_CIPHER_get_name
wolfSSL Entering wolfSSL_get_cipher_name_from_suite
READ USED CIPHERSUITE: NONE
[0;32mI (7085) openssl_example: send https request to www.howsmyssl.com port 443 ......[0m
wolfSSL Entering SSL_write()
handshake not complete, trying to finish
wolfSSL Entering wolfSSL_negotiate
wolfSSL Entering SSL_connect()
ProcessReply retry in error state, not allowed
wolfSSL error occurred, error = -313
wolfSSL Leaving wolfSSL_negotiate, return -1
wolfSSL Leaving SSL_write(), return -1
[0;32mI (7115) openssl_example: failed[0m
wolfSSL Entering SSL_shutdown()
wolfSSL Leaving SSL_shutdown(), return -1
wolfSSL Entering SSL_free
CTX ref count not 0 yet, no free
wolfSSL Leaving SSL_free, return 0
wolfSSL Entering SSL_CTX_free
CTX ref count down to 0, doing full free
wolfSSL Entering wolfSSL_CertManagerFree
wolfSSL Leaving SSL_CTX_free, return 0
I (14055) wifi: pm start, type:0

ОБНОВЛЕНИЕ Я попытался подключиться к www.google.com, и мне это удалось. Никаких изменений в мой код не вносилось, поэтому я думаю, что это будет проблема с сервером. Однако, когда я подключаюсь к www.howsmyssl.com с помощью mbedtls, запрос также завершается успешно, и после сравнения пакетов путем прослушивания сети я не вижу существенных различий.


person Lennart    schedule 04.07.2017    source источник
comment
Оповещение 40 означает не только отсутствие общих наборов шифров.   -  person user207421    schedule 04.07.2017
comment
Да, я знаю. Это означает, что что-то пошло не так во время процедуры рукопожатия (в данном случае с приветственным сообщением клиента). Поэтому я проверил всю свою трассировку, чтобы увидеть, не пропало ли что-то, но я так не думаю. Также сервер поддерживает как минимум один набор шифров. И я думаю, что это то, что может пойти не так в приветственном сообщении клиента.   -  person Lennart    schedule 04.07.2017
comment
Нет. Это означает RFC 2246 #7.2.2: "Получение предупреждающего сообщения о сбое установления связи указывает, что отправитель не смог согласовать приемлемый набор параметров безопасности с учетом доступных вариантов. Это фатальная ошибка.'   -  person user207421    schedule 04.07.2017


Ответы (1)


Простое сообщение Client Hello от клиента здесь не поможет. Вам нужно будет собрать некоторые журналы, связанные с SSL. Я не эксперт по wolfssl, но похоже, что он предоставляет дополнительные журналы, когда вы компилируете его с помощью --enable-debug. Я сослался на это: WolfSL — оповещение SSL фатальная ошибка

Cipher Suites — не единственное, что может пойти не так. Если сервер ожидал определенное расширение TLS в Client Hello в определенном формате и если оно не было принято даже в этом случае, Сервер может завершить рукопожатие.

См. этот поток для справки: SSL handshake_failure после clientHello

Без журналов отладки это будет как стрельба в темноте.

ОБНОВЛЕНИЕ:

Итак, ошибки в логах:

wolfSSL error occurred, error = 40
wolfSSL error occurred, error = -313

313 означает, что серверу не понравилось одно из следующих сообщений, отправленных клиентом:

  • Наборы шифров
  • TLS-расширения

Поскольку вы уже указали поддерживаемые кривые, попробуйте включить наборы шифров со статическим ключом. Кажется, они отключены по умолчанию в WolfSSL. WolfSSL — Поддерживаемые наборы шифров

person Kaushal Kumar Panday    schedule 04.07.2017
comment
Я добавил журналы отладки. Я уже включил расширения tls и определил HAVE_SUPPORTED_CURVES, так что это не проблема. - person Lennart; 04.07.2017
comment
Затем просмотрите расширения. Есть так много вещей, которые могут пойти не так. Кроме того, было бы проще отлаживать, если бы у вас был доступ к журналам SSL на стороне сервера. - person Kaushal Kumar Panday; 04.07.2017
comment
обновил мой ответ. Вы можете попробовать включить наборы шифров со статическим ключом? - person Kaushal Kumar Panday; 04.07.2017
comment
Это работает, но я прочитал в README wolfssl на github, что они устарели и не будут поддерживаться в будущих версиях tls. Так не опасно ли их использовать? - person Lennart; 04.07.2017
comment
Возможно, я думаю, вы захотите узнать у wolfssl, как это сделать. Кроме того, сервер должен ответить, почему он не принимает шифры ECC. - person Kaushal Kumar Panday; 04.07.2017
comment
Хорошо, я свяжусь с ними. Спасибо за вашу поддержку. - person Lennart; 04.07.2017
comment
Похоже, что разница между случаем успеха и неудачей заключается в том, что расширение ec_point_format отправляется вместе с приветствием клиента. Это можно увидеть с помощью фиктивного кода, который отправляет расширение ec_point_format вместе с приветствием клиента wolfSSL, но на самом деле не анализирует и не использует расширение. После получения расширения ec_point_format сервер howsmyssl.com с удовольствием продолжит работу с набором шифров ECDHE. - person Sweetness; 05.07.2017