

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

2023년 1월 13일부터 Amazon RDS는 보안 소켓 계층(SSL) 또는 전송 계층 보안(TLS)을 사용해 Aurora DB 클러스터에 연결하기 위한 용도의 새 인증 기관(CA) 인증서를 게시하였습니다. 아래에서 새 인증서를 사용하기 위해 애플리케이션을 업데이트하는 방법에 관한 정보를 찾으실 수 있습니다.

이 주제는 클라이언트 애플리케이션에서 SSL/TLS를 사용해 DB 클러스터에 연결하는지 여부를 판단하는 데 도움이 됩니다. SSL/TLS를 사용해 연결한다면 이 애플리케이션에서 연결 시 인증서 확인이 필요한지 여부를 추가로 확인할 수 있습니다.

**참고**  
어떤 애플리케이션은 서버에서 인증서를 성공적으로 확인할 수 있는 경우에만 Aurora PostgreSQL DB 클러스터에 연결하도록 구성되어 있습니다.  
이러한 애플리케이션의 경우 클라이언트 애플리케이션 트러스트 스토어를 업데이트하여 새 CA 인증서를 포함해야 합니다.

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

인증서 교환에 대한 자세한 내용은 [SSL/TLS 인증서 교체](UsingWithRDS.SSL-certificate-rotation.md) 단원을 참조하십시오. 인증서 다운로드에 대한 자세한 내용은 [SSL/TLS를 사용하여 DB 클러스터에 대한 연결 암호화](UsingWithRDS.SSL.md) 단원을 참조하십시오. PostgreSQL DB 클러스터에서 SSL/TLS를 사용하는 방법에 관한 자세한 내용은 [SSL/TLS를 이용한 Aurora PostgreSQL 데이터 보안](AuroraPostgreSQL.Security.md#AuroraPostgreSQL.Security.SSL) 단원을 참조하십시오.

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

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

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

`rds.force_ssl`이 `1`(켜짐)로 설정되지 않은 경우 `pg_stat_ssl` 보기를 쿼리하여 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-aurora-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 primaryuser -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=primaryuser dbname=postgres"
```

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

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

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

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

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

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

SSL/TLS 연결을 위해 JDBC를 사용하는 애플리케이션에 대해 트러스트 스토어를 업데이트할 수 있습니다.

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

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

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

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

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

  옵션 전체 목록은 PostgreSQL 문서의 [파라미터 키 단어](https://www.postgresql.org/docs/11/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 문서의 [데이터베이스에 연결](https://jdbc.postgresql.org/documentation/use/) 단원을 참조하십시오. SSL/TLS을 이용한 PostgreSQL 문서의 [클라이언트 구성](https://jdbc.postgresql.org/documentation/ssl/) 단원을 참조하십시오.
+ **Python**

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

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

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