Как мне продолжить обновление до 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