

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

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

이 주제는 클라이언트 애플리케이션에서 SSL/TLS를 사용해 DB 인스턴스에 연결하는지 여부를 판단하는 데 도움이 됩니다.

**중요**  
Amazon RDS for Oracle DB 인스턴스에 대한 인증서를 변경하면 데이터베이스 리스너만 다시 시작됩니다. DB 인스턴스는 다시 시작되지 않았습니다. 기존 데이터베이스 연결은 영향을 받지 않지만, 리스너가 다시 시작되는 동안 잠시 새 접속에 오류가 발생합니다.  
연결 오류를 방지하려면 Oracle DB를 다시 시작하는 것이 좋습니다.

**참고**  
SSL/TLS를 사용하여 DB 인스턴스에 연결하는 클라이언트 애플리케이션의 경우, 새 CA 인증서를 포함하도록 클라이언트 애플리케이션 트러스트 스토어를 업데이트해야 합니다.

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

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

**Topics**
+ [애플리케이션이 SSL을 사용하여 연결하는지 확인](#ssl-certificate-rotation-oracle.determining)
+ [애플리케이션 트러스트 스토어 업데이트](#ssl-certificate-rotation-oracle.updating-trust-store)
+ [SSL 연결 설정을 위한 Java 코드 예시](#ssl-certificate-rotation-oracle.java-example)

## 애플리케이션이 SSL을 사용하여 연결하는지 확인
<a name="ssl-certificate-rotation-oracle.determining"></a>

Oracle DB 인스턴스가 `SSL` 옵션이 추가된 옵션 그룹을 사용하는 경우 SSL을 사용 중일 수 있습니다. [옵션 그룹의 옵션 및 옵션 설정 표시하기](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ListOption)의 지침을 따라서 확인합니다. `SSL` 옵션에 대한 자세한 내용은 [Oracle 보안 소켓 Layer](Appendix.Oracle.Options.SSL.md) 단원을 참조하십시오.

리스너 로그를 확인하여 SSL 연결이 있는지 확인하십시오. 다음은 리스너 로그의 출력 샘플입니다.

```
date time * (CONNECT_DATA=(CID=(PROGRAM=program)
(HOST=host)(USER=user))(SID=sid)) * 
(ADDRESS=(PROTOCOL=tcps)(HOST=host)(PORT=port)) * establish * ORCL * 0
```

`PROTOCOL`의 한 항목 값이 `tcps`인 경우, SSL 연결이 표시됩니다. 그러나 `HOST`가 `127.0.0.1`인 경우 항목을 무시할 수 있습니다. `127.0.0.1`로부터의 연결은 DB 인스턴스의 로컬 관리 에이전트입니다. 이 연결은 외부 SSL 연결이 아닙니다. 따라서 리스너 로그 항목에 `PROTOCOL`이 `tcps`로, `HOST`가 `127.0.0.1`이 *아닌* 것으로 표시되면 SSL을 사용하여 연결하는 애플리케이션이 있는 것입니다.

리스너 로그를 확인하려면 Amazon CloudWatch Logs에 로그를 게시하면 됩니다. 자세한 내용은 [Amazon CloudWatch Logs에 Oracle 로그 게시](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Oracle.PublishtoCloudWatchLogs) 섹션을 참조하세요.

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

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

### SQL\$1Plus를 위한 애플리케이션 트러스트 스토어 업데이트
<a name="ssl-certificate-rotation-oracle.updating-trust-store.sqlplus"></a>

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

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

**SQL\$1Plus 애플리케이션에 대해 트러스트 스토어를 업데이트하려면**

1. 모든 AWS 리전에서 작동하는 새 루트 인증서를 다운로드하고 이 파일을 `ssl_wallet` 디렉터리에 저장하세요.

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

1. 다음 명령을 실행하여 Oracle wallet을 업데이트합니다.

   ```
   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert
         $ORACLE_HOME/ssl_wallet/ssl-cert.pem -auto_login_only
   ```

   파일 이름을 다운로드한 파일 이름으로 바꿉니다.

1. wallet이 성공적으로 업데이트되었는지 확인하려면 다음 명령을 실행하십시오.

   ```
   prompt>orapki wallet display -wallet $ORACLE_HOME/ssl_wallet                     
   ```

   출력에 다음 사항이 포함되어 있어야 합니다.

   ```
   Trusted Certificates: 
   Subject: CN=Amazon RDS Root 2019 CA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,L=Seattle,ST=Washington,C=US
   ```

### JDBC를 위한 애플리케이션 트러스트 스토어 업데이트
<a name="ssl-certificate-rotation-oracle.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 연결 설정을 위한 Java 코드 예시
<a name="ssl-certificate-rotation-oracle.java-example"></a>

다음은 JDBC를 사용하여 SSL 연결을 설정하는 방법을 보여 주는 코드 예입니다.

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
 
public class OracleSslConnectionTest {
    private static final String DB_SERVER_NAME = "<dns-name-provided-by-amazon-rds>";
    private static final Integer SSL_PORT = "<ssl-option-port-configured-in-option-group>";
    private static final String DB_SID = "<oracle-sid>";
    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 main(String[] args) throws SQLException {
        final Properties properties = new Properties();
        final String connectionString = String.format(
                "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))",
                DB_SERVER_NAME, SSL_PORT, DB_SID);
        properties.put("user", DB_USER);
        properties.put("password", DB_PASSWORD);
        properties.put("oracle.jdbc.J2EE13Compliant", "true");
        properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        properties.put("javax.net.ssl.trustStoreType", "JKS");
        properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);
        final Connection connection = DriverManager.getConnection(connectionString, properties);
        // If no exception, that means handshake has passed, and an SSL connection can be opened
    }
}
```

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