

# Oracle 보안 소켓 Layer
<a name="Appendix.Oracle.Options.SSL"></a>

RDS for Oracle DB 인스턴스에 대해 SSL 암호화를 활성화하려면 DB 인스턴스와 연결된 옵션 그룹에 Oracle SSL 옵션을 추가합니다. Amazon RDS는 Oracle에서 요구하는 대로 SSL 연결을 위해 두 번째 포트를 사용합니다. 이 접근 방식에서는 DB 인스턴스와 SQL\$1Plus 간에 클리어 텍스트 통신과 SSL로 암호화된 통신이 동시에 발생할 수 있습니다. 예를 들어 이 포트를 클리어 텍스트 통신에 사용하여 VPC 내의 다른 리소스와 통신하면서 동일한 포트를 SSL로 암호화된 통신에 사용하여 VPC 외부의 리소스와 통신할 수 있습니다.

**참고**  
동일한 RDS for Oracle DB 인스턴스에서 SSL 또는 NNE(기본 네트워크 암호화)를 사용할 수 있지만 동시에 사용할 수는 없습니다. SSL 암호화를 사용할 경우 다른 연결 암호화는 모두 해제해야 합니다. 자세한 내용은 [Oracle 기본 네트워크 암호화](Appendix.Oracle.Options.NetworkEncryption.md) 섹션을 참조하세요.

SSL/TLS 및 NNE는 더 이상 Oracle Advanced Security의 일부가 아닙니다. RDS for Oracle에서는 다음 데이터베이스 버전의 모든 정식 에디션에서 SSL 암호화를 사용할 수 있습니다.
+ Oracle Database 21c(21.0.0)
+ Oracle Database 19c(19.0.0)

