Нет ничего плохого в сообщении ChangeCipherSpec
.На самом деле проблема заключается в Finished
сообщении .Он жалуется на дешифрованную verify_data
внутри этого сообщения, которая не соответствует ожидаемому хешу (несмотря на правильность самого шифрования / дешифрования).
Но что сбивает с толку в журнале Wireshark, так это то, чтоСообщение Finished
отображается в той же строке журнала, но под именем "EncryptedHandshakeMessage
" Это выглядит как какой-то тег или метка, описывающая ChangeCipherSpec, но это не так.Это сообщение на самом деле вообще не зашифровано.
По второй ссылке:
На практике вы увидите незашифрованный клиент Hello, сервер Hello, сертификат, обмен ключами сервера, запрос сертификата, подтверждение сертификата и ключ клиентаОбмен сообщениями.Сообщение «Готовое рукопожатие» зашифровано, поскольку оно появляется после сообщения «Изменить спецификацию шифра».
«Надеюсь, что кто-то имеет опыт обновления TLS 1.0 или 1.1 до 1.2 и, возможно, видел подобноепроблема из-за того, что вы не изменили больше, чем P_SHA256 MAC, и подняли номер версии "
. Они упоминают только два из трех мест, в которых вам нужно обновить комбинацию MD5 / SHA1 в изменениях "из раздела TLS 1.1 " в RFC 5246:
Комбинация MD5 / SHA-1 в псевдослучайной функции (PRF) заменена на спецификацию набора шифровPRFs.Все комплекты шифров в этом документе используют P_SHA256.
Комбинация MD5 / SHA-1 в элементе с цифровой подписью была заменена одним хешем.Подписанные элементы теперь включают поле, которое явно указывает используемый алгоритм хеширования.
(Примечание. Второе относится к сертификатам, и если вы еще не получили сертификатпроверяя, что вас еще не было в этот момент.)
В этом разделе они не упоминают о том, что третий помещает изменения комбинации MD5 / SHA-1, чтохеш, используемый в начальном числе для verify_data
сообщения Finished
.Однако этот пункт также является изменением по сравнению с TLS 1.1, описанным гораздо дальше в документе в разделе 7.4.9 :
"Хеш обозначает хэш сообщений рукопожатия. ДляPRF, определенный в Разделе 5, ХЕШ ДОЛЖЕН быть Хэшем, используемым в качестве основы для PRF. Любой набор шифров, который определяет другой PRF, ДОЛЖЕН также определять Хэш, который будет использоваться в Завершенных вычислениях. "
Для формальной спецификации они немного расплывчаты по «хэшу, используемому в качестве основы для PRF» (это HMAC или просто простой хеш?) Но это простой хеш.Таким образом, SHA256, если в спецификации набора шифров не указано иное.
(Обратите внимание, что набор шифров может определять длину verify_data как более 12 байт, хотя ни один из упомянутых в спецификации не делает этого.)
«Какой ресурс мне нужен, чтобы узнать, что делает сервер несчастным?»
YMMV.Но я просто создал OpenSSL как статическую библиотеку отладки и связал ее с простым сервером.Затем я добавил точки останова и контрольно-измерительные приборы, чтобы увидеть, что это было расстроено.( GDB по какой-то причине не разрешал мне входить в общую библиотеку .)
Около 30 сентября 2018 года на обычном Linux-компьютере:
git://git.openssl.org/openssl.git
./config no-shared no-asm -g3 -O0 -fno-omit-frame-pointer -fno-inline-functions no-ssl2 no-ssl3
make
Простой сервер, который я использовал, пришел с Simple TLS Server .Скомпилируйте со статической библиотекой:
gcc -g -O0 simple.c -o simple -lssl -lcrypto -ldl -lpthread
Я следовал инструкциям по генерации сертификатов здесь, но изменил AA на localhost
openSSL подписывает сертификат https_client с CA
Затем я изменил cert.pem => rootCA.pem
и key.pem => rootCA.key
в простом коде сервера.Я смог сделать:
wget https://localhost:4433 --no-check-certificate
И успешно вернуть test
в ответ.Так что тогда было просто посмотреть, где мой клиент вызвал сбой.