

# Oracle Secure Sockets Layer
<a name="Appendix.Oracle.Options.SSL"></a>

RDS for Oracle DB インスタンスの SSL 暗号化を有効するには、その DB インスタンスに関連付けられているオプショングループに、Oracle SSL オプションを追加します。Oracle からの要求があるため、Amazon RDS では SSL 接続のために 2 番目のポートを使用しています。この方法では、クリアテキストと SSL 暗号化の両方の通信を、DB インスタンスと SQL\$1Plus 間で同時に実行できます。例えば、このポートで SSL 暗号化通信を使用して VPC 外部のリソースと通信する一方で、このポートでクリアテキスト通信を使用して 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 は、Transport Layer Security (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 Database 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 では、連邦情報処理規格 (FIPS) 140-2 標準を使用できます。FIPS 140-2 は、暗号化モジュールのセキュリティ要件を規定する米国政府のスタンダード規格です。FIPS 標準は、Oracle SSL オプションの `FIPS.SSLFIPS_140` を `TRUE` に設定することでオンにします。SSL に FIPS 140-2 を設定した場合、暗号化ライブラリはクライアントと RDS for Oracle DB インスタンスの間のデータを暗号化します。

クライアントは、FIPS 準拠の暗号スイートを使用する必要があります。接続を確立する際、クライアントと RDS for Oracle DB インスタンスはメッセージの送受信に使用する暗号スイートをネゴシエートします。[Oracle SSL オプションの暗号スイート](#Appendix.Oracle.Options.SSL.CipherSuites) の表に、各 TLS バージョンについて FIPS 準拠の SSL 暗号スイートを示します。詳細については、Oracle データベースドキュメントの「[Oracle データベース 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 インスタンスで使用される証明書タイプと互換性のある暗号スイートを少なくとも 1 つ含めてください。証明書タイプが異なる複数の DB インスタンスでオプショングループを使用している場合は、証明書タイプごとに少なくとも 1 つの暗号スイートを含めます。

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**  

   Linux、macOS、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)」を参照してください。さらに、この手順は、SQL\$1Plus および Oracle ホームを直接使用するその他のクライアント向けです。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 環境可変](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 リージョン で動作する証明書バンドルをダウンロードし、そのファイルを 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 は認証用の必要な証明書を持つウォレットを必要とします。ステップ 7 に示すように、Oracle の ORAPKI ユーティリティを使用して Oracle ウォレットを作成して管理できます。詳細については、Oracle ドキュメントで「[ORAPKI を使用した Oracle ウォレットの設定](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
   ```
**注記**  
`SSL_VERSION` はより高い値に設定できます (DB インスタンスでサポートされている場合)。

1. 以下のコマンドを実行して Oracle Wallet を作成します。

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

1. OS ユーティリティを使用して、.pem バンドルファイル内の各証明書を個別の .pem ファイルに抽出します。

1. 個別の `orapki` コマンドを使用して各証明書をウォレットに追加し、`certificate-pem-file` を.pem ファイルの絶対ファイル名に置き換えます。

   ```
   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>

前述のように SQL\$1Plus で SSL を使用するように設定すると、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)))'          
```

Transmission Control Protocol (TCP) ポートアクセスを閉じる場合は、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 リージョン で動作する証明書バンドルをダウンロードし、そのファイルを ssl\$1wallet ディレクトリに置きます。

   証明書のダウンロードについては、[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。

1. OS ユーティリティを使用して、.pem ファイル内の各証明書を個別のファイルに抽出します。

1. *certificate-pem-file* を証明書 .pem ファイルの名前 (.pem 拡張子なし) に置き換えて、個別の `openssl` コマンドを使用して各証明書を .der 形式に変換します。

   ```
   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>

データベースサーバーの識別子名 (DN) をそのサービス名と一致させるには、Oracle パラメータ `SSL_SERVER_DN_MATCH` を使用できます。マッチングの検証を実施する場合は、SSL により、証明書がサーバーから取得されたものであることが確認されます。マッチングの検証を実施しない場合、SSL によって確認が行われますが、一致しているかどうかにかかわらず接続が許可されます。マッチングを実施しない場合、サーバーで識別をモデリング偽造することを許可できます。

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 ドキュメント 2748438.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2748438.1)」を参照してください。