Как мне продолжить обновление до TLS 1.2?

РЕДАКТИРОВАТЬ: У нас есть новый сервер с обновленным openssl, и все готово, поэтому я голосую за закрытие этого вопроса.

Мы получили это письмо от Authorize.NET о некоторых технических обновлениях. Я пытаюсь понять, что нужно сделать, но мне не хватает навыков в этой области, и мне нужна была бы помощь. В их письме было четыре основных момента:

  1. После завершения обновления 21 сентября любой веб-сайт или платежное решение, которые подключаются через api.authorize.net и не могут проверить подписанные сертификаты SHA-2, не смогут подключиться к серверам Authorize.Net.

    Наш сервер использует SHA-1, но у нас установлен сертификат GoDaddy, который использует SHA-2.

  2. В октябре этого года, в связи с обновлениями системы, можно будет получать идентификаторы Authorize.Net (Transaction ID, Batch ID и т. Д.) Не в последовательном порядке.

    Не думаю, что это повлияет на нас.

  3. Как вы, возможно, уже знаете, в новых требованиях PCI DSS говорится, что все платежные системы должны отключить TLS 1.0 до 30 июня 2016 года. Чтобы обеспечить соответствие требованиям заранее, мы сначала отключим TLS 1.0 в среде песочницы, а затем в нашей производственной среде. Обе даты еще предстоит определить, но убедитесь, что ваши решения готовы к этому изменению как можно скорее.

Я знаю, что нам нужно будет обновить OpenSSL на нашем сервере. Это то, что у нас есть сейчас ...

Current     Version          Recommended       Depends On
TLS         1.0              1.2    
OpenSSL     0.9.8h           1.0.1  
PHP         5.2.6            5.6               Open SSL 1.0.1
Apache      2.2.10           2.4    
Linux OS    SUSE Enterprise  SUSE Enterprise 
             Server 11        Server 12 
Drupal      6.9              7.39              Mysql 5.0.15/PHP 5.4
MySQL       5.0.67           5.6               SUSE Enterprise Server 12 (x86_64)
phpMyAdmin  3.3.3            4.4.14.1          PHP 5.3.7/MySQL 5.5

person AllisonC    schedule 09.09.2015    source источник
comment
У вас уже есть ответ на свой вопрос, я знаю, что нам нужно будет обновить OpenSSL на нашем сервере. Для поддержки TLS1.2 вам просто нужно обновить openssl до 1.0.1 или выше.   -  person NPC    schedule 09.09.2015
comment
Какие системные требования для обновления до OpenSSL 1.0.1?   -  person AllisonC    schedule 10.09.2015
comment
Также как сделать так, чтобы наш сервер использовал SHA2?   -  person AllisonC    schedule 10.09.2015
comment
Для openssl нет особых требований, вы можете скомпилировать свой apache с необходимой версией openssl. Для SHA256 вы должны получить сертификат, подписанный с помощью алгоритма SHA256 вашим центром сертификации.   -  person NPC    schedule 10.09.2015
comment
Что вы имеете в виду под компилированием apache? Он уже установлен   -  person AllisonC    schedule 18.09.2015
comment
Openssl не является частью стандартного apache disto. Вы компилируете apache для использования версии openssl. В вашем случае это 0.9.8h. Вам нужно будет переустановить сервер apache с новым openssl, соответствующим ему.   -  person NPC    schedule 18.09.2015
comment
Как мне это сделать? (Я не совсем серверный человек, я веб-разработчик, но мне было поручено это сделать)   -  person AllisonC    schedule 18.09.2015
comment
Я установил более новую версию openssl, и когда я запускаю команду openssl version, я получаю OpenSSL 1.0.1g 7 апреля 2014 года, однако, когда я захожу на веб-сайт, он все еще использует старую версию openssl. Как мне обновить apache / перекомпилировать его?   -  person AllisonC    schedule 22.09.2015
comment
Вы следуете инструкциям, которые здесь   -  person NPC    schedule 22.09.2015


Ответы (1)


Как мне продолжить обновление до TLS 1.2?

Для соответствия техническим требованиям достаточно использовать OpenSSL 1.0.1 или 1.0.2. Оба обеспечивают TLS 1.2, и оба тривиально предоставляют SHA-256. (Существуют и другие скрытые реализации, например, OpenSSL 1.0.0 не обеспечивает полного соответствия оборудования EC и полного набора шифров TLS 1.2, в отличие от 1.0.1 и 1.0.2).

В вашем C-коде, который использует OpenSSL, все, что вам нужно сделать для SSL-контекста или сеанса:

/* Useless return value ??? */
SSL_library_init();

const SSL_METHOD* method = SSLv23_method();
if(NULL == method) handleFailure();

SSL_CTX* ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();

/* Cannot fail ??? */
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | \
    SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);

