Я пытаюсь контролировать, какие протоколы TLS/SSL поддерживаются для HTTPS-подключений к моему веб-сервису, используя компонент TIdServerIOHandlerSSLOpenSSL
и устанавливая его свойства SSLOptions.Method
и SSLOptions.SSLVersions
(как предложено в this answer).Как мне поддерживать только TLS 1.x (в моем веб-сервисе)?
по умолчанию является метод sslvTLSv1
и SSLVersions [sslvTLSv1]
(см this answer для отношений между методом и SSLVersions):
Я использую птар с ssl-enum-ciphers.nse
сценария от this answer, чтобы проверить, что на самом деле имеется, и получить этот сценарий:
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
|_ least strength: C
Но TLS 1.1 и TLS 1.2 отсутствуют.
Если установить метод для sslvSSLv23
(«подстановочных, что позволяет динамически версии переговоров в тех случаях, когда поддержка клиент и сервера отличается SSL/версия TLS. Это позволяет им понять и использовать самую высокую версию, общую для обоего сторон» (source)) Я вижу sslvSSLv2
и sslvSSLv3
становятся активными.
Но я не хочу, чтобы SSL 2.0 (устарел/запрещен в 2011 году RFC 6176) и 3.0 (устарел в июне 2015 года по RFC 7568), поддерживая (source).
Я не могу вычесть как sslvTLSv2
, так и sslvTLSv3
из набора, сгенерированного методом sslvSSLv23
: мы возвращаемся к конфигурации по умолчанию, где поддерживается только TLS 1.0.
Обратите внимание, что, если я только "оставить из sslvTLSv2
(Метод sslvSSLv23
и SSLVersions является [sslvSSLv3,sslvTLSv1]
), птар говорит мне:
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation
| TLSv1.2:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation
|_ least strength: C
Что я могу сделать так, что только все версии 1.x TLS являются поддерживается?
Это Delphi XE2 с Indy 10.5.8.0, работающий на Win7, протестированный с OpenSSL 1.02f. С OpenSSL 1.02g я получаю this issue, мы еще не готовы к нашему обновлению Delphi Seattle (обновление 1), где это решается в коде Indy.
Дополнительные примечания:
Должен ли я отказаться от поддержки TLS 1.0, а?
SSLOptions.Mode
по-прежнему по умолчаниюsslmUnassigned
, я хочу посмотреть на это позже.Обратите внимание, что сценарий nmap проверяет только версии SSLv3/TLS, а не SSLv2. Я использовал SSLScan кроме того, и это показывает, что если я уйду из
sslvTLSv3
только SSL2 действительно все еще включен ;-(Забудьте информацию о слабых шифров, это следующая вещь, чтобы решить ;-)
Я действительно не могу выполнить NMAP-тест, если я запускаю свой веб-сервис в среде Delphi, это дает все виды ошибок времени выполнения (которые не отображаются, если я запускаю исполняемый файл).Возможно, это должно произойти, потому что сценарий nmap запускает все виды тестов?
EIdOSSLAcceptError 'Error accepting connection with SSL. EOF was observed that violates the protocol.' EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:no shared cipher EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:wrong version number
Спасибо Реми, это работает. К счастью, я уже делал все во время работы. Мы также работаем над обновлением всего от XE2 до Сиэтла в ближайшем будущем. –