
Amazon ELB 뒤에 동일한 우분투 12.04 서버 2개가 있습니다. 한 서버는 TLS v1.2를 사용하여 연결할 수 있지만 다른 서버는 TLS v1.2를 사용하여 컬 요청을 할 수 없습니다.
다음은 연결 및 버전을 확인하는 데 사용한 코드입니다. 간단한 컬 요청https://www.howsmyssl.com/a/check다음을 사용하여 사용 가능한 암호 제품군과 tls_version을 반환하는 사이트php test_curl.php
<?php
function get_tls_version($sslversion = null)
{
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.howsmyssl.com/a/check");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
if ($sslversion !== null) {
curl_setopt($c, CURLOPT_SSLVERSION, $sslversion);
}
$rbody = curl_exec($c);
if ($rbody === false) {
$errno = curl_errno($c);
$msg = curl_error($c);
curl_close($c);
return "Error! errno = " . $errno . ", msg = " . $msg;
} else {
$r = json_decode($rbody);
curl_close($c);
return $r->tls_version;
}
}
echo "OS: " . PHP_OS . "\n";
echo "uname: " . php_uname() . "\n";
echo "PHP version: " . phpversion() . "\n";
$curl_version = curl_version();
echo "curl version: " . $curl_version["version"] . "\n";
echo "SSL version: " . $curl_version["ssl_version"] . "\n";
echo "SSL version number: " . $curl_version["ssl_version_number"] . "\n";
echo "OPENSSL_VERSION_NUMBER: " . dechex(OPENSSL_VERSION_NUMBER) . "\n";
echo "TLS test (default): " . get_tls_version() . "\n";
echo "TLS test (TLS_v1): " . get_tls_version(1) . "\n";
echo "TLS test (TLS_v1_2): " . get_tls_version(6) . "\n";
?>
2개의 서버가 아래와 같은 응답을 제공합니다.
서버 1
OS: Linux
uname: Linux www-leapset-us-west-1b-n1-new 3.2.0-31-virtual #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012 x86_64
PHP version: 5.3.10-1ubuntu3.4
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f
TLS test (default): TLS 1.1
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.1
서버 2
OS: Linux
uname: Linux stag-order-ec1.leapset.com 3.2.0-40-virtual #64-Ubuntu SMP Mon Mar 25 21:42:18 UTC 2013 x86_64
PHP version: 5.3.10-1ubuntu3.11
curl version: 7.22.0
SSL version: OpenSSL/1.0.1
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000100f
TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.0
TLS test (TLS_v1_2): TLS 1.2
또한 서버와 동일한 ubuntu 12.04로 도커 인스턴스를 생성하고 다음을 사용하여 주어진 파일을 실행했으며 다음 php curl_test.php
과 같은 방식으로 작동했습니다.서버 2
2개의 서버에서 더 많은 컬 --version을 수행하면 2개의 서버에서 다음과 같은 출력이 제공되며 버전이 동일하고 일치합니다.
서버 1과 서버 2 모두
curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
또한 명령: 두 서버의 openssl 버전이 동일합니다. 서버 1과 서버 2 모두
OpenSSL 1.0.1 14 Mar 2012
ELB에서 활성화된 보안 정책은 여기에 설명된 것과 동일합니다.https://aws.amazon.com/about-aws/whats-new/2017/02/elastic-load-balancing-support-for-tls-1-1-and-tls-1-2-pre-define- 보안 정책/이는 기존 기본 설정에 해당하고 TLS 버전 1.0 이상을 지원하는 기본 구성 ELBSecurityPolicy-2016-08입니다.
더 나아가, 컬이 TLS를 처리하기 위해 기본 openssl을 사용한다는 것을 발견했습니다. 따라서 TLS v1.2를 사용하여 openssl 연결을 확인했습니다.
서버 1에서; openssl 연결을 확인하기 위해 다음 명령을 사용할 때
openssl s_client -connect google.com:443
TLS v1.1을 사용하여 연결하지만 TLS v1.2를 사용하여 강제로 사용하면openssl s_client -connect google.com:443 -tls1_2
TLS v1.2를 사용하여 google.com:443에 연결할 수 있으며 다음을 사용합니다.ECDHE-RSA-AES256-GCM-SHA384연결을 위한 암호화 체계.
그런 다음 시도했습니다.openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443
그리고 그것서버 1에서 실패했습니다.하지만 서버 2에서 일했습니다
더 나아가; openssl s_client -cipher 'ECDHE-RSA-AES256-GCM-SHA384' -connect www.google.com:443 -tls1_2
서버 1에서 잘 작동하고 다음을 사용하여 연결합니다.ECDHE-RSA-AES256-GCM-SHA384암호 체계.
왜 그런지 잘 모르겠습니다서버 1컬 요청에서 TLS v1.2를 사용하여 연결할 수 없으며 서버 1이 프로덕션 서버이기 때문에 openssl 버전이나 컬 버전을 업데이트할 수 있는 위치에 있지 않습니다.
더 나아가,
두 서버 모두에서 /etc/ssl/openssl.cnf 및 /usr/lib/ssl/openssl.cnf를 확인했는데 둘 다 동일합니다.
서버 1에서 TLS 1.2를 디버그하거나 활성화/강제하는 데 도움을 주시면 매우 감사하겠습니다.