

# SSL/TLS를 사용한 RDS for PostgreSQL 연결 보안
<a name="PostgreSQL.Concepts.General.Security"></a>

RDS for PostgreSQL은 PostgreSQL DB 인스턴스를 위한 SSL 암호화를 지원합니다. SSL을 사용하여 애플리케이션과 PostgreSQL DB 인스턴스 사이의 PostgreSQL 연결을 암호화할 수 있습니다. 또한 PostgreSQL DB 인스턴스에 대한 모든 연결에서 SSL을 사용하도록 지정할 수도 있습니다. 또한 RDS for PostgreSQL은 SSL에 대한 후속 프로토콜인 전송 계층 보안(TLS)을 지원합니다.

SSL/TLS를 사용하는 연결 암호화 등 Amazon RDS 및 데이터 보호에 대한 자세한 내용은 [Amazon RDS의 데이터 보호](DataDurability.md) 섹션을 참조하세요.

**Topics**
+ [PostgreSQL DB 인스턴스와 함께 SSL 사용](PostgreSQL.Concepts.General.SSL.md)
+ [새 SSL/TLS 인증서를 사용해 PostgreSQL DB 인스턴스에 연결할 애플리케이션 업데이트](ssl-certificate-rotation-postgresql.md)

# PostgreSQL DB 인스턴스와 함께 SSL 사용
<a name="PostgreSQL.Concepts.General.SSL"></a>

Amazon RDS는 PostgreSQL DB 인스턴스를 위한 SSL 암호화를 지원합니다. SSL을 사용하여 애플리케이션과 PostgreSQL DB 인스턴스 사이의 PostgreSQL 연결을 암호화할 수 있습니다. 기본적으로 RDS for PostgreSQL는 모든 클라이언트가 SSL/TLS를 사용하여 연결하기를 기대하지만 사용자가 이를 요구할 수도 있습니다. RDS for PostgreSQL은 전송 계층 보안(TLS) 버전 1.1, 1.2 및 1.3을 지원합니다.

