>source

Amazon RDS를 통해 호스팅되는 MySQL 데이터베이스에 SSL 연결을 설정하려고 합니다. 어떻게 연결해야 할지 막막합니다.

Amazon에 따르면 "rds-ca-2015-root.pem"이라는 CA 인증서를 다운로드하여 SSL 연결에 사용해야 합니다. 연결하는 데이터베이스 사용자를 SSL을 요구하도록 설정했습니다.

PHP에서 연결을 시작하기 위해 아래 code를 포함합니다.

$mysqli= mysqli_init();
mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$mysqli->ssl_set(NULL, NULL, "/path/to/pem", NULL, NULL);
$mysqli->real_connect("host", "username", "password", "name", 3306, NULL, MYSQLI_CLIENT_SSL);

그러나 ssl_set()에서 세 번째 매개변수로 지정한 경로에 관계없이(경로가 유효하지 않은 경우에도) SSL 연결은 성공적으로 설정됩니다. 세 번째 매개변수는 NULL로 설정할 수 없습니다.

이 쿼리를 실행하여 이를 확인합니다.'Ssl_cipher'와 같은 상태 표시;. 출력은 연결이 암호화되었는지 확인합니다(Ssl_cipher=> AES256-SHA).

누군가 이것이 어떻게 작동하는지 설명해 주시겠습니까? 경로가 올바르지 않을 때 연결이 계속 성공적으로 작동하는 이유에 대해 혼란스럽습니다. RDS 서버는 어떻게 확인됩니까?

사용 중인 OpenSSL의 특징 및 구성에 따라 Unix 시스템에서 이것을 실행하는 경우 시스템 전체 인증서를 보유하는 디렉토리가 있습니다. Openssl은 해당 경로에서 적절한 인증서를 찾습니다. 여기서 명확하지 않은 것은 (당신이 유닉스 머신에 있다고 가정) 당신이 당신의 인증서를 그 디렉토리에 넣었는지 여부입니다. 성공적으로 연결했다면 연결해야 합니다. 특정 디렉토리 위치에 대한 자세한 정보는 여기에서 확인할 수 있습니다: serverfault.com/questions/62496/…

mba122021-10-26 08:36:13

EC2 인스턴스에서 꽤 많은 테스트를 수행했으며 PEM 공개 키 경로를 설정하는 줄이 필요하지도 않고 AWS 문서를 통해 연결하기 위해 PEM을 포함하는 줄도 없는 것 같습니다. 명령줄. 이는 RDS 인증서가 인스턴스 어딘가에 이미 존재해야 하고 참조할 필요가 없다는 점에서 @mba12가 정확함을 의미합니다. 내가 잘못 참조하면 네, 깨집니다. AWS VPC 외부에서 이것을 테스트하고 있습니까?

scrowler2021-10-26 08:36:13

@RobbieAverill AWS를 정기적으로 사용한지 1년 정도 되었지만 그럴 때는 항상 PEM 파일을 사용하고 경로를 지정했습니다. 저는 PEM 파일을 AWS용으로 특별히 openssl에 통합하려고 시도한 적이 없습니다. 그러나 OpenSSL 기본 디렉토리에 인증서를 넣는 다른 일반 Linux 상자의 경우 잘 작동했습니다. 특정 상자의 openssl 구성을 올바르게 지정하는 데 주의해야 합니다. 그것이 나에게 약간의 문제를 주었다. 내가 언급했듯이 openssl은 몇 가지 맛이 있습니다.

mba122021-10-26 08:36:13

@Jack Humphries, 지금 여기에 많은 후속/추가 질문이 있습니다. 우리가 귀하의 질문에 답할 수 있도록 귀하가 그들에게 대답할 수 있다면 좋을 것입니다.

Emil Vikström2021-10-26 08:36:13

서버에서 .pem 파일을 어디에서 업로드합니까?