**Topics**
+ [

## Oracle SSL 옵션에 대한 TLS 버전
](#Appendix.Oracle.Options.SSL.TLS)
+ [

## Oracle SSL 옵션에 대한 암호 그룹
](#Appendix.Oracle.Options.SSL.CipherSuites)
+ [

## FIPS 지원
](#Appendix.Oracle.Options.SSL.FIPS)
+ [

## 암호 제품군과의 인증서 호환성
](#Appendix.Oracle.Options.SSL.CertificateCompatibility)
+ [

# SSL 옵션 추가
](Appendix.Oracle.Options.SSL.OptionGroup.md)
+ [

# RDS for Oracle DB 인스턴스에 SSL을 사용하도록 SQL\$1Plus 구성
](Appendix.Oracle.Options.SSL.ClientConfiguration.md)
+ [

# SSL을 사용하여 RDS for Oracle DB 인스턴스에 연결
](Appendix.Oracle.Options.SSL.Connecting.md)
+ [

# JDBC를 통한 SSL 연결 설정
](Appendix.Oracle.Options.SSL.JDBC.md)
+ [

# SSL 연결과 DN 일치 적용
](Appendix.Oracle.Options.SSL.DNMatch.md)
+ [

# SSL 연결 문제 해결
](Appendix.Oracle.Options.SSL.troubleshooting.md)

## Oracle SSL 옵션에 대한 TLS 버전
<a name="Appendix.Oracle.Options.SSL.TLS"></a>

Amazon RDS for Oracle은 TLS(전송 계층 보안) 버전 1.0 및 1.2를 지원합니다. 새 Oracle SSL 옵션을 추가할 경우, 유효한 값에 `SQLNET.SSL_VERSION`을 명시적으로 설정합니다. 다음은 이 옵션 설정으로 허용되는 값입니다.
+ `"1.0"` – 클라이언트는 TLS 버전 1.0만 사용하여 DB 인스턴스에 연결할 수 있습니다. 기존 Oracle SSL 옵션에서 `SQLNET.SSL_VERSION`은 `"1.0"`으로 자동 설정됩니다. 필요할 경우 설정을 변경할 수 있습니다.
+ `"1.2"` – 클라이언트는 TLS 1.2만 사용하여 DB 인스턴스에 연결할 수 있습니다.
+ `"1.2 or 1.0"` – 클라이언트는 TLS 1.2 또는 1.0을 사용하여 DB 인스턴스에 연결할 수 있습니다.

## Oracle SSL 옵션에 대한 암호 그룹
<a name="Appendix.Oracle.Options.SSL.CipherSuites"></a>

Amazon RDS for Oracle은 여러 개의 SSL 암호 그룹을 지원합니다. 기본적으로 Oracle SSL은 `SSL_RSA_WITH_AES_256_CBC_SHA` 암호 그룹을 사용하도록 구성되어 있습니다. SSL 연결을 통해 사용할 다른 암호 그룹을 지정하려면 `SQLNET.CIPHER_SUITE` 옵션 설정을 사용하십시오.

`SQLNET.CIPHER_SUITE`에 대해 여러 값을 지정할 수 있습니다. 이 기법은 DB 인스턴스 간에 데이터베이스 링크가 있고 암호 그룹을 업데이트하려는 경우에 유용합니다.

다음 표에는 Oracle 데이터베이스 19c 및 21c의 모든 버전에서 RDS for Oracle에 대한 SSL 지원이 요약되어 있습니다.


| 암호 그룹(SQLNET.CIPHER\$1SUITE) | TLS 버전 지원(SQLNET.SSL\$1VERSION) | FIPS 지원 | FedRAMP 규정 준수 | 
| --- | --- | --- | --- | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA(기본) | 1.0 및 1.2 | 예 | 아니요 | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 | 1.2 | 예 | 아니요 | 
| SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 예 | 아니요 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 1.2 | 예 | 예 | 
| TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 | 1.2 | 예 | 예 | 

## FIPS 지원
<a name="Appendix.Oracle.Options.SSL.FIPS"></a>

RDS for Oracle을 사용하면 140-2에 대해 FIPS(Federal Information Processing Standard) 표준을 사용할 수 있습니다. FIPS 140-2는 암호 모듈 보안 요구 사항을 정의하는 미국 정부 표준입니다. Oracle SSL 옵션에 대해 `FIPS.SSLFIPS_140`을 `TRUE`로 설정하여 FIPS 표준을 활성화합니다. FIPS 140-2가 SSL용으로 구성된 경우 암호화 라이브러리는 클라이언트와 RDS for Oracle DB 인스턴스 간의 데이터를 암호화합니다.

클라이언트는 FIPS를 준수하는 암호 제품군을 사용해야 합니다. 연결을 설정할 때 클라이언트와 RDS for Oracle DB 인스턴스는 메시지를 주고받을 때 사용할 암호 제품군을 협상합니다. [Oracle SSL 옵션에 대한 암호 그룹](#Appendix.Oracle.Options.SSL.CipherSuites)의 테이블에서는 각 TLS 버전에 대한 FIPS 호환 SSL 암호 그룹을 보여줍니다. 자세한 내용은 Oracle Database 설명서의 [Oracle Database FIPS 140-2 설정](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/dbseg/oracle-database-fips-140-settings.html#GUID-DDBEB3F9-B216-44BB-8C18-43B5E468CBBB)을 참조하세요.

## 암호 제품군과의 인증서 호환성
<a name="Appendix.Oracle.Options.SSL.CertificateCompatibility"></a>

RDS for Oracle은 RSA 및 타원 곡선 디지털 서명 알고리즘(ECDSA) 인증서를 모두 지원합니다. DB 인스턴스에 대해 SSL을 구성할 때 `SQLNET.CIPHER_SUITE` 옵션 설정에서 지정한 암호 제품군이 DB 인스턴스에서 사용하는 인증서 유형과 호환되는지 확인해야 합니다.

다음 표는 인증서 유형과 암호 제품군 간의 호환성을 보여 줍니다.


| 인증서 유형 | 호환되는 암호 제품군 | 호환되지 않는 암호 제품군 | 
| --- | --- | --- | 
| RSA 인증서(rds-ca-2019, rds-ca-rsa2048-g1, rds-ca-rsa4096-g1) |  SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA  |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  | 
| ECDSA 인증서(rds-ca-ecc384-g1) |  TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1ECDSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  |  SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA SSL\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA256 SSL\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA  | 

`SQLNET.CIPHER_SUITE` 옵션 설정에서 여러 암호 제품군을 지정하는 경우 DB 인스턴스에서 사용하는 인증서 유형과 호환되는 암호 제품군을 하나 이상 포함해야 합니다. 인증서 유형이 다른 DB 인스턴스가 여러 개인 옵션 그룹을 사용하는 경우 각 인증서 유형에 대해 하나 이상의 암호 제품군을 포함합니다.

옵션 그룹을 DB 인스턴스의 인증서 유형과 호환되지 않는 암호 그룹만 포함하는 SSL 옵션과 연결하려고 하면 비호환성을 나타내는 오류 메시지와 함께 작업이 실패합니다.

# SSL 옵션 추가
<a name="Appendix.Oracle.Options.SSL.OptionGroup"></a>

SSL을 사용하려면 RDS for Oracle DB 인스턴스가 `SSL` 옵션을 포함하는 옵션 그룹과 연결되어 있어야 합니다.

## 콘솔
<a name="Appendix.Oracle.Options.SSL.OptionGroup.Console"></a>

**SSL 옵션을 옵션 그룹에 추가하려면**

1. 새 옵션 그룹을 만들거나 `SSL` 옵션을 추가할 수 있는 기존 옵션 그룹을 식별하십시오.

   옵션 그룹의 생성에 대한 자세한 내용은 [옵션 그룹 생성](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create) 단원을 참조하십시오.

1. [`SSL`] 옵션을 옵션 그룹에 추가합니다.

   SSL 연결에 FIPS 확인 암호 제품군만 사용하려면 `FIPS.SSLFIPS_140` 옵션을 `TRUE`로 설정합니다. FIPS 표준에 대한 자세한 내용은 [FIPS 지원](Appendix.Oracle.Options.SSL.md#Appendix.Oracle.Options.SSL.FIPS) 단원을 참조하십시오.

   옵션 그룹에 옵션을 추가하는 방법에 대한 자세한 내용은 [옵션 그룹에 옵션 추가](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption) 단원을 참조하십시오.

1. 새 RDS for Oracle DB 인스턴스를 생성하고 옵션 그룹을 연결하거나, RDS for Oracle DB 인스턴스를 수정하여 옵션 그룹을 연결합니다.

   DB 인스턴스 생성에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 단원을 참조하세요.

   DB 인스턴스 수정에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 단원을 참조하세요.

## AWS CLI
<a name="Appendix.Oracle.Options.SSL.OptionGroup.CLI"></a>

**SSL 옵션을 옵션 그룹에 추가하려면**

1. 새 옵션 그룹을 만들거나 `SSL` 옵션을 추가할 수 있는 기존 옵션 그룹을 식별하십시오.

   옵션 그룹의 생성에 대한 자세한 내용은 [옵션 그룹 생성](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create) 단원을 참조하십시오.

1. [`SSL`] 옵션을 옵션 그룹에 추가합니다.

   다음 옵션 설정을 지정합니다.
   + `Port` – SSL 포트 번호입니다.
   + `VpcSecurityGroupMemberships` – 옵션이 활성화되는 VPC 보안 그룹입니다.
   + `SQLNET.SSL_VERSION` – 클라이언트가 DB 인스턴스에 연결할 때 사용할 수 있는 TLS 버전입니다.

   예를 들어 다음 AWS CLI 명령은 `SSL` 옵션을 `ora-option-group`이라는 옵션 그룹에 추가합니다.  
**Example**  

   대상 LinuxmacOS, 또는Unix:

   ```
   aws rds add-option-to-option-group --option-group-name ora-option-group \
     --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
   ```

   Windows의 경우:

   ```
   aws rds add-option-to-option-group --option-group-name ora-option-group ^
     --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
   ```

1. 새 RDS for Oracle DB 인스턴스를 생성하고 옵션 그룹을 연결하거나, RDS for Oracle DB 인스턴스를 수정하여 옵션 그룹을 연결합니다.

   DB 인스턴스 생성에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 단원을 참조하세요.

   DB 인스턴스 수정에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 단원을 참조하세요.

# RDS for Oracle DB 인스턴스에 SSL을 사용하도록 SQL\$1Plus 구성
<a name="Appendix.Oracle.Options.SSL.ClientConfiguration"></a>

Oracle SSL 옵션을 사용하는 RDS for Oracle DB 인스턴스에 연결하려면 우선 연결 전에 SQL\$1Plus를 구성해야 합니다.

**참고**  
해당 클라이언트에서 DB 인스턴스에 액세스하는 것을 허용하려면 보안 그룹을 올바르게 구성해야 합니다. 자세한 내용은 [보안 그룹을 통한 액세스 제어](Overview.RDSSecurityGroups.md) 섹션을 참조하세요. 또한 이러한 지침은 Oracle 홈을 직접 사용하는 SQL\$1Plus 및 기타 클라이언트에 대한 것입니다. JDBC 연결에 대한 자세한 정보는 [JDBC를 통한 SSL 연결 설정](Appendix.Oracle.Options.SSL.JDBC.md) 단원을 참조하십시오.

**SSL을 사용하여 RDS for Oracle DB 인스턴스에 연결하도록 SQL\$1Plus를 구성하려면**

1. `ORACLE_HOME` 환경 변수를 Oracle 홈 디렉터리의 위치로 설정합니다.

   Oracle 홈 디렉터리 경로는 설치에 따라 달라집니다. 다음은 `ORACLE_HOME` 환경 변수를 설정하는 예제입니다.

   ```
   prompt>export ORACLE_HOME=/home/user/app/user/product/19.0.0/dbhome_1
   ```

   Oracle 환경 변수 설정에 대한 자세한 정보는 Oracle 설명서의 [SQL\$1Plus Environment Variables](http://docs.oracle.com/database/121/SQPUG/ch_two.htm#SQPUG331) 및 운영 체제에 해당하는 Oracle 설치 안내서를 참조하십시오.

1. `$ORACLE_HOME/lib`를 `LD_LIBRARY_PATH` 환경 변수에 추가합니다.

   다음은 LD\$1LIBRARY\$1PATH 환경 변수를 설정하는 예제입니다.

   ```
   prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib 
   ```

1. `$ORACLE_HOME/ssl_wallet`에 Oracle Wallet을 위한 디렉터리를 만듭니다.

   다음은 Oracle Wallet 디렉터리를 생성하는 예제입니다.

   ```
   prompt>mkdir $ORACLE_HOME/ssl_wallet
   ```

1. 모든 AWS 리전에서 작동하는 인증서 번들 .pem 파일을 다운로드하고 파일을 ssl\$1wallet 디렉터리에 저장합니다. 자세한 내용은 [SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터 에 대한 연결 암호화](UsingWithRDS.SSL.md) 섹션을 참조하세요.

1. `$ORACLE_HOME/network/admin` 디렉터리에서 `tnsnames.ora` 파일을 수정하거나 생성하고 다음 항목을 포함합니다.

   ```
   net_service_name = 
     (DESCRIPTION = 
       (ADDRESS_LIST = 
         (ADDRESS = 
           (PROTOCOL = TCPS) 
           (HOST = endpoint) 
           (PORT = ssl_port_number)
         )
       )
       (CONNECT_DATA = 
         (SID = database_name)
       )
       (SECURITY = 
         (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=endpoint")
       )
     )
   ```

1. 동일한 디렉터리에서 sqlnet.ora 파일을 수정하거나 만들고 다음 파라미터를 포함합니다.
**참고**  
TLS 보안 연결을 통해 개체와 통신하기 위해 Oracle이 인증에 필요한 인증서가 있는 wallet을 요구합니다. 7단계에서와 같이 Oracle의 ORAPKI 유틸리티를 사용하여 Oracle Wallet을 만들고 유지 관리할 수 있습니다. 자세한 내용은 Oracle 설명서의 [Setting up Oracle wallet using ORAPKI](https://docs.oracle.com/cd/E92519_02/pt856pbr3/eng/pt/tsvt/task_SettingUpOracleWalletUsingORAPKI.html)를 참조하십시오.

   ```
   WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/ssl_wallet))) 
   SSL_CLIENT_AUTHENTICATION = FALSE 
   SSL_VERSION = 1.0 
   SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA) 
   SSL_SERVER_DN_MATCH = ON
   ```
**참고**  
DB 인스턴스가 지원하는 경우 `SSL_VERSION`을 더 높은 값으로 설정할 수 있습니다.

1. 다음 명령을 실행하여 Oracle Wallet을 만듭니다.

   ```
   prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
   ```

1. OS 유틸리티를 사용하여 .pem 번들 파일의 각 인증서를 별도의 .pem 파일로 추출합니다.

1. .pem 파일의 절대 파일 이름으로 `certificate-pem-file`을 대체하여 개별 `orapki` 명령을 통해 Wallet에 각 인증서를 추가합니다.

   ```
   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert
         certificate-pem-file -auto_login_only
   ```

   자세한 내용은 [SSL/TLS 인증서 교체](UsingWithRDS.SSL-certificate-rotation.md) 섹션을 참조하세요.

# SSL을 사용하여 RDS for Oracle DB 인스턴스에 연결
<a name="Appendix.Oracle.Options.SSL.Connecting"></a>

앞에서 설명한 대로 SSL을 사용하도록 SQL\$1Plus를 구성한 후에는 SSL 옵션을 통해 RDS for Oracle DB 인스턴스에 연결할 수 있습니다. 선택적으로, tnsnames.ora 및 sqlnet.ora 파일이 들어있는 디렉터리를 가리키는 `TNS_ADMIN` 값을 먼저 내보낼 수 있습니다. 그러면 SQL \$1Plus가 이러한 파일을 일관되게 찾을 수 있습니다. 다음 예에서는 `TNS_ADMIN` 값을 내보냅니다.

```
export TNS_ADMIN = ${ORACLE_HOME}/network/admin          
```

DB 인스턴스에 연결합니다. 예를 들어 SQL\$1Plus와 tnsnames.ora 파일의 *<net\$1service\$1name>*을 사용하여 연결할 수 있습니다.

```
sqlplus mydbuser@net_service_name          
```

다음 명령을 사용하면 tnsnames.ora 파일 사용 없이 SQL\$1Plus를 사용하여 DB 인스턴스에 연결할 수도 있습니다.

```
sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = endpoint) (PORT = ssl_port_number))(CONNECT_DATA = (SID = database_name)))'          
```

SSL을 사용하지 않고 RDS for Oracle DB 인스턴스에 연결할 수도 있습니다. 예를 들어 다음 명령을 실행하면 SSL 암호화 없이 클리어 텍스트 포트를 통해 DB 인스턴스에 연결됩니다.

```
sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = endpoint) (PORT = port_number))(CONNECT_DATA = (SID = database_name)))'          
```

TCP(Transmission Control Protocol) 포트 액세스를 닫으려는 경우 IP 주소 수신이 없는 보안 그룹을 만들어 인스턴스에 추가합니다. 이렇게 하면 TCP 포트를 통한 연결이 닫히지만 SSL 옵션 보안 그룹에 의해 허용되는 범위 내에 있는 IP 주소를 사용하여 지정되는 SSL 포트를 통해 계속 연결할 수 있습니다.

# JDBC를 통한 SSL 연결 설정
<a name="Appendix.Oracle.Options.SSL.JDBC"></a>

JDBC를 통한 SSL 연결을 사용하려면 키 스토어를 만들고 Amazon RDS 루트 CA 인증서를 신뢰하고 아래에 지정된 코드 조각을 사용해야 합니다.

키 스토어를 JKS 형식으로 만들려면 다음 명령을 사용하면 됩니다. 키 스토어 만들기에 대한 자세한 내용은 Oracle 설명서의 [키 스토어 생성](https://docs.oracle.com/cd/E35822_01/server.740/es_admin/src/tadm_ssl_jetty_keystore.html)을 참조하세요. 참조 정보는 **Java 플랫폼, 표준 에디션 도구 참조의 [keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html)을 참조하세요.

```
keytool -genkey -alias client -validity 365 -keyalg RSA -keystore clientkeystore         
```

다음 단계에 따라 Amazon RDS 루트 CA 인증서를 신뢰합니다.

**Amazon RDS 루트 CA 인증서를 신뢰하려면**

1. 모든 AWS 리전에서 작동하는 인증서 번들 .pem 파일을 다운로드하고 파일을 ssl\$1wallet 디렉터리에 저장합니다.

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

1. OS 유틸리티를 사용하여 .pem 파일의 각 인증서를 별도의 파일로 추출합니다.

1. 별도의 `openssl` 명령을 사용하여 각 인증서를 .der 형식으로 변환하고 *certificate-pem-file*을 인증서 .pem 파일 이름(.pem 확장자 제외)으로 대체합니다.

   ```
   openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der                
   ```

1. 다음 명령을 사용하여 각 인증서를 키 스토어로 가져옵니다.

   ```
   keytool -import -alias rds-root -keystore clientkeystore.jks -file certificate-pem-file.der                
   ```

   자세한 내용은 [SSL/TLS 인증서 교체](UsingWithRDS.SSL-certificate-rotation.md) 단원을 참조하십시오.

1. 키 스토어가 성공적으로 만들어졌는지 확인하십시오.

   ```
   keytool -list -v -keystore clientkeystore.jks                                            
   ```

   메시지가 표시되면 키 스토어 암호를 입력하십시오.

다음은 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 연결과 DN 일치 적용
<a name="Appendix.Oracle.Options.SSL.DNMatch"></a>

Oracle 파라미터 `SSL_SERVER_DN_MATCH`를 사용하여 데이터베이스 서버에 대한 DN(고유 이름)을 서비스 이름과 일치하도록 적용할 수 있습니다. 일치 확인을 적용한 경우 SSL에서 인증서가 서버에서 가져온 것인지를 확인합니다. 일치 확인을 적용하지 않은 경우 SSL에서 확인을 수행하지만 일치 여부에 상관없이 연결을 허용합니다. 일치를 적용하지 않은 경우 서버 ID가 위조될 수 있습니다.

DN 일치를 적용하려면 DN 일치 속성을 추가하고 아래 지정된 연결 문자열을 사용합니다.

다음과 같이 속성을 클라이언트 연결에 추가하여 DN 일치를 적용합니다.

```
properties.put("oracle.net.ssl_server_dn_match", "TRUE");            
```

SSL을 사용할 때 DN 일치를 적용하려면 다음 연결 문자열을 사용합니다.

```
final String connectionString = String.format(
    "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))" +
    "(CONNECT_DATA=(SID=%s))" +
    "(SECURITY = (SSL_SERVER_CERT_DN = 
\"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=%s\")))",
    DB_SERVER_NAME, SSL_PORT, DB_SID, DB_SERVER_NAME);
```

# SSL 연결 문제 해결
<a name="Appendix.Oracle.Options.SSL.troubleshooting"></a>

데이터베이스를 쿼리한 후 `ORA-28860` 오류가 표시될 수 있습니다.

```
ORA-28860: Fatal SSL error
28860. 00000 - "Fatal SSL error"
*Cause: An error occurred during the SSL connection to the peer. It is likely that this side sent data which the peer rejected.
*Action: Enable tracing to determine the exact cause of this error.
```

이 오류는 클라이언트가 서버에서 지원하지 않는 TLS 버전을 사용하여 연결을 시도할 때 발생합니다. 이 오류를 방지하려면 sqlnet.ora를 편집하고 `SSL_VERSION`을 올바른 TLS 버전으로 설정하세요. 자세한 내용은 My Oracle Support 문서의 [Oracle Support Document 2748438.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2748438.1)을 참조하세요.