

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

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

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

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

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

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

**Topics**
+ [애플리케이션에서 TLS를 사용하여 Aurora MySQL DB 클러스터에 연결하는지 여부 확인](#ssl-certificate-rotation-aurora-mysql.determining-server)
+ [클라이언트에서 연결 시 인증서 확인이 필요한지 여부 확인](#ssl-certificate-rotation-aurora-mysql.determining-client)
+ [애플리케이션 트러스트 스토어 업데이트](#ssl-certificate-rotation-aurora-mysql.updating-trust-store)
+ [TLS 연결 설정을 위한 Java 코드 예제](#ssl-certificate-rotation-aurora-mysql.java-example)

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

Aurora MySQL 버전 2(MySQL 5.7과 호환됨)를 사용 중이고 성능 스키마가 활성화되어 있는 경우 다음 쿼리를 실행하여 연결 시 TLS를 사용하는지 여부를 확인합니다. 성능 스키마 활성화에 대한 자세한 내용은 MySQL 설명서의 [성능 스키마 빠른 시작](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-quick-start.html)을 참조하십시오.

```
mysql> SELECT id, user, host, connection_type
       FROM performance_schema.threads pst
       INNER JOIN information_schema.processlist isp
       ON pst.processlist_id = isp.id;
```

이 샘플 출력에서는 사용자 본인의 세션(`admin`)과 `webapp1`로 로그인된 애플리케이션에서 모두 TLS를 사용 중임을 알 수 있습니다.

```
+----+-----------------+------------------+-----------------+
| id | user            | host             | connection_type |
+----+-----------------+------------------+-----------------+
|  8 | admin           | 10.0.4.249:42590 | SSL/TLS         |
|  4 | event_scheduler | localhost        | NULL            |
| 10 | webapp1         | 159.28.1.1:42189 | SSL/TLS         |
+----+-----------------+------------------+-----------------+
3 rows in set (0.00 sec)
```

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

JDBC 클라이언트 및 MySQL 클라이언트에서 연결 시 인증서 확인이 필요한지 여부를 확인할 수 있습니다.

### JDBC
<a name="ssl-certificate-rotation-aurora-mysql.determining-client.jdbc"></a>

아래의 MySQL 커넥터/J 8.0 관련 예시에서는 애플리케이션의 JDBC 연결 속성을 확인하여 성공적인 연결을 위해 유효한 인증서가 필요한지 여부를 판단하는 한 가지 방법을 보여줍니다. MySQL에 대한 모든 JDBC 연결 옵션에 대한 자세한 내용은 MySQL 문서의 [구성 속성](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)을 참조하십시오.

MySQL 커넥터/J 8.0을 사용 중인 경우 다음 예제와 같이 연결 속성에서 `sslMode`가 `VERIFY_CA` 또는 `VERIFY_IDENTITY`로 설정되어 있다면 TLS 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

```
Properties properties = new Properties();
properties.setProperty("sslMode", "VERIFY_IDENTITY");
properties.put("user", DB_USER);
properties.put("password", DB_PASSWORD);
```

**참고**  
데이터베이스에 연결할 때 TLS를 사용하도록 애플리케이션을 명시적으로 구성하지 않았더라도 MySQL Java Connector v5.1.38 이상 또는 MySQL Java Connector v8.0.9 이상을 사용하여 데이터베이스에 연결하는 경우, 이러한 클라이언트 드라이버는 기본적으로 TLS를 사용합니다. 또한 TLS 사용 시 부분 인증서 확인을 수행하고 데이터베이스 서버 인증서가 만료되면 연결에 실패합니다.

### MySQL
<a name="ssl-certificate-rotation-aurora-mysql.determining-client.mysql"></a>

MySQL 클라이언트에 관한 다음 예시에서는 스크립트의 MySQL 연결을 확인하여 성공적인 연결을 위해 유효한 인증서가 필요한지 여부를 판단하는 두 가지 방법을 보여줍니다. MySQL 클라이언트의 모든 연결 옵션에 대한 자세한 내용은 MySQL 문서의 [암호화된 연결을 위한 클라이언트 측 구성](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration)을 참조하십시오.

MySQL 5.7 또는 MySQL 8.0 클라이언트를 사용 중인 경우 다음 예제와 같이 `--ssl-mode` 옵션에 대해 `VERIFY_CA` 또는 `VERIFY_IDENTITY`를 지정했다면 TLS 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

```
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/{{ssl-cert.pem}} --ssl-mode=VERIFY_CA
```

MySQL 5.6 클라이언트를 사용 중인 경우 다음 예시와 같이 `--ssl-verify-server-cert` 옵션을 지정했다면 SSL 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

```
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/{{ssl-cert.pem}} --ssl-verify-server-cert
```

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

MySQL 애플리케이션을 위한 트러스트 스토어 업데이트에 관한 자세한 내용은 MySQL 문서의 [SSL 인증서 설치](https://dev.mysql.com/doc/mysql-monitor/8.0/en/mem-ssl-installation.html) 단원을 참조하십시오.

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

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

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

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

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

애플리케이션에서 mysql JDBC를 사용 중인 경우 애플리케이션에서 다음 속성을 설정하십시오.

```
System.setProperty("javax.net.ssl.trustStore", {{certs}});
System.setProperty("javax.net.ssl.trustStorePassword", "{{password}}");
```

**참고**  
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

애플리케이션을 시작할 때 다음 속성을 설정하십시오.

```
java -Djavax.net.ssl.trustStore={{/path_to_truststore/MyTruststore.jks}} -Djavax.net.ssl.trustStorePassword={{my_truststore_password}} {{com.companyName.MyApplication}}
```

## TLS 연결 설정을 위한 Java 코드 예제
<a name="ssl-certificate-rotation-aurora-mysql.java-example"></a>

다음 코드 예시에서는 JDBC를 사용하여 서버 인증서를 확인하는 SSL 연결을 설정하는 방법을 보여줍니다.

```
public class MySQLSSLTest {

        private static final String DB_USER = "{{user name}}";
        private static final String DB_PASSWORD = "{{password}}";
        // This key store has only the prod root ca.
        private static final String KEY_STORE_FILE_PATH = "{{file-path-to-keystore}}";
        private static final String KEY_STORE_PASS = "{{keystore-password}}";

    public static void test(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");


        System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);

        Properties properties = new Properties();
        properties.setProperty("sslMode", "VERIFY_IDENTITY");
        properties.put("user", DB_USER);
        properties.put("password", DB_PASSWORD);

        Connection connection = DriverManager.getConnection("jdbc:mysql://jagdeeps-ssl-test.cni62e2e7kwh.us-east-1.rds.amazonaws.com:3306",properties);
        Statement stmt=connection.createStatement();

        ResultSet rs=stmt.executeQuery("SELECT 1 from dual");

        return;
    }
}
```

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