Linux 系统上 Oracle Instant Client 使用 Oracle Wallet 实现无密码登录

191 阅读5分钟

在 Oracle 中,用户可以通过 Oracle Wallet,配合sqlnet.ora文件实现无密码登录,以实现自动运行一些带有数据库操作的脚本的功能,而不在脚本中包含密码等敏感信息。但 Oracle Wallet 只包含在完整的 Oracle 数据库中,日常访问数据库所用的 Oracle Instant Client 并不包含该功能。在查阅资料和试验后发现,我们可以通过提取 Oracle 完整数据库压缩包中的相关文件,放在 Oracle Instant Client 目录下以运行该功能。以下是有关提取和配置操作的详细步骤。

注意:本文中以 Linux 系统、Oracle Database Enterprise Edition 21c 为例,使用 Windows 系统以及其他版本的 Oracle 数据库,在过程上大同小异。

下载并配置 Oracle Instant Client

  1. 到 Oracle 官网下载最新版本的 Oracle Instant Client 以及相关功能的 zip 压缩包。

    • Oracle Instant Client:instantclient-basiclite-linux.x64-21.13.0.0.0dbru.zip Annotation 2024-01-29 100901.png

    • SQLPlus Package:instantclient-sqlplus-linux.x64-21.13.0.0.0dbru.zip Annotation 2024-01-29 101152.png

    • Tools Package:instantclient-tools-linux.x64-21.13.0.0.0dbru.zip Untitled.png

    • JDBC Package:instantclient-jdbc-linux.x64-21.13.0.0.0dbru.zip Untitled.png

  2. 将它们解压并放置在同一目录下。

    cp "instantclient-*" "/home/usr/lib/oracle"
    cd "/home/usr/lib/oracle"
    unzip "./instantclient-basiclite-linux.x64-21.13.0.0.0dbru.zip"
    unzip "./instantclient-sqlplus-linux.x64-21.13.0.0.0dbru.zip"
    unzip "./instantclient-tools-linux.x64-21.13.0.0.0dbru.zip"
    unzip "./instantclient-jdbc-linux.x64-21.13.0.0.0dbru.zip"
    
  3. 为该目录配置系统环境变量。

    ORACLE_HOME="/home/usr/lib/oracle/instantclient" export "ORACLE_HOME"
    PATH="${ORACLE_HOME}":${PATH} export "PATH"
    LD_LIBRARY_PATH="${ORACLE_HOME}" export "LD_LIBRARY_PATH"
    TNS_ADMIN="${ORACLE_HOME}/network/admin" export "TNS_ADMIN"
    ORACLE_SID="HPDDTEST_EXEC" export "ORACLE_SID"
    
  4. 测试SQLPlus和SQLLdr是否配置成功。

    sqlplus -v
    sqlldr -version
    

    输出以下命令则表示配置成功。

    SQL*Plus: Release 21.0.0.0.0 - Production
    Version 21.13.0.0.0
    
    LRM-00101: unknown parameter name 'version'
    
    SQL*Loader: Release 21.0.0.0.0 - Production on Mon Jan 29 04:32:59 2024
    Version 21.13.0.0.0
    
    Copyright (c) 1982, 2024, Oracle and/or its affiliates.  All rights reserved.
    
    SQL*Loader-100: Syntax error on command-line
    

下载解压 Java Runtime Environment (JRE) 并配置 Java 环境变量

  1. 到 Oracle 官网下载最新版本的 JRE 或 JDK 并解压。 Annotation 2024-01-29 112458.png

    cp "./jre-8u401-linux-x64.tar.gz" "/home/usr/lib/oracle"
    tar -zxvf "./jre-8u401-linux-x64.tar.gz"
    
  2. 为该目录配置系统环境变量。

    JAVA_HOME="/home/usr/lib/oracle/jre/bin" export "JAVA_HOME"
    PATH="${JAVA_HOME}":${PATH} export "PATH"
    
  3. 测试 Java 环境是否配置成功。

    java -version
    

    输出以下命令则表示配置成功。

    java version "1.8.0_401"
    Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)
    