SSL 지원 및 PostgreSQL 데이터베이스에 대한 일반적인 정보는 PostgreSQL 설명서의 [SSL 지원](https://www.postgresql.org/docs/11/libpq-ssl.html)을 참조하세요. JDBC를 통한 SSL 연결 사용에 대한 자세한 내용은 PostgreSQL 설명서에서 [클라이언트 구성](https://jdbc.postgresql.org/documentation/head/ssl-client.html)을 참조하세요.

모든 AWS 리전에서 PostgreSQL에 대한 SSL 지원 기능을 사용할 수 있습니다. Amazon RDS는 PostgreSQL DB 인스턴스가 생성될 때 해당 인스턴스의 SSL 인증서를 만듭니다. SSL 인증서 확인을 활성화하는 경우에는 SSL 인증서에 스푸핑 공격으로부터 보호해주는 SSL 인증서를 위한 일반 이름(CN)으로 DB 인스턴스 엔드포인트가 포함됩니다.

**Topics**
+ [SSL을 통해 PostgreSQL DB 인스턴스에 연결](#PostgreSQL.Concepts.General.SSL.Connecting)
+ [PostgreSQL DB 인스턴스에 SSL 연결 요구](#PostgreSQL.Concepts.General.SSL.Requiring)
+ [SSL 연결 상태 확인](#PostgreSQL.Concepts.General.SSL.Status)
+ [RDS for PostgreSQL의 SSL 암호 제품군](#PostgreSQL.Concepts.General.SSL.Ciphers)

## SSL을 통해 PostgreSQL DB 인스턴스에 연결
<a name="PostgreSQL.Concepts.General.SSL.Connecting"></a>

**SSL을 통해 PostgreSQL DB 인스턴스에 연결하려면**

1. 인증서를 다운로드합니다.

   인증서 다운로드에 대한 자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 단원을 참조하세요.

1. SSL을 통해 PostgreSQL DB 인스턴스에 연결합니다.

   SSL을 사용하여 연결하면 클라이언트가 인증서 체인을 확인할지 선택할 수 있습니다. 연결 파라미터가 `sslmode=verify-ca` 또는 `sslmode=verify-full`을 지정하면, 클라이언트는 RDS CA 인증서를 트러스트 스토어에 있거나 연결 URL에서 참조되게 할 것을 요구합니다. 이 요구 사항은 데이터베이스 인증서에 서명하는 인증서 체인을 확인하는 것입니다.

   psql 또는 JDBC와 같은 클라이언트가 SSL을 지원하도록 구성되어 있는 경우 클라이언트는 먼저 SSL을 이용해 데이터베이스에 연결을 시도하도록 기본 설정되어 있습니다. SSL을 이용해 연결할 수 없는 경우 클라이언트는 SSL 없이 연결하는 방식으로 전환됩니다. libpq 기반 클라이언트(예: psql)와 JDBC에서 사용되는 기본 `sslmode` 모드는 서로 다릅니다. libpq 기반 클라이언트와 JDBC 클라이언트는 `prefer`로 기본 설정되어 있습니다.

   `sslrootcert` 파라미터를 사용하여 인증서를 참조합니다(예: `sslrootcert=rds-ssl-ca-cert.pem`).

다음은 `psql`을 사용하여 인증서 확인과 함께 SSL을 사용하여 PostgreSQL DB 인스턴스에 연결하는 예입니다.

```
$ psql "host=db-name.555555555555.ap-southeast-1.rds.amazonaws.com 
    port=5432 dbname=testDB user=testuser sslrootcert=rds-ca-rsa2048-g1.pem sslmode=verify-full"
```

## PostgreSQL DB 인스턴스에 SSL 연결 요구
<a name="PostgreSQL.Concepts.General.SSL.Requiring"></a>

`rds.force_ssl` 파라미터를 사용하여 PostgreSQL DB 인스턴스에 대한 연결이 SSL을 사용하도록 요구할 수 있습니다. RDS for PostgreSQL 버전 15 이상의 `rds.force_ssl` 파라미터 기본값은 1(켜짐)입니다. 다른 모든 RDS for PostgreSQL 메이저 버전 14 이상에는 이 파라미터의 기본값이 0(꺼짐)입니다. `rds.force_ssl` 파라미터를 1(설정)로 설정하면 해당 DB 클러스터에 대한 연결 시 SSL/TLS를 요구합니다. `rds.force_ssl` 파라미터를 1(설정)로 설정하면 해당 DB 인스턴스에 대한 연결에 대해 SSL을 요구합니다.

이 파라미터의 값을 변경하려면 사용자 지정 DB 파라미터 그룹을 생성해야 합니다. 그런 다음 사용자 지정 DB 파라미터 그룹의 `rds.force_ssl` 값을 `1`로 변경하여 이 기능을 켭니다. RDS for PostgreSQL DB 인스턴스를 생성하기 전에 사용자 지정 DB 파라미터 그룹을 준비하는 경우 생성 과정 중에 기본 파라미터 그룹 대신 선택할 수 있습니다. RDS for PostgreSQL DB 인스턴스가 이미 실행된 후에 이 작업을 수행하는 경우 인스턴스가 사용자 지정 파라미터 그룹을 사용하도록 인스턴스를 재부팅해야 합니다. 자세한 정보는 [Amazon RDS의 파라미터 그룹](USER_WorkingWithParamGroups.md)의 내용을 참조하세요.

DB 인스턴스에서 `rds.force_ssl` 기능이 활성화된 경우 SSL을 사용하지 않는 연결 시도는 다음 메시지와 함께 거부됩니다.

```
$ psql -h db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser
psql: error: FATAL: no pg_hba.conf entry for host "w.x.y.z", user "testuser", database "testDB", SSL off
```

## SSL 연결 상태 확인
<a name="PostgreSQL.Concepts.General.SSL.Status"></a>

DB 인스턴스에 연결할 때 로그온 배너에 연결의 암호화된 상태가 표시됩니다.

```
Password for user master: 
psql (10.3) 
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) 
Type "help" for help.
postgres=>
```

또한, `sslinfo` 확장을 로드한 다음 `ssl_is_used()` 함수를 호출하여 SSL이 사용 중인지 확인할 수 있습니다. 이 함수는 연결이 SSL을 사용할 경우 `t`을 반환하고, 그렇지 않으면 `f`를 반환합니다.

```
postgres=> CREATE EXTENSION sslinfo;
CREATE EXTENSION
postgres=> SELECT ssl_is_used();
ssl_is_used
---------
t
(1 row)
```

자세한 정보를 보려면 다음 쿼리를 사용하여 `pg_settings`에서 정보를 얻을 수 있습니다.

```
SELECT name as "Parameter name", setting as value, short_desc FROM pg_settings WHERE name LIKE '%ssl%';
             Parameter name             |                  value                  |                      short_desc
----------------------------------------+-----------------------------------------+-------------------------------------------------------
 ssl                                    | on                                      | Enables SSL connections.
 ssl_ca_file                            | /rdsdbdata/rds-metadata/ca-cert.pem     | Location of the SSL certificate authority file.
 ssl_cert_file                          | /rdsdbdata/rds-metadata/server-cert.pem | Location of the SSL server certificate file.
 ssl_ciphers                            | HIGH:!aNULL:!3DES                       | Sets the list of allowed SSL ciphers.
 ssl_crl_file                           |                                         | Location of the SSL certificate revocation list file.
 ssl_dh_params_file                     |                                         | Location of the SSL DH parameters file.
 ssl_ecdh_curve                         | prime256v1                              | Sets the curve to use for ECDH.
 ssl_key_file                           | /rdsdbdata/rds-metadata/server-key.pem  | Location of the SSL server private key file.
 ssl_library                            | OpenSSL                                 | Name of the SSL library.
 ssl_max_protocol_version               |                                         | Sets the maximum SSL/TLS protocol version to use.
 ssl_min_protocol_version               | TLSv1.2                                 | Sets the minimum SSL/TLS protocol version to use.
 ssl_passphrase_command                 |                                         | Command to obtain passphrases for SSL.
 ssl_passphrase_command_supports_reload | off                                     | Also use ssl_passphrase_command during server reload.
 ssl_prefer_server_ciphers              | on                                      | Give priority to server ciphersuite order.
(14 rows)
```

또한 다음 쿼리를 사용하여 프로세스, 클라이언트 및 애플리케이션별로 RDS for PostgreSQL DB 인스턴스의 SSL 사용량에 대한 모든 정보를 수집할 수도 있습니다.

```
SELECT datname as "Database name", usename as "User name", ssl, client_addr, application_name, backend_type
   FROM pg_stat_ssl
   JOIN pg_stat_activity
   ON pg_stat_ssl.pid = pg_stat_activity.pid
   ORDER BY ssl;
 Database name | User name | ssl |  client_addr   |    application_name    |         backend_type
---------------+-----------+-----+----------------+------------------------+------------------------------
               |           | f   |                |                        | autovacuum launcher
               | rdsadmin  | f   |                |                        | logical replication launcher
               |           | f   |                |                        | background writer
               |           | f   |                |                        | checkpointer
               |           | f   |                |                        | walwriter
 rdsadmin      | rdsadmin  | t   | 127.0.0.1      |                        | client backend
 rdsadmin      | rdsadmin  | t   | 127.0.0.1      | PostgreSQL JDBC Driver | client backend
 postgres      | postgres  | t   | 204.246.162.36 | psql                   | client backend
(8 rows)
```

SSL 연결에 사용되는 암호를 식별하기 위해 다음과 같이 쿼리할 수 있습니다.

```
postgres=> SELECT ssl_cipher();
ssl_cipher
--------------------
DHE-RSA-AES256-SHA
(1 row)
```

`sslmode` 옵션에 대한 자세한 내용은 *PostgreSQL 설명서*의 [데이터베이스 연결 제어 기능](https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-CONNECT-SSLMODE)을 참조하세요.

## RDS for PostgreSQL의 SSL 암호 제품군
<a name="PostgreSQL.Concepts.General.SSL.Ciphers"></a>

PostgreSQL 구성 파라미터 [ssl\$1ciphers](https://www.postgresql.org/docs/current/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SSL)는 TLS 1.2 이하를 사용할 때 데이터베이스에 대한 SSL 연결에 허용되는 암호 모음의 범주를 지정합니다.

 RDS for PostgreSQL 16 이상에서는 허용 목록에 있는 암호 모음의 특정 값을 사용하도록 `ssl_ciphers` 파라미터를 수정할 수 있습니다. 이는 데이터베이스 인스턴스 재부팅이 필요하지 않은 동적 파라미터입니다. 허용 목록에 있는 암호 모음을 보려면 Amazon RDS 콘솔 또는 다음 AWS CLI 명령을 사용합니다.

```
aws rds describe-db-parameters --db-parameter-group-name <your-parameter-group> --region <region> --endpoint-url <endpoint-url> --output json | jq '.Parameters[] | select(.ParameterName == "ssl_ciphers")'
```

다음 표에는 사용자 지정 구성을 지원하는 버전의 기본 암호 모음과 허용되는 암호 모음이 모두 나열되어 있습니다.


| PostgreSQL 엔진 버전 번호 | 기본 ssl\$1cipher 모음 값 | 허용 목록에 있는 사용자 지정 ssl\$1cipher 모음 값 | 
| --- | --- | --- | 
| 18 | HIGH:\$1aNULL:\$13DES |  `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256`  | 
| 17 | HIGH:\$1aNULL:\$13DES |  `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256`  | 
| 16 | HIGH:\$1aNULL:\$13DES |  `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256`  | 
| 15 | HIGH:\$1aNULL:\$13DES | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 14 | HIGH:\$1aNULL:\$13DES | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 13 | HIGH:\$1aNULL:\$13DES | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 12 | HIGH:\$1aNULL:\$13DES | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 11.4 이상의 마이너 버전 | HIGH:MEDIUM:\$13DES:\$1aNULL:\$1RC4 | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 11.1, 11.2 | HIGH:MEDIUM:\$13DES:\$1aNULL | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 10.9 이상의 마이너 버전 | HIGH:MEDIUM:\$13DES:\$1aNULL:\$1RC4 | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 
| 10.7 이하 마이너 버전 | HIGH:MEDIUM:\$13DES:\$1aNULL | 사용자 지정 ssl\$1ciphers는 지원되지 않음 | 

`TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` 암호 모음을 사용하도록 모든 인스턴스 연결을 구성하려면 다음 예제와 같이 파라미터 그룹을 수정합니다.

```
aws rds modify-db-parameter-group --db-parameter-group-name <your-parameter-group> --parameters "ParameterName='ssl_ciphers',ParameterValue='TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',ApplyMethod=immediate"
```

이 예제에서는 인스턴스가 타원 곡선 암호(ECC)를 갖춘 인증 기관을 사용하여 연결을 설정해야 하는 ECDSA 암호를 사용합니다. Amazon RDS에서 제공하는 인증 기관에 대한 자세한 내용은 [Certificate authorities](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/singWithRDS.SSL.html#UsingWithRDS.SSL.RegionCertificateAuthorities)를 참조하세요.

[Determining the SSL connection status](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.SSL.html#PostgreSQL.Concepts.General.SSL.Status)에 설명된 방법을 통해 사용 중인 암호를 확인할 수 있습니다.

컨텍스트에 따라 암호의 이름이 다를 수 있습니다.
+ 파라미터 그룹에서 구성할 수 있는 허용 목록에 있는 암호는 IANA 이름과 함께 참조됩니다.
+ `sslinfo` 및 `psql` 로그온 배너는 OpenSSL 이름을 사용하는 암호를 가리킵니다.

RDS for PostgreSQL 16 이상에서 `ssl_max_protocol_version`의 값은 기본적으로 TLS v1.3입니다. TLS v1.3은 `ssl_ciphers` 파라미터에 지정된 암호 구성을 사용하지 않으므로 이 파라미터의 값을 TLS v1.2로 설정해야 합니다. 값을 TLS v1.2로 설정하면 연결은 `ssl_ciphers`에서 정의한 암호만 사용합니다.

```
aws rds modify-db-parameter-group --db-parameter-group-name <your-parameter-group> --parameters "ParameterName='ssl_max_protocol_version',ParameterValue='TLSv1.2',ApplyMethod=immediate"
```

데이터베이스 연결이 SSL을 사용하도록 하려면 파라미터 그룹에서를 `rds.force_ssl parameter`를 1로 설정합니다. 파라미터 및 파라미터 그룹에 대한 자세한 내용은 [Parameter groups for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)를 참조하세요.

# 새 SSL/TLS 인증서를 사용해 PostgreSQL DB 인스턴스에 연결할 애플리케이션 업데이트
<a name="ssl-certificate-rotation-postgresql"></a>

보안 소켓 계층 또는 전송 계층(SSL/TLS)에 사용되는 인증서는 일반적으로 설정된 수명을 가집니다. 서비스 공급자가 인증 기관(CA) 인증서를 업데이트할 때 클라이언트는 새 인증서를 사용하도록 애플리케이션을 업데이트해야 합니다. 다음은 클라이언트 애플리케이션에서 SSL/TLS를 사용하여 Amazon RDS for PostgreSQL DB 인스턴스에 연결하는지 판단하는 방법에 대한 정보를 확인할 수 있습니다. 또한 이러한 애플리케이션이 연결할 때 서버 인증서를 확인하는지 확인하는 방법에 대한 정보도 확인할 수 있습니다.

**참고**  
SSL/TLS 연결 전에 서버 인증서를 확인하도록 구성된 클라이언트 애플리케이션은 클라이언트의 트러스트 스토어에 유효한 CA 인증서가 있어야 합니다. 새 인증서에 필요한 경우 클라이언트 트러스트 스토어를 업데이트합니다.

클라이언트 애플리케이션 트러스트 스토어에서 CA 인증서를 업데이트한 후에는 DB 인스턴스에서 인증서를 교환할 수 있습니다. 이 절차를 프로덕션 환경에서 구현하기 전에 비 프로덕션 환경에서 테스트해볼 것을 적극 권장합니다.

인증서 교환에 대한 자세한 내용은 [SSL/TLS 인증서 교체](UsingWithRDS.SSL-certificate-rotation.md) 단원을 참조하십시오. 인증서 다운로드에 대한 자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 단원을 참조하십시오. PostgreSQL DB 인스턴스에서 SSL/TLS를 사용하는 방법에 관한 자세한 내용은 [PostgreSQL DB 인스턴스와 함께 SSL 사용](PostgreSQL.Concepts.General.SSL.md) 단원을 참조하십시오.

**Topics**
+ [애플리케이션에서 SSL을 사용해 PostgreSQL DB 인스턴스에 연결하는지 여부 확인](#ssl-certificate-rotation-postgresql.determining-server)
+ [클라이언트에서 연결을 위해 인증서 확인이 필요한지 여부 확인](#ssl-certificate-rotation-postgresql.determining-client)
+ [애플리케이션 트러스트 스토어 업데이트](#ssl-certificate-rotation-postgresql.updating-trust-store)
+ [다양한 유형의 애플리케이션에 대해 SSL/TLS 연결 사용](#ssl-certificate-rotation-postgresql.applications)

## 애플리케이션에서 SSL을 사용해 PostgreSQL DB 인스턴스에 연결하는지 여부 확인
<a name="ssl-certificate-rotation-postgresql.determining-server"></a>

`rds.force_ssl` 파라미터의 값에 대한 DB 인스턴스 구성을 확인하십시오. 기본적으로 이 `rds.force_ssl` 파라미터는 버전 15 이하의 PostgreSQL 버전을 사용하는 DB 인스턴스의 경우 `0`(꺼짐)으로 설정되어 있습니다. 기본적으로 이 `rds.force_ssl` 파라미터는 PostgreSQL 버전 15 이상의 메이저 버전을 사용하는 DB 인스턴스의 경우 `1`(켜짐)으로 설정되어 있습니다. `rds.force_ssl` 파라미터가 `1`(켜짐)로 설정된 경우 클라이언트는 연결 시 SSL/TLS를 사용해야 합니다. 파라미터 그룹에 대한 자세한 내용은 [Amazon RDS의 파라미터 그룹](USER_WorkingWithParamGroups.md) 단원을 참조하십시오.

RDS PostgreSQL 버전 9.5 이상 메이저 버전을 사용 중이고 `rds.force_ssl`이 `1`(켜짐)로 설정되어 있지 않으면 SSL을 사용하여 연결을 확인하도록 `pg_stat_ssl` 보기를 쿼리하십시오. 예를 들어 다음 쿼리에서는 SSL 연결과 SSL을 사용하는 클라이언트에 관한 정보만 반환합니다.

```
SELECT datname, usename, ssl, client_addr 
  FROM pg_stat_ssl INNER JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid
  WHERE ssl is true and usename<>'rdsadmin';
```

SSL/TLS 연결을 사용하는 행만 연결에 관한 정보와 함께 표시됩니다. 다음은 출력 샘플입니다.

```
 datname  | usename | ssl | client_addr 
----------+---------+-----+-------------
 benchdb  | pgadmin | t   | 53.95.6.13
 postgres | pgadmin | t   | 53.95.6.13
(2 rows)
```

이 쿼리에서는 쿼리 시점의 현재 연결만 표시합니다. 결과가 표시되지 않는다 해도 SSL 연결을 사용하는 애플리케이션이 없는 것은 아닙니다. 다른 SSL 연결이 다른 시점에 설정될 수 있습니다.

## 클라이언트에서 연결을 위해 인증서 확인이 필요한지 여부 확인
<a name="ssl-certificate-rotation-postgresql.determining-client"></a>

psql 또는 JDBC와 같은 클라이언트가 SSL을 지원하도록 구성되어 있는 경우 클라이언트는 먼저 SSL을 이용해 데이터베이스에 연결을 시도하도록 기본 설정되어 있습니다. SSL을 이용해 연결할 수 없는 경우 클라이언트는 SSL 없이 연결하는 방식으로 전환됩니다. libpq 기반 클라이언트(예: psql)와 JDBC 모두에 사용되는 기본 `sslmode` 모드는 `prefer`로 설정됩니다. 서버의 인증서는 `sslrootcert`에서 `sslmode`가 `verify-ca` 또는 `verify-full`로 설정된 경우에만 확인됩니다. 인증서가 잘못된 경우 오류가 발생합니다.

`PGSSLROOTCERT`를 사용하여 `PGSSLMODE`가 `verify-ca` 또는 `verify-full`로 설정된 `PGSSLMODE` 환경 변수로 인증서를 확인하세요.

```
PGSSLMODE=verify-full PGSSLROOTCERT=/fullpath/ssl-cert.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U masteruser -d postgres
```

`sslrootcert` 인수를 사용해 `sslmode`, `verify-ca` 또는 `verify-full`로 설정된 연결 문자열 형식의 `sslmode`로 인증서를 확인하세요.

```
psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=verify-full sslrootcert=/full/path/ssl-cert.pem user=masteruser dbname=postgres"
```

예를 들어 앞의 사례에서 잘못된 루트 인증서를 사용하는 경우 클라이언트에서 다음과 비슷한 오류가 발생합니다.

```
psql: SSL error: certificate verify failed
```

## 애플리케이션 트러스트 스토어 업데이트
<a name="ssl-certificate-rotation-postgresql.updating-trust-store"></a>

PostgreSQL 애플리케이션에 대한 트러스트 스토어 업데이트에 대한 자세한 내용은 PostgreSQL 문서의 [SSL을 이용한 TCP/IP 연결의 보안](https://www.postgresql.org/docs/current/ssl-tcp.html) 단원을 참조하십시오.

루트 인증서 다운로드에 대한 자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 단원을 참조하십시오.

인증서를 가져오는 샘플 스크립트는 [트러스트 스토어로 인증서를 가져오기 위한 샘플 스크립트](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script) 섹션을 참조하세요.

**참고**  
트러스트 스토어를 업데이트할 때 새 인증서를 추가할 뿐 아니라 이전 인증서를 유지할 수도 있습니다.

## 다양한 유형의 애플리케이션에 대해 SSL/TLS 연결 사용
<a name="ssl-certificate-rotation-postgresql.applications"></a>

아래에서는 다양한 유형의 애플리케이션에 대해 SSL/TLS 연결을 사용하는 방법에 대한 정보를 제공합니다.
+ **psql**

  클라이언트는 명령줄에서 옵션을 연결 문자열 또는 환경 변수로 지정하여 호출합니다. SSL/TLS 연결의 경우 관련 옵션은 `sslmode`(환경 변수 `PGSSLMODE`), `sslrootcert`(환경 변수 `PGSSLROOTCERT`)입니다.

  옵션 전체 목록은 PostgreSQL 문서의 [파라미터 키 단어](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS) 단원을 참조하십시오. 환경 변수 전체 목록은 PostgreSQL 문서의 [환경 변수](https://www.postgresql.org/docs/current/libpq-envars.html) 단원을 참조하십시오.
+ **pgAdmin**

  이 브라우저 기반 클라이언트는 PostgreSQL 데이터베이스 연결 시 사용할 수 있는 더 사용자 친화적인 인터페이스입니다.

  연결 구성에 대한 자세한 내용은 [pgAdmin 설명서](https://www.pgadmin.org/docs/pgadmin4/latest/server_dialog.html)를 참조하십시오.
+ **JDBC**

  JDBC를 통해 Java 애플리케이션의 데이터베이스 연결을 활성화할 수 있습니다.

  JDBC를 이용한 PostgreSQL 데이터베이스 연결에 대한 자세한 내용은 PostgreSQL JDBC 드라이버 설명서의 [데이터베이스에 연결](https://jdbc.postgresql.org/documentation/use/#connecting-to-the-database) 단원을 참조하십시오. SSL/TLS을 이용한 연결에 대한 자세한 내용은 PostgreSQL JDBC 드라이버 설명서의 [클라이언트 구성](https://jdbc.postgresql.org/documentation/ssl/#configuring-the-client) 단원을 참조하십시오.
+ **Python**

  PostgreSQL 데이터베이스에 연결하기 위해 많이 사용되는 인기 있는 Python 라이브러리는 `psycopg2`입니다.

  `psycopg2` 사용에 대한 자세한 내용은 [psycopg2 설명서](https://pypi.org/project/psycopg2/)를 참조하십시오. PostgreSQL 데이터베이스에 연결하는 방법에 대한 짧은 자습서는 [Psycopg2 자습서](https://wiki.postgresql.org/wiki/Psycopg2_Tutorial)를 참조하십시오. [psycopg2 모듈 콘텐츠](http://initd.org/psycopg/docs/module.html#module-psycopg2)에서 연결 명령이 수락하는 옵션에 대한 정보를 얻을 수 있습니다.

**중요**  
데이터베이스 연결에서 SSL/TLS를 사용함을 확인하고 애플리케이션 트러스트 스토어를 업데이트한 후에는 데이터베이스에서 rds-ca-rsa2048-g1 인증서를 사용하도록 업데이트할 수 있습니다. 지침은 [DB 인스턴스또는 클러스터를 수정하여 CA 인증서 업데이트](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)의 3단계를 참조하십시오.