Для конфигураций серверов, подобных Apache, используйте что-то вроде следующего (мой включает +TLSv1 +TLSv1.1):

# From my CentOS production server
SSLProtocol -all +TLSv1.2

Вам, вероятно, также следует стремиться к шифрованию комплектов. Для этого в C-коде:

const char CIHPHER_LIST[] = "HIGH:!aNULL:!RC4:!MD5"

/* Ensure at least one cipher suite is added, which indicates non-failure */
int rc = SSL_CTX_set_cipher_list(ctx, CIHPHER_LIST);
if(!(rc >= 1)) handleFailure();

И в файле конфигурации, подобном Apache:

# From my CentOS production server
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4

Если вы хотите избежать переноса ключей RSA (TLS 1.3 удаляет его), тогда:

SSLCipherSuite HIGH:!aNULL:!MD5:!RC4:!kRSA

Когда вы удаляете транспорт ключей RSA, у вас в значительной степени остаются протоколы обмена эфемерными ключами (наборы шифров по модулю, такие как PSK и SRP).

Если вы хотите явно использовать обмен эфемерными ключами, вам понадобится что-то вроде kEECDH:kECDHE:kDHE:kEDH:!aNULL. Для получения дополнительных сведений см. openssl ciphers(1) справочную страницу.

Я читаю между строк, но требование TLS 1.2, вероятно, как-то связано с аутентифицированным шифрованием и режимами работы, такими как GCM. Для этого снова используйте openssl ciphers(1):

$ openssl ciphers -v 'HIGH:!aNULL' | grep GCM
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD

Or:

$ openssl ciphers -v 'HIGH:!aNULL' | grep GCM | grep -v "Kx=RSA"  | cut -d " " -f 1
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
DHE-DSS-AES256-GCM-SHA384
DHE-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256

Вместо указания HIGH:!aNULL:!MD5:!RC4:!kRSA вы можете сделать следующее:

const char CIPHER_LIST[] =
    "ECDHE-RSA-AES256-GCM-SHA384:"
    "ECDHE-ECDSA-AES256-GCM-SHA384:"
    "DHE-DSS-AES256-GCM-SHA384:"
    "DHE-RSA-AES256-GCM-SHA384:"
    "ECDH-RSA-AES256-GCM-SHA384:"
    "ECDH-ECDSA-AES256-GCM-SHA384:"
    "ECDHE-RSA-AES128-GCM-SHA256:"
    "ECDHE-ECDSA-AES128-GCM-SHA256:"
    "DHE-DSS-AES128-GCM-SHA256:"
    "DHE-RSA-AES128-GCM-SHA256:"
    "ECDH-RSA-AES128-GCM-SHA256:"
    "ECDH-ECDSA-AES128-GCM-SHA256:"

/* Ensure at least one cipher suite is added, which indicates non-failure */
int rc = SSL_CTX_set_cipher_list(ctx, CIPHER_LIST);
if(!(rc >= 1)) handleFailure();

Если вы посмотрите на набор шифров AES256-GCM-SHA384, вы увидите, что используется транспортный ключ (Kx=RSA), поэтому вы можете избежать его, даже если его TLS 1.2. Вот причина появления на нем grep -v.

Для полноты подойдет Au=RSA. Это просто означает, что сервер использует свой ключ RSA только для подписи. На практике Au=DSS используется редко, поэтому OpenSSL удалит набор шифров, если нет ключа DSS.


Теперь проблема, вероятно, заключается в том, чтобы получить дистрибутив, который предоставляет последнюю версию OpenSSL 1.0.2 и обеспечивает долгосрочную поддержку. Мои машины с CentOS не предоставляют его, поэтому мне приходится собирать его из исходников, а затем перестраивать каждую библиотеку или программу, которые зависят от OpenSSL, пока я играю в эти глупые r-path игры.

В вашем случае это похоже на Apache, PHP, Drupal, MySQL, phpAdmin (действительно ли кто-нибудь использует это, когда безопасность является проблемой :) и друзья.

person jww    schedule 16.09.2015
comment
Извините, это действительно выше моей головы. Я никогда раньше ничего не изменял на C, поэтому я не совсем уверен, что делать? - person AllisonC; 16.09.2015
comment
@Allison - Какие задачи вы должны выполнять и с какими языками вы работаете? - person jww; 17.09.2015
comment
Мне нужно обновить OpenSSL. Это для веб-сайта электронной коммерции. У нас есть крайний срок от Authorize.net, когда нам нужно обновить это. - person AllisonC; 17.09.2015
comment
Чем больше я думаю об этом, тем больше думаю, что это не вопрос программирования; и, вероятно, что-то для сбоя сервера или обмена стеками для веб-мастеров . Возможно, вам стоит отметить вопрос модератором и попросить его переместить. (Самостоятельно выполнить ход нельзя, нужна помощь модератора). - person jww; 17.09.2015