

# 새 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단계를 참조하십시오.