Windows上にOracle DatabaseをセットアップしてSSL接続する方法

#はじめに

この記事では、OCIで作成したWindowsのコンピュートインスタンスにOracle Database 19cをインストールし、TCPS(SSL)で接続する手順を示します。

構築手順は以下です。
1. Public Subnet内に踏み台インスタンスbastion01を作成
2. Private Subnet内にWindowsインスタンスWin01を作成
3. bastion01経由でWin01に接続
4. Win01にOracle Databaseをインストール
5. TCPS接続の設定
6. 接続できるか確認

#1.Public Subnet内に踏み台インスタンスbastion01を作成
事前にVCNウィザードを使ってVCNを作成しておきます。
今回は、Public SubnetのCIDRブロック：10.0.0.0/24
Private SubnetのCIDRブロック：10.0.1.0/24として作成しています。

次にOCIコンソールのマーケットプレイスからOracle Cloud Developer Imageを使って踏み台インスタンスを作成します。
![developer_image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/b5b7347e-e836-5dce-51c1-1bcfa17d433a.jpeg)

#2. Private Subnet内にWindowsインスタンスWin01を作成
インスタンス作成ページから、イメージWindows Server 2019 Standardを選択します。
![windows.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/2b0c88f9-f35f-32ea-9a0f-918c950b48c5.jpeg)
今回はPrivate Subnet内に作成するので、プライベートIPアドレスのみ設定されます。

