[OCI]Autonomous DatabaseのTLS接続+ Oracle Provider for OLE DB(32bit)のウォレット無し接続を試す

## はじめに
Oracle Autonomous Database 共有Exadata Infrastructure (ADB-S) の Oracle Autonomous Data Warehouse (ADW)を使っているお客様がWallet無し接続を希望されているとのこと。
アプリケーションを詳しく確認すると Excel から Oracle Provider for OLE DB (32bit)を利用されている、とのことでマニュアル等での調査したことおよび実際に確認したことをまとめてみました。

こちらのマニュアル等での調査は 2022/05/21 時点での情報となり、確認した内容は 2022/4/13 時点で情報となりますので、必要に応じてご自身でご確認ください。

## ADWへのクライアント・アプリケーションからのTLS接続
マニュアル情報は以下の通り。丁寧にまとまっています。
[クライアント・アプリケーションを使用したAutonomous Databaseへの接続](https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/connect-preparing.html#GUID-3667EC68-930E-4566-95B3-DFA24203A8FF)
とはいえ若干、記述が英語マニュアルに追いついていないところがありますので以下、英語マニュアルのリンクです。
[2 Connecting to Autonomous Database](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-data-warehouse.html#GUID-94719269-9218-4FAF-870E-6F0783E209FD)

- [JDBC Thin TLS Connections without a Wallet](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-jdbc-thin-tls.html#GUID-364DB7F0-6F4F-4C42-9395-4BA4D09F0483)
- [Oracle Call Interface (OCI) Connections with TLS Authentication](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-oci-tls.html#GUID-3827F44B-9CFC-4F3B-8B19-3168A98360F9)
- [Connect Microsoft .NET, Visual Studio Code, and Visual Studio without a Wallet](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-microsoft-net-tls.html#GUID-8219D05D-3017-4452-B4B7-CE8D3746FB2F)
- [Connect Python, Node.js, and other Scripting Languages without a Wallet](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connecting-nodejs-tls.html#GUID-B3809B88-D2FB-4E08-8F9B-65A550F93A07)

また、こちらの図は以前Oracle Directセミナーあたりで説明した資料を修正したものです。こちらの図も参照いただきつつ対応状況をご確認ください。
![20220521_OracleClient接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/47936ae6-ea3e-8f50-b93a-0c9461745a20.png)

マニュアル記述の内容をまとめると以下のようになります。
- JDBC Thin ドライバはJDK 8 8u161で対応
- 管理対象ODP.NETドライバについてはバージョンを19.13および21.4以降で対応
- Oracle Call Interface (OCI)の場合はOracle Instant Client 19.13 (Linux x64)、Oracle Instant Client (すべてのプラットフォーム) 19.14以降、21.5以降

さて、Oracle Instant Client は19.14、21.5以降で**すべてのプラットフォーム**でTLS接続に対応しているのですが、現時点(2022/05/21)でどのプラットフォームにて提供されているのかを確認します。

こちらのサイト[Oracle Instant Client Downloads](https://www.oracle.com/database/technologies/instant-client/downloads.html)よりOracle Instant Client はダウンロードできるため、対応しているプラットフォームと対応しているバージョンを確認してみると以下の通りです。

- Linux x86-64 (64-bit): 19.15, 21.6
- Linux x86(32bit): 19.15
- Microsoft Windows (x64): 19.15
- Microsoft Windows (32bit): 19.15
- Solaris SPARC (64-bit): 19.15
- Solaris x86-64: 19.15
- z/Linux (64-bit): 19.15

さて、ここまではマニュアルをもとに記述しましたが、Oracle Provider for OLE DB (32bit) で TLS接続をおこなうにはどうしたら良いでしょうか。残念なことに Oracle Provider for OLE DB はOracle Instant Client には含まれていないのです。

Oracle Instant Client に含まれているソフトウェアについてはこちらのサイト[Instant Client Packages](https://www.oracle.com/database/technologies/instant-client.html)より確認できます。
端的にいうと、Oracle Call Interface 部分、JDBC OCIドライバ、ODBCドライバのみが含まれています。

なお、オラクル社が提供しているWindows OSを対象とした開発環境を構築するパッケージとしてOracle Data Access Component (ODAC)があります。こちらにはOracle Provider for OLE DBは含まれているものの、残念ながらこちらはバージョンが古いもの(18.3)しか提供されていません。
[Download Additional ODAC, ODP.NET, and Oracle Developer Tools Releases](https://www.oracle.com/database/technologies/dotnet-odacdev-downloads.html)

となると、Oracle Provider for OLE DB (32bit) で TLS接続をおこなうには Oracle Instant Client ではなく、Oracle Clientの製品版(19.3がOracle Software Delivery Cloudよりダウンロード可能)と19.14以降のパッチを適用することになりそうです。

## 19.14 のWindows Database Bundle Patch
Oracle Support へアクセス可能な方は以下のNoteをご確認ください。
- Oracle Database 19c Proactive Patch Information (Doc ID 2521164.1)

「Oracle Database 19c Release Update」のリンクをクリックしていただくと、「Included in Windows Bundle」よりパッチをダウンロードするリンクが確認できます。
なお、これから記述する内容は4月中旬に確認した内容なので記述は18-Jan-2022の19.14をもとにしたものとなります。本日時点では19-Apr-2022の19.15が提供されているため、こちらを利用することになりそうです。

なお、19.14 のWindows Database Bundle Patch (32bit)の提供タイミングですが、本来2022年1月中旬に提供されるものが2022/3/29に提供されました。私の観測範囲ではInstant Client for Microsoft Windows (32-bit)の19.14提供も4月頭頃だったため、連動していることが推測できます。(あくまでも推測です)

## 検証とその結果
検証構成は[こちら](https://qiita.com/mutatsu/items/70c76d5a50c4f359c7de)と同等のものを用意しました。Public Subnet の Virtual Machine がWindows Server 2019 となります。
![20220521_OCI構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/9997d985-a9cd-38af-f07a-2d3f32819c84.png)

検証の流れは以下となります。すべて用意したWindows Server 2019での作業です。
1. Oracle Client 32bit (19.3) を Oracle Software Delivery Cloud よりダウンロードし、インストール(Gold Imageではないもの)
2. ATPのWalletを取得
3. SQL\*PlusでWallet有りでATPへ接続でき、Wallet無しでATPへ接続できないことを確認
4. Windows Database Bundle Patch (32bit) をダウンロードし、opatch で適用
5. SQL\*PlusでWallet無しでATPへ接続できることを確認
6. PowerShell(32bit)よりOracle Provider for OLE DB (32bit) 経由でATPへ接続し、SQL実行できることの確認

上記の検証の流れを細かくこちらには記述いたしませんが、結果としては上記の「PowerShell(32bit)よりOracle Provider for OLE DB (32bit) 経由でATPへ接続し、SQL実行できることの確認」はできました。


- 検証で利用したPowerShellのコード(パスワード部分はマスク)
``` PowerShell
[System.Reflection.Assembly]::LoadWithPartialName("System.Data")
$cs = "Provider=OraOLEDB.Oracle;User ID=admin;Password=xxxx;Data Source=atp20220413_low_nw"
$oraCon = New-Object System.Data.OleDb.OleDbConnection($cs)
$oraCmd = New-Object System.Data.OleDb.OleDbCommand
$oraCon.Open()
$oraCmd.Connection = $oraCon
$oraCmd.CommandText = "SELECT username FROM user_users"
$oraReader = $oraCmd.ExecuteReader()
while ($oraReader.Read())
{
    $oraReader["USERNAME"].ToString() 
}
$oraCmd.Dispose()
$oraCon.Close()
$oraCon.Dispose()
```
- 実行状況
```
PS C:\oracleclient> Get-ChildItem env:

Name                           Value                                                                           
----                           -----                                                                           
ALLUSERSPROFILE                C:\ProgramData                                                                  
APPDATA                        C:\Users\opc\AppData\Roaming                                                    
CLIENTNAME                     MUTATSU-JP                                                                      
CommonProgramFiles             C:\Program Files (x86)\Common Files                                             
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files                                             
CommonProgramW6432             C:\Program Files\Common Files                                                   
COMPUTERNAME                   TEST-WIN                                                                        
ComSpec                        C:\Windows\system32\cmd.exe                                                     
DriverData                     C:\Windows\System32\Drivers\DriverData                                          
FPS_BROWSER_APP_PROFILE_STRING Internet Explorer                                                               
FPS_BROWSER_USER_PROFILE_ST... Default                                                                         
HOMEDRIVE                      C:                                                                              
HOMEPATH                       \Users\opc                                                                      
LOCALAPPDATA                   C:\Users\opc\AppData\Local                                                      
LOGONSERVER                    \\TEST-WIN                                                                      
NUMBER_OF_PROCESSORS           2                                                                               
OS                             Windows_NT                                                                      
Path                           C:\app\client\opc\product\19.0.0\client_1\bin;C:\Windows\system32;C:\Windows;...
PATHEXT                        .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL                      
PROCESSOR_ARCHITECTURE         x86                                                                             
PROCESSOR_ARCHITEW6432         AMD64                                                                           
PROCESSOR_IDENTIFIER           AMD64 Family 25 Model 1 Stepping 1, AuthenticAMD                                
PROCESSOR_LEVEL                25                                                                              
PROCESSOR_REVISION             0101                                                                            
ProgramData                    C:\ProgramData                                                                  
ProgramFiles                   C:\Program Files (x86)                                                          
ProgramFiles(x86)              C:\Program Files (x86)                                                          
ProgramW6432                   C:\Program Files                                                                
PSModulePath                   C:\Program Files\WindowsPowerShell\Modules;C:\Users\opc\Documents\WindowsPowe...
PUBLIC                         C:\Users\Public                                                                 
SESSIONNAME                    RDP-Tcp#3                                                                       
SystemDrive                    C:                                                                              
SystemRoot                     C:\Windows                                                                      
TEMP                           C:\Users\opc\AppData\Local\Temp\2                                               
TMP                            C:\Users\opc\AppData\Local\Temp\2                                               
TNS_ADMIN                      C:\oracleclient\tns_admin01                                                     
USERDOMAIN                     TEST-WIN                                                                        
USERDOMAIN_ROAMINGPROFILE      TEST-WIN                                                                        
USERNAME                       opc                                                                             
USERPROFILE                    C:\Users\opc                                                                    
windir                         C:\Windows                                                                      



PS C:\oracleclient> C:\oracleclient\test01.ps1

GAC    Version        Location                                                                                 
---    -------        --------                                                                                 
True   v4.0.30319     C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\Sy...
ADMIN



PS C:\oracleclient> 
```
実行時の画面の状況
![20220521_oledb_powershell_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45466/78ede519-ef85-9ca1-8984-a69e591fb3e4.png)




## 最後に
Oracle Provider for OLE DB (32bit) 経由でATPへWallet無し接続の確認はできました。とはいえ、opatch を使ったパッチ適用が手数がかかることもあり、お客様のClient PCへのOracle Clientの配布する為の良い方法を考える必要がありそうです。