Ответ 1
В сообщении ChangeCipherSpec
нет ничего плохого. Это действительно сообщение Finished
, у которого есть проблема. Он жалуется на дешифрованные verify_data
внутри этого сообщения, которые не соответствуют ожидаемому хэшу (несмотря на то, что само шифрование/дешифрование является правильным).
Но что заблуждение в журнале Wireshark заключается в том, что сообщение Finished
появляется в одной строке журнала, но под названием " EncryptedHandshakeMessage
". Это делает его похожим на тег или ярлык, описывающий ChangeCipherSpec, но это не так. Это сообщение фактически не зашифровано вообще.
- Окончательный пакет TLS переименовал зашифрованное сообщение подтверждения
- HTTPS через TLS - зашифрованный тип
Из второй ссылки:
На практике вы увидите незашифрованные клиентские запросы Hello, Server Hello, Certificate, Server Key Exchange, Certificate Request, Certificate Verify и Client Key Exchange. Сообщение завершенного рукопожатия зашифровывается, поскольку оно возникает после сообщения Spec Change Cipher Spec.
"Надеясь, что у кого-то есть опыт обновления TLS 1.0 или от 1.1 до 1.2, и, возможно, он видел подобную проблему из-за того, что не изменился больше, чем MAC P_SHA256 и натолкнул номер версии"
Они упоминают только два из трех мест, которые вам нужно обновить в комбинации с MD5/SHA1 в разделе "изменения из TLS 1.1" RFC 5246:
Комбинация MD5/SHA-1 в псевдослучайной функции (PRF) была заменена спецификациями PRF с набором шифров. В всех наборах шифров в этом документе используется P_SHA256.
Комбинация MD5/SHA-1 в элементе с цифровой подписью была заменена одним хэшем. Подписанные элементы теперь включают поле, в котором явно указывается используемый хэш-алгоритм.
(Примечание: второе относится к сертификатам, и если вы еще не получили проверку сертификата, вы еще не были бы на этом этапе.)
То, что они не упоминают в этом разделе, - это третье место изменений комбинации MD5/SHA-1, которое является хешем, используемым в семени для verify_data
сообщения Finished
. Однако этот момент также является изменением от TLS 1.1, описанным намного дальше по документу в разделе 7.4.9:
"Хэш обозначает хеш сообщений рукопожатия. Для PRF, определенного в разделе 5, Hash ДОЛЖЕН быть хешем, используемым в качестве основы для 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
в ответ. Итак, это было просто вопрос, где мой клиент вызвал сбой.