urfusion2021-10-26 08:36:13
  • 답변 # 1

    내가 아는 한 -RDS MySQL에 대한 SSL 연결을 요청하거나 요구하면 인증서의 로컬 사본이 유효하거나 읽을 수 있는지 여부에 관계없이 연결을 얻게 됩니다.

    Drupal에서 다음 구성을 사용하고 있으며 인증서 경로의 위치 또는 내용에 관계없이 SSL 연결을 얻습니다.

    $databases['default']['default']= [
      'database'=> 'drupal_db',
      'username'=> 'db_user',
      'password'=> 'db_password',
      'host'=> 'hostname',
      'port'=> '3306',
      'driver'=> 'mysql',
      'prefix'=> '',
      'pdo'=> array(
          PDO::MYSQL_ATTR_SSL_CA=> '/etc/ssl/certs/rds-combined-ca-bundle.pem',
          PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT=> false,
      ),
    ];
    

    그러나 MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 값을 "false"로 설정하면 연결 오류가 발생하고 Drupal이 실패합니다. 지금까지 이것이 인증서의 유효성을 검사하지 않는 이유 또는 성공적으로 수행하는 방법에 대한 설명을 찾지 못했습니다!

  • 답변 # 2

    RDS 문서는 실제로 왜 이런 일이 발생하는지 설명하고 CA 인증서가 필요하지 않다고 제안합니다.

    Amazon RDS는 다음의 모든 DB 인스턴스에서 SSL 인증서 업데이트를 시작했습니다. 2015년 3월 23일이지만 인스턴스 재부팅을 시작하지 않았습니다. 아니요 이러한 업데이트가 있을 때 운영에 영향을 미치거나 다운타임이 발생합니다. 수행되며 많은 상황에서 귀하의 업데이트를 수행할 것입니다. 정비창. Amazon RDS는 다음에 대한 인증서를 업데이트하지 않습니다. 업데이트를 이미 수행한 경우 인스턴스. 또한 참고 Amazon RDS가 AWS GovCloud(US)의 인증서를 업데이트하지 않는다는 사실 및 중국(베이징) 지역.

    인증서를 수동으로 업데이트하든 Amazon RDS가 ​​인증서를 업데이트했습니다. DB 인스턴스를 재부팅해야 합니다. 새 인증서가 적용됩니다. 원하는 시간을 결정할 수 있습니다. DB 인스턴스를 수동으로 재부팅하지만 인증서를 업데이트해야 합니다. 이전 인증서(rds-ca-2010) 이전의 인스턴스를 재부팅합니다. 2015년 4월 3일에 만료됩니다.

    자신의 DB에서 사용 중인 인증기관(CA)을 확인할 수 있습니다. Amazon RDS 콘솔을 사용하여 인스턴스. CA는 아래에 나열됩니다. DB 인스턴스 세부 정보의 보안 및 네트워크 섹션. 만약 당신의 인스턴스에 rds-ca-2015가 표시되면 새 인증서가 성공적으로 적용되었습니다. 여전히 데이터베이스 인스턴스를 재부팅해야 합니다. 새 SSL 인증서를 사용하도록 클라이언트 애플리케이션을 업데이트합니다.

    Amazon RDS 콘솔에 인스턴스 CA가 rds-ca-2010으로 표시되면 새 인증서가 데이터베이스 인스턴스에 적용되지 않았습니다. 아직. 다음 지침에 따라 SSL 인증서를 업데이트하십시오. 당신의 데이터베이스 인스턴스.

    세 번째 매개변수는 기본적으로 클라이언트에서 무시됩니다. 세 번째 매개변수를 다음으로 설정하여 베팅합니다.없는, 불러도 소용없다mysqli::ssl_set()모든 매개변수가 null인 경우.

    해당 함수 호출을 완전히 제거해 보십시오.

    RDS 문서의 인용문은 EC2 인스턴스에서 클라이언트로 실행되는 PHP code가 ssl_set 호출에도 불구하고 서버에 성공적으로 연결되는 이유를 설명하지 않는 서버를 참조합니다. OP 질문은 RDS가 아니라 연결하는 클라이언트에 관한 것입니다.

    S. Imp2021-10-26 22:02:37
  • 이전 java : For 루프가 모든 올바른 값을 반환하지 않습니다.
  • 다음 routes : 각도 CLI 경로