下载 Oracle 完整的数据库压缩包并提取 mkstore 功能的相关文件

  1. 访问Oracle官网中的【Oracle Database Software Downloads】页面,下载 Oracle 数据库 Linux 版本的 ZIP 压缩包。 LINUX.X64_213000_db_home.zip Annotation 2024-01-26 162720.png

  2. 将压缩包解压,按以下列表搜索并提取出文件,并整理成以下文件结构。 Annotation 2024-01-26 163354.png

    其中 mkstore 文件在压缩包的 /bin 目录下,其他 jar 文件分散在剩余的文件夹里。不同版本的 Oracle,所需的文件略有不同,可参考 mkstore 文件中对 jar 文件的检索过程以确定具体需要哪些文件。

    #####################################
    # 3. locate Jars
    #####################################
    if [ -d "$TOOLROOT/oracle_common" ]; then
      MW_MOD=$TOOLROOT/oracle_common/modules
      PKILOC=${MW_MOD}/oracle.pki
      RSALOC=${MW_MOD}/oracle.rsa
      OSDTLOC=${MW_MOD}/oracle.osdt
      OJLIB=$TOOLROOT/jlib
    elif [ ! -z "$SRCHOME" ]; then
      PROD_DIST=$SRCHOME/entsec/dist
      PKILOC=$PROD_DIST/oracle.pki/modules/oracle.pki
      RSALOC=$PROD_DIST/oracle.rsa.crypto/modules/oracle.rsa
      OSDTLOC=$PROD_DIST/oracle.osdt.core/modules/oracle.osdt
      EMMA_JAR=$SRCHOME/ldap/test/lib/emma.jar
    elif [ ! -z "$ORACLE_HOME" -a -d "$ORACLE_HOME" ]; then
      OJLIB=$ORACLE_HOME/jlib
      PKILOC=$OJLIB
      RSALOC=$OJLIB
      OSDTLOC=$OJLIB
    else
      OJLIB=$TOOLHOME/jlib
      PKILOC=$OJLIB
      RSALOC=$OJLIB
      OSDTLOC=$OJLIB
    fi
    
    PKI=$PKILOC/oraclepki.jar
    RSA=$RSALOC/cryptoj.jar
    OSDT_CORE=$OSDTLOC/osdt_core.jar
    OSDT_CERT=$OSDTLOC/osdt_cert.jar
    

    注意:压缩包中并不包含 mkstore 脚本中所需的 emma.jar 文件。经实测,不提取此文件,脚本依然可以正常运行。

  3. 测试 mkstore 命令能否运行。

    mkstore
    

    输出以下命令则表示配置成功。

    Oracle Secret Store Tool Release 21.0.0.0.0 - Production
    Version 21.3.0.0.0
    Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
    
    mkstore [-wrl wrl] [-create] [-createSSO] [-createLSSO] [-createALO] [-delete] [-deleteSSO] [-list] [-createEntry alias secret] [-viewEntry alias] [-modifyEntry alias secret] [-deleteEntry alias] [-createCredential connect_string username password] [-listCredential] [-modifyCredential connect_string username password] [-deleteCredential connect_string]  [-createUserCredential map key  <username> password]  [-modifyUserCredential map key username password]  [-deleteUserCredential map key] [-help] [-nologo]
    

创建数据库连接配置文件 tnsnames.ora

到 Oracle Instant Client 存放目录下的 /network/admin 文件夹,或自己在环境变量中指定的 TNS_ADMIN 目录下创建数据库连接配置文件 tnsnames.ora

cd "/home/usr/lib/oracle/network/admin"
touch "tnsnames.ora"
vim "tnsnames.ora"

在该文件中写入以下连接信息,保存退出。

DATABASE_LINK=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS= 
        (PROTOCOL=TCP)
        (HOST=127.168.0.24)
        (PORT=1521)
      )
    )
    (CONNECT_DATA=
      (SERVER=DEDICATED)
      (SERVICE_NAME=DATABASE_NAME)
    )
  )

使用 mkstore 命令生成 wallet 文件

  1. 为 Oracle Wallet 文件创建一个目录。

    cd "/home/usr/lib/oracle/network/admin"
    mkdir "wallet"
    
  2. 在刚才创建的目录中创建 Oracle Wallet 文件。需要输入以及确认密码。

    mkstore -wrl "/home/usr/lib/oracle/network/admin/wallet" -create
    
  3. 为之前在 tns_names.ora 文件中创建的数据库连接创建 Oracle Wallet 凭证。

    mkstore -wrl "/home/usr/lib/oracle/network/admin/wallet" -createCredential DATABASE_LINK username !paSSwORd123
    
  4. 确认 Oracle Wallet 凭证已经创建。

    mkstore -wrl "/home/usr/lib/oracle/network/admin/wallet" -listCredential
    

    输出以下信息表示凭证创建成功。

    Oracle Secret Store Tool Release 21.0.0.0.0 - Production
    Version 21.3.0.0.0
    Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
    
    Enter wallet password:
    List credential (index: connect_string username)
    1: DATABASE_LINK username
    

创建 SQLPlus 配置文件 sqlnet.ora

到 Oracle Instant Client 存放目录下的 /network/admin 文件夹,或自己在环境变量中指定的 TNS_ADMIN 目录下创建数据库监听配置文件 sqlnet.ora

cd "/home/usr/lib/oracle/network/admin"
touch "sqlnet.ora"
vim "sqlnet.ora"

在该文件中写入以下连接信息,保存退出。

WALLET_LOCATION=
  (SOURCE=
    (METHOD=FILE)
    (METHOD_DATA=
      (DIRECTORY=/home/usr/lib/oracle/network/admin/wallet)
    )
  )
SQLNET.WALLET_OVERRIDE=TRUE

测试连接

使用 sqlplus 命令连接数据库,只指定数据库连接名 TNS name,用户名和密码留空。

sqlplus /@DATABASE_LINK

出现以下输出信息即表示配置成功。

SQL*Plus: Release 21.0.0.0.0 - Production on Mon Jan 29 04:14:54 2024
Version 21.13.0.0.0

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

SQL>

参考文档

  1. Using the Secure External Password Store with Instant Client
  2. oracle wallet实践及常用维护操作
  3. Managing Oracle Database Wallets and Certificates
  4. Parameters for sqlnet.ora Files
  5. Oracle Database Software Downloads
  6. Java Downloads
  7. Oracle Instant Client Downloads