2016-03-31 1 views
1

Я пытаюсь контролировать, какие протоколы TLS/SSL поддерживаются для HTTPS-подключений к моему веб-сервису, используя компонент TIdServerIOHandlerSSLOpenSSL и устанавливая его свойства SSLOptions.Method и SSLOptions.SSLVersions (как предложено в this answer).Как мне поддерживать только TLS 1.x (в моем веб-сервисе)?

по умолчанию является метод sslvTLSv1 и SSLVersions [sslvTLSv1] (см this answer для отношений между методом и SSLVersions):

enter image description here

Я использую птар с 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 

ответ

1

Но TLS 1.1 и TLS 1.2 отсутствуют.

Правильно, потому что, если вы установите Method в sslvTLSv1, Инди будет использовать только TLS 1.0 специально.

Ваш скриншот Object Inspector ясно показывает, что вы используете версию Indy, которая не поддерживает TLS 1.1+ (если были, то будут доступны в SSLVersions собственности sslvTLSv1_1 и sslvTLSv1_2 варианты).

Обратите внимание, что, если я только "оставить из sslvTLSv2 (Метод sslvSSLv23 и SSLVersions является [sslvSSLv3, sslvTLSv1]), птар говорит мне:

Когда Method является sslvSSLv23, Инди просто отключает нежелательное SSL/TLS, в этом случае SSLv2. Вы явно используете версию библиотеки OpenSSL, которая поддерживает TLS 1.1+. Итак, поскольку ваша версия Indy не поддерживает TLS 1.1+, она не отключает их. По умолчанию они включены. Так как вы не отключите TLS 1.0, TLS 1.1+ неявно включается в OpenSSL.

Что я могу сделать, чтобы поддерживались только все версии TLS 1.x?

Это немного нечетным обходной путь, но вы можете установить SSLVersions в [sslvSSLv23,sslvTLSv1]. Это установит Method на sslvSSLv23 и удалит sslvSSLv23 с SSLVersions. Таким образом, Indy будет использовать подстановочный знак SSLv23 и отключить SSLv2 и SSLv3, оставив TLS 1.0+ включенным.

К сожалению, вы не можете сделать эту конфигурацию в инспекторе объектов во время разработки. Ну, вы можете (сначала включить только sslvTLSv1, а затем включить ssvSSLv23), но он не будет сохранен в DFM правильно (SSLVersions будет опущен, так как [sslvTLSv1] является значением по умолчанию), и, таким образом, SSLv2 и SSLv3 во время выполнения. Чтобы избежать этого, вам придется назначить SSLVersions в коде во время выполнения, прежде чем активировать сервер:

IdServerIOHandlerSSLOpenSSL1.SSLOptions.SSLVersions := [sslvSSLv23,sslvTLSv1]; 

В противном случае альтернатива должна перейти на последнюю актуальную версию Indy, которая изначально поддерживает TLS 1.1+, то вы можете просто установить SSLVersions на [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2] (во время выполнения или дизайн-времени) и двигаться дальше.

+0

Спасибо Реми, это работает. К счастью, я уже делал все во время работы. Мы также работаем над обновлением всего от XE2 до Сиэтла в ближайшем будущем. –

Смежные вопросы