我该如何继续升级到TLS 1.2?

时间:2015-09-09 16:19:15

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

编辑:我们已经获得了一个更新的openssl的新服务器,并且已经完成设置,所以我投票决定关闭这个问题。

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

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

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

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

    我不认为这会影响我们。

  3. 您可能已经知道,新的PCI DSS要求规定所有支付系统必须在2016年6月30日之前禁用TLS 1.0。为了确保我们在该日期之前符合要求,我们将首先禁用TLS 1.0在沙箱环境中,然后在我们的生产环境中。这两个日期仍有待确定,但请确保您的解决方案尽快为此更改做好准备。

  4. 我知道我们需要在服务器上升级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
    

1 个答案:

答案 0 :(得分: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(当安全问题时,有没有人真正使用它:)和朋友们。