RDS for OracleとWindowsPCの通信をSSＬ暗号化してみた。

こんにちは小林です。
直近でRDSとローカルPC間の通信の暗号化の適用を行いましたので備忘録として記事に残します。

# 環境
RDS：Oracle Enterprise Edition 19C
PC：Windows11


以下で変更前の接続プロトコルを確認しています。
デフォルトの通信ではTCPを使用しています。
これからTCPSに設定を変更します。

```ruby:qiita.rb
SQL>
SQL> SELECT SYS_CONTEXT('USERENV', 'network_protocol') FROM DUAL;

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
--------------------------------------------------------------------------------
tcp
```

# 1_証明書バンドルをダウンロード
ORACLEホームに「SSL_WALLET」のフォルダを作成して証明書バンドルを格納する。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html

![syoumeisyoインストール.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/ca397a2e-c71a-b6a3-fc76-20762c1fa34d.jpeg)



# 2_証明書バンドルを分割する
エクスプローラー上で証明書バンドルを個別に分割してss_walletへ格納しましょう。（バンドルのままだと暗号化に使用できないみたいです。このあたりは全く知識がないので勉強しないと・・・）


エクスプローラー上からダウンロードした証明書を開き、中にある証明書をすべてss_wallet上にエクスポートします。
![バンドルを分割 (1).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/f9af0eae-3857-a06b-83db-ef83c161adfb.jpeg)

# 3_OpenJDKとsqlclの準備
WALLETの設定を行うためにOpenJDKとsqlclを準備します。

OpenJDKをダウンロードできるサイト

https://learn.microsoft.com/ja-jp/java/openjdk/download#openjdk-21


sqlclをダウンロードできるサイト

https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/download/

# 4_WALLETの作成
下記コマンドでWALLETを作成します。ここからはコマンドプロンプトを管理者として実行してください。
コマンドを使いまわす場合はファイルパスの部分を修正してください。

```ruby:qiita.rb
C:\oracle\SSL_wallet>java -classpath C:\oracle\sqlcl\lib\* oracle.security.pki.textui.OraclePKITextUI wallet create -wallet . -auto_login_only
Oracle PKI Tool Release 21.0.0.0.0 - Production
21.0.0.0.0: バージョン{1}
Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.

操作は正常に完了しました。
```

# 5_WALLETにクライアント証明書を追加する
下記のコマンドでWALLETにクライアント証明書を追加します。今回はクライアント証明書が5個あるので5回追加しました。
```ruby:qiita.rb
C:\oracle\SSL_wallet>java -classpath C:/oracle/sqlcl/lib/* oracle.security.pki.textui.OraclePKITextUI wallet add -wallet . -trusted_cert -cert C:\oracle\ssl_wallet\oracle1.p7b -auto_login_only
Oracle PKI Tool Release 21.0.0.0.0 - Production
21.0.0.0.0: バージョン{1}
Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.

操作は正常に完了しました。
C:\oracle\SSL_wallet>
```

# 6_クライアント証明書を確認
下記のコマンドで追加したクライアント証明書を確認します。格納した5個分の証明書が表示されたのでOKです。
```ruby:qiita.rb
C:\oracle\SSL_wallet>java -classpath C:/oracle/sqlcl/lib/* oracle.security.pki.textui.OraclePKITextUI wallet display -wallet .
Oracle PKI Tool Release 21.0.0.0.0 - Production
21.0.0.0.0: バージョン{1}
Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.

Requested Certificates:
User Certificates:
Trusted Certificates:
Subject:        CN=Amazon RDS ap-northeast-1 2019 CA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,L=Seattle,ST=Washington,C=US
Subject:        L=Seattle,CN=Amazon RDS ap-northeast-1 Root CA RSA4096 G1,ST=WA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,C=US
Subject:        CN=Amazon RDS Root 2019 CA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,ST=Washington,L=Seattle,C=US
Subject:        L=Seattle,CN=Amazon RDS ap-northeast-1 Root CA RSA2048 G1,ST=WA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,C=US
Subject:        L=Seattle,CN=Amazon RDS ap-northeast-1 Root CA ECC384 G1,ST=WA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,C=US

C:\oracle\SSL_wallet>
```



# 7_オプショングループにオプションを追加
RDSに紐づけられているオプショングループにオプション「SSL」を追加します。

![optiongroup_ (1).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/363c7013-6125-b914-7797-f671d9fc43af.jpeg)


今回はすべてデフォルトのままでいきます。オプショングループに「SSL」の追加を完了したらRDSに紐づけるのを忘れないようにしましょう。

![optiongroup_ (12).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722085/0e47a1e4-0c3b-783a-9481-ed868275bb50.jpeg)


# 8_tnsnames.oraとsqlnet.oraの作成
以下がtnsnames.oraの記述になります。簡易接続を使用している場合は編集不要です。
```ruby:qiita.rb
ORCL = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = tcps)(HOST = database-oracle.※※※.rds.amazonaws.com)(PORT = 2484))
    (CONNECT_DATA = 
      (SID = ORCL) 
    )  
  (SECURITY = 
      (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=database-oracle.※※※.rds.amazonaws.com")
      )
)
```
以下がsqlnet.oraの記述になります。DIRECTORYにWALLETのパスを記述しましょう。
```ruby:qiita.rb
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
```
以上でPCとRDS間の通信暗号化の設定完了です。最後は接続して暗号化が適用されているか確認してみます。

# 9_暗号化接続
コマンドプロンプト上からRDSへ接続します。今回自分はローカルネーミング接続を使用しています。

```ruby:qiita.rb
C:\oracle>
C:\oracle>sqlplus admin/Odenkun1@ORCL

SQL*Plus: Release 19.0.0.0.0 - Production on 土 6月 15 23:08:16 2024
Version 19.23.0.0.0

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

最終正常ログイン時間: 土 6月  15 2024 22:49:36 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.23.0.0.0
に接続されました。
SQL>
```

以下のコマンドでセッションに使用しているプロトコルを表示します。
「TCPS」と表示されたら暗号化成功です。
```ruby:qiita.rb
SQL>
SQL> SELECT SYS_CONTEXT('USERENV', 'network_protocol') FROM DUAL;

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
--------------------------------------------------------------------------------
tcps
SQL>
```