【问题标题】:How should I proceed with upgrading to TLS 1.2?我应该如何继续升级到 TLS 1.2?
【发布时间】:2015-12-05 17:23:09
【问题描述】:

编辑:我们已经获得了一个更新了 openssl 的新服务器并且一切就绪,所以我投票结束这个问题。

我们收到了来自 Authorize.NET 的关于一些技术更新的电子邮件。我试图弄清楚需要做什么,但我在这方面缺乏技能,我可以使用一些帮助。他们的电子邮件中有四个要点:

  1. 9 月 21 日更新完成后,任何通过 api.authorize.net 连接且无法验证 SHA-2 签名证书的网站或支付解决方案都将无法连接到 Authorize.Net 的服务器。

    我们的服务器使用 SHA-1,但我们安装了使用 SHA-2 的 GoDaddy 证书。

  2. 今年10月,由于系统更新,可能会收到不按顺序排列的Authorize.Net ID(Transaction ID、Batch ID等)。

    我认为这不会影响我们。

  3. 您可能已经知道,新的 PCI DSS 要求规定所有支付系统必须在 2016 年 6 月 30 日之前禁用 TLS 1.0。为确保我们在该日期之前合规,我们将首先禁用 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

【问题讨论】:

  • 您的问题已经有了答案,“我知道我们需要在我们的服务器上升级 OpenSSL。”要支持 TLS1.2,只需将 openssl 升级到 1.0.1 或更高版本即可。
  • 升级到 OpenSSL 1.0.1 的系统要求是什么?
  • 另外,我们如何让我们的服务器使用 SHA2?
  • openssl 没有具体要求,您可以使用所需版本的 openssl 编译您的 apache。对于 SHA256,您的证书必须由您的证书颁发机构使用 SHA256 算法签名。
  • “编译 apache”是什么意思?已经安装了

标签: apache openssl authorize.net suse tls1.2


【解决方案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 提供)。

在您使用 OpenSSL 的 C 代码中,您需要为 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

或者:

$ 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 很少使用,因此如果没有 DSS 密钥,OpenSSL 将删除密码套件。


现在,困难可能在于获得提供最新 OpenSSL 1.0.2 的发行版并且提供长期支持。我的 CentOS 机器不提供它,所以我必须从源代码构建它,然后在玩那些愚蠢的 r-path 游戏时重新构建依赖于 OpenSSL 的每个库或程序。

在你的情况下,它看起来像 Apache、PHP、Drupal、MySQL、phpAdmin(当安全性受到关注时,真的有人使用它吗:)和朋友。

【讨论】:

  • 对不起,这实在是我头大。我以前从未在 C 中修改过任何东西,所以我不确定该怎么做?
  • @Allison - 您需要执行哪些任务,使用哪些语言?
  • 我必须更新 OpenSSL。这是一个电子商务网站。 Authorize.net 规定了我们需要更新的截止日期。
  • 越想越觉得这不是编程题;可能是Server FaultWebmaster Stack Exchange。也许您应该标记问题以引起主持人的注意,并要求将其移动。 (您不能自己执行移动;您需要主持人的帮助)。
猜你喜欢
  • 2016-12-21
  • 2019-12-13
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 2017-09-25
  • 2018-10-17
  • 2021-01-02
  • 2017-09-30
相关资源
最近更新 更多