#3.bastion01経由でWin01に接続
今回はPUTTYを使用してWin01に接続します。
以下のように、[Connection]→[SSH]→[Tunnels]からポートフォワーディング設定をします。
![putty_3389.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/8a05d564-fec8-bd08-3258-f4ae2015e73a.jpeg)
Source Port：任意の空いているポート番号（本記事では3399）
Destination：{WindowsインスタンスのプライベートIPアドレス｝:3389

上記の設定をAddして接続します。
リモートデスクトップ接続を許可するため、Private Subnetのイングレス・ルールにPublic Subnetからの3389番ポートを追加します。
![rdp_accept.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/c6e6e8d7-e502-dea1-aea1-6f2e253ef094.jpeg)

次にリモートデスクトップ接続を起動し、localhost:{上で指定したSource Port｝を設定します。
![rdp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/52392dca-a417-463f-c685-6954936c398c.jpeg)
Windowsが起動できたら、opcのログイン画面が表示されます。初期パスワードはOCIコンソールに記載されています。
![win_pw.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/7aafb6ff-ba09-9cb6-32d2-9d1b80b090d9.jpeg)

※初回ログイン後はパスワードの変更が求められます。

#4.Win01にOracle Databaseをインストール
opcにログイン後の初期状態では、ブラウザはInternet Explorerしかありません。
Oracle softwareはGoogle Chrome、Mozilla Firefox、Apple Safari、Microsoft Edgeが推奨されています。
今回はFirefoxをダウンロードします。

※補足
Internet Explorerの初期設定ではファイルのダウンロードが許可されていないため、
[ブラウザの設定]→[Internet options]→[Security]→[custom level...]→[Downloads]→File downloadをEnableに変更します。

ダウンロード後、Firefoxで[こちら](https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html)からOracle Databaseのイメージファイルをダウンロードします。

インストール前にOracleホーム・ユーザーを作成しておきます。
今回は以下のようにoracleというユーザーをWindowsアカウントとして追加します。
![oracle_account.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/c84306df-8f96-e5cf-2488-2cb9dc42b83f.jpeg)
続いてoracleユーザーにリモートアクセスを許可します。
[コントロールパネル]→[システムとセキュリティ]→[システム欄のリモートアクセスの許可]→[ユーザーの選択]→[追加]
以下のようにoracleユーザーにリモートアクセスを許可します。
![remote_access.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/1213c92a-4b73-5cac-cb35-9fbad7094754.jpeg)

続いてOracleベースとOracleホームとなるフォルダを作成しておきます。
Oracleベースは、C:\app\oracle
Oracleホームは、C:\app\oracle\product\19.3.0\dbhome_1とします。

次に、先ほどダウンロードしたイメージファイル（zipファイル）をOracleホームに展開します。
![extract.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/6ef84374-facb-e290-ac86-e12db12c2bc8.jpeg)
展開後、Oracleホームに展開されたsetup.exeを実行します。
以下のようにインストール設定をします。
![install1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/e041a540-35e8-360e-b8b0-654c91cd0d0c.jpeg)
システム・クラスはServer classを選択します。
![install2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/35cd685e-37cf-42dd-2dc5-7d861da3b7d3.jpeg)
インストール・タイプはTypical installを選択します。
![install3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/a6c56b79-9666-f20a-5cec-88059cb3c02a.jpeg)
Oracleホームユーザーは、既存のWindowsユーザーを選択し、先ほど作成したoracleユーザーを指定します。
![install4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/52593db0-5d2c-e316-9365-c780185408d4.jpeg)
※ここで『仮想アカウントの使用』を選択すると、TCPS接続が上手くいかないことがあるので、あらかじめ別のWindowsユーザーを作成しておき、それをOracleホーム・ユーザーとして設定する手順を推奨しています。

今回は、EditionはStandard Edition2とします。
OracleベースとOracleホームを正常に作成していれば、デフォルトで入力されている状態になります。
![install5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/ea0bdd10-c8f9-06fd-9149-dfedaac28852.jpeg)
以下の設定で問題なければインストールを開始します。
![install6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/a547e5ca-a919-3a6b-834e-cd2ed3f895b9.jpeg)

#5.TCPS接続の設定
インストール完了後、Windowsにoracleユーザーでログインし直します。
PowerShellを開き、以下のコマンドでOracleホームに移動します。

```
cd C:\app\oracle\product\19.3.0\dbhome_1
```

まずはSQL Plusでデータベースに接続できるか確認してみましょう。

```
sqlplus / as sysdba
```

接続できたら、検証用のサンプルスキーマ（HR）を作成します。[こちら](https://oracle-japan.github.io/ocitutorials/database/adb301-create-source-db/#anchor2)の「2. 移行対象となるHRスキーマをインストール」～「3. サンプルスキーマ（HR）への接続、スキーマの確認」を参考に、HRスキーマに接続できるようにします。
HRスキーマが作成できたら、ORACLEホームに戻り、TCPS接続の設定を行います。

1.ウォレット用のフォルダ作成

```
mkdir server\wallet
mkdir client\wallet
```

2.サーバー用ウォレットの作成
Oracleホーム直下server\walletに移動し以下のコマンドを実行します。

```
orapki wallet create -wallet ./ -pwd Oracle123456 -auto_login
```

```
orapki wallet add -wallet ./ -pwd Oracle123456 -dn "CN=Win" -keysize 1024 -self_signed -validity 3650 -sign_alg sha256
```

3.クライアント用ウォレットの作成
Oracleホーム直下client\walletに移動し、以下のコマンドを実行します。

```
orapki wallet create -wallet ./ -pwd Oracle123456 -auto_login
```

```
orapki wallet add -wallet ./ -pwd Oracle123456 -dn "CN=client" -keysize 1024 -self_signed -validity 3650 -sign_alg sha256
```

4.証明書の交換
ルートフォルダに移動し、tmpフォルダを作成します。

```
cd \
mkdir tmp
```

Oracleホーム直下server\walletに移動し、サーバー証明書をエクスポートします。

```
orapki wallet export -wallet ./ -pwd Oracle123456 -dn "CN=Win" -cert /tmp/server.crt
```

Oracleホーム直下client\walletに移動し、クライアント証明書をエクスポートします。

```
orapki wallet export -wallet ./ -pwd Oracle123456 -dn "CN=client" -cert /tmp/client.crt
```

Oracleホーム直下server\walletに移動し、サーバーのウォレットにクライアント証明書をインポートします。

```
orapki wallet add -wallet ./ -pwd Oracle123456 -trusted_cert -cert /tmp/client.crt
```

Oracleホーム直下client\walletに移動し、クライアントのウォレットにサーバー証明書をインポートします。

```
orapki wallet add -wallet ./ -pwd Oracle123456 -trusted_cert -cert /tmp/server.crt
```

証明書が正しくインポートされているか確認します。

```
orapki wallet display -wallet .
```

以下のように表示されていれば、証明書の交換は成功です。
![orapkidisplay.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/553de29a-392a-6943-a9e2-cb4028185833.jpeg)
5. ネットワーク構成ファイルにウォレットのフォルダを追加
Oracleホーム直下のnetwork\adminに移動し、listener.oraを編集します。
ウォレットのディレクトリを追加するため、以下を追記します。

```
wallet_location =
  (SOURCE=
 (METHOD=File)
 (METHOD_DATA=
   (DIRECTORY=C:\app\oracle\product\19.3.0\dbhome_1\server\wallet)))
```

また、リスナーにTCPSエンドポイントを追加するため、以下を追記します。

```
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.1.226)(PORT = 1522))
```

![listener.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/784a44ad-dd18-966a-4713-ab2c753384c8.jpeg)
次に、sqlnet.oraに以下を追記します。

```
wallet_location =
  (SOURCE=
 (METHOD=File)
 (METHOD_DATA=
   (DIRECTORY=C:\app\oracle\product\19.3.0\dbhome_1\server\wallet)))

SSL_SERVER_DN_MATCH=(ON)
```

ローカルでTCPS接続できるようにするため、tnsnames.oraにORCLPDB2というネットサービスを追記します。
サービスはorclpdbというデフォルトのPDBに設定しています。

```
ORCLPDB2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.1.226)(PORT = 1522))
    (CONNECT_DATA =
      (SERVICE_NAME = orclpdb)
    )
    (SECURITY =
      (SSL_SERVER_CERT_DN = "CN=Win")
    )
  )
```

リスナーの再起動を行います。oracleユーザーではlsnrctl startコマンドを実行できないため、管理者権限で起動したPowerShellで実行します。

```
lsnrctl stop listener
lsnrctl start listener
```

以下のコマンドでTCPSのエンドポイントが追加されているか確認します。

```
lsnrctl status
```

![lsnrstatus.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/6a1a8523-b819-2c58-7d00-937aa6eabd5f.jpeg)
上記が確認できたら、次にTCPS接続で使用する1522番ポートを開放します。
[コントロールパネル]→[システムとセキュリティ]→[Windows Defender ファイアウォール]→[詳細設定]で受信の規則、送信の規則に1522番ポートを追加します。
ここまでで、Windowsで行う設定は以上になります。

次にOCIコンソールからPrivate Subnetのイングレス・ルールに1522番ポートを追加します。
![privatesl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/361325d8-84ce-186a-fb10-f2711db81f16.jpeg)

#6. 接続できるか確認
まずはSYSでデータベースに接続します。

```
sqlplus / as sysdba
```

PDBが起動しているか確認します。

```
show pdbs
```

ORCLPDBがMOUNTEDの場合、以下で起動させます。

```
alter pluggable database orclpdb open;
```

起動できたら、『5.TCPS接続の設定』で指定したHRスキーマで接続します。

```
connect HR/WelCome123#123#@orclpdb2
```

接続できたら以下のSQLを実行します。

```
select * from countries;
```

25個の国名が表示されれば成功です。
![select-result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930162/c66aff55-05a8-1765-f7a6-2427655a41f5.jpeg)



これでWindows上のOracle DatabaseにローカルでTCPS(SSL)接続できるようになりました。

#エラーへの対応例
- 『ORA-28759: ファイルのオープンに失敗しました』が発生する場合
sqlnet.ora、listener.oraファイルに正しいウォレット・ロケーションが指定されていることを確認してください。

- 『ORA-28865：SSL接続はクローズしました』、『ORA-28864: SSL接続は正常にクローズしました』が発生する場合
Oracleホームユーザーにウォレットファイル(cwallet.sso)の読み取り権限があることを確認してください。

- 『ORA-29003：SSLトランスポートがサーバー証明書の不一致を検出しました』が発生する場合
tnsnames.oraの接続記述子に(SECURITY=(SSL_SERVER_CERT_DN="CN=Win"))句があるか確認してください。

- 『ORA-12224: TNS: リスナーがありません』が発生する場合
管理者権限でlsnrctl start listenerでリスナーを起動してください。
再起動後1分程待ち、lsnrctl statusで正常に起動しているか確認します。
サービスを正しく認識していない場合は、sqlplus / as sysdba で接続し、初期化パラメータlocal_listenerを確認します。

```
show parameter local_listener
```

デフォルトはLISTENER_＜ORACLE_SID＞になっています。この初期化パラメータに何らかの変更をしているとサービスが認識されない場合があるので、以下のコマンドで修正します。

```
alter system set local_listener="LISTENER_<ORACLE_SID>";
```

- データベースへの接続がタイムアウトする場合  
OCIのセキュリティリストとWindowsのポート設定を見直してください。必要なポートが空いていない可能性があります。

---
以下の記事では、今回構築したWindows上のOracle DatabaseとAutonomous Database間のデータベース・リンクの構築手順を紹介しています。

https://qiita.com/wahagon/items/7b6abbf6881481b5d5ee