使用 mTLS 连接 Python 应用程序

适用于:适用 仅适用于 Exadata Cloud@Customer

您可以使用 mTLS 将 Python 应用连接到 Autonomous AI Database 实例。

使用 mTLS 连接 Python 应用程序可增强验证和加密的安全性,并使用客户机凭证(提供用户名和密码)实施安全性。

python-oracledb 驱动程序的默认“瘦模式”直接连接到 Oracle Database。驱动程序可以选择使用 Oracle Client 库 "Thick mode"(厚模式)来获得一些附加功能。Oracle 客户机库可以来自 Oracle Instant Client、完整的 Oracle Client 或 Oracle Database 安装。

按照以下步骤使用 mTLS 将 Python 应用连接到 Autonomous AI Database 实例:

  1. 安装 Python 和 python-oracledb 驱动程序
  2. 获取安全凭证 (Oracle Wallet) 和启用网络连接
  3. 如果您只想在瘦模式下连接,请执行此步骤:使用 python-oracledb 瘦模式 (mTLS) 运行 Python 应用程序
  4. 如果要以厚模式连接,请执行此步骤:使用 python-oracledb 厚模式 (mTLS) 运行 Python 应用程序

安装 Python 和 python-oracledb 驱动程序

要从 Python 应用连接到 Autonomous AI Database ,请安装 Python 和 python-oracledb 驱动程序。

  1. 安装 Python 3 (如果尚不可用)。

    您使用的 Python 版本取决于您的客户端 OS 和硬件。例如,Windows、Linux、macOS 等。

    注意:

    Oracle 建议您及时了解 Python 和 python-oracledb 驱动程序版本。
  2. PyPI 安装 python-oracledb 驱动程序。

    python-oracledb 驱动程序是一个 Python 编程语言扩展模块,允许 Python 程序连接到 Oracle Database。python-oracledb 驱动程序是广受欢迎的 cx_Oracle 驱动程序的重命名新主要发行版。

    支持的 python-oracledb 驱动程序版本:python-oracledb 1.0(或更高版本)

    运行以下命令升级 python:

    python -m pip install oracledb --upgrade

    您应看到类似如下的输出结果:

    Collecting oracledb
      Downloading oracledb-1.0.3-cp310-cp310-win_amd64.whl (1.0 MB)
         ---------------------------------------- 1.0/1.0 MB 1.8 MB/s eta 0:00:00
    Collecting cryptography>=3.4
      Downloading cryptography-37.0.4-cp36-abi3-win_amd64.whl (2.4 MB)
         ---------------------------------------- 2.4/2.4 MB 3.5 MB/s eta 0:00:00
    Collecting cffi>=1.12
      Downloading cffi-1.15.1-cp310-cp310-win_amd64.whl (179 kB)
         ---------------------------------------- 179.1/179.1 kB 5.4 MB/s eta 0:00:00
    Collecting pycparser
      Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
         ---------------------------------------- 118.7/118.7 kB 7.2 MB/s eta 0:00:00
    Installing collected packages: pycparser, cffi, cryptography, oracledb
    Successfully installed cffi-1.15.1 cryptography-37.0.4 oracledb-1.0.3 pycparser-2.21

    安装 python-oracledb 的说明:

    • 如果您位于代理后面,请使用 --proxy 选项将代理服务器添加到命令中。例如:

      python -m pip install oracledb --upgrade --proxy=http://proxy.example.com:80
    • 如果您无权写入系统目录,请包括 --user 选项。例如:

      python -m pip install oracledb --upgrade --user
    • 如果二进制程序包不适用于您的平台,则运行 pip 将改为下载源程序包。将编译源并安装生成的二进制文件。

    有关其他选项和提示,请参见 Installing python-oracledb

  3. 如果要以 Thick 模式使用 python-oracledb 驱动程序,请安装 Oracle Client 软件。

    默认情况下,python-oracledb 在 Thin 模式下运行,该模式直接连接到 Oracle Database。瘦模式不需要 Oracle Client 库。但是,当 python-oracledb 在 Thick 模式下运行时,有一些额外的功能可用。

    注意:

    有关 python-oracledb Thin 和 Thick 模式中受支持功能的信息,请参见 Oracle Database Features Supported by python-oracledbAutonomous AI Database 中并未提供此链接中显示的所有功能。

    使用 Oracle Instant Client 库或 Oracle Database Client 库并在 Python 代码中调用 oracledb.init_oracle_client() 时,Python-oracledb 使用 Thick 模式。

    安装 Oracle Client Software 时,mTLS 和 TLS 连接所需的最低版本存在差异,如下所示:

    • 相互 TLS (mTLS) 连接

      • 如果您的数据库位于远程计算机上,请下载适用于您的操作系统体系结构的免费 Oracle Instant Client “基本”或“基本照明”软件包。使用支持的版本:Oracle Instant Client :18.19(或更高版本)、19.2(或更高版本)或 21(基本发行版或更高版本)。

      • 或者,您可以在系统上提供完整的 Oracle Database 客户端库(包括完整的 Oracle Database 客户端:Oracle Database 客户端:18.19(或更高版本)、19.2(或更高版本)或 21(基本发行版或更高版本)时使用这些库。

    • TLS 连接:如果您使用以下客户机版本,则 Oracle Call Interface (OCI) 客户机支持 TLS 验证:

      • Oracle Instant Client/Oracle Database Client 19.14(或更高版本)和 21.5(或更高版本)- 所有平台
      • 您也可以使用系统上可用的完整 Oracle Database 客户端库,包括完整 Oracle Database Client 19.14(或更高版本)和 21.5(或更高版本)。

获取安全身份证明 (Oracle Wallet) 并启用网络连接

获取客户端安全身份证明以连接到 Autonomous AI Database 实例。

  1. Autonomous AI Database 实例下载 wallet 文件,以获得包含访问 Autonomous AI Database 实例所需的客户端安全凭证和网络配置设置的 zip 文件。

    获取客户机安全凭证(wallet.zip 文件):

    • ADMIN 用户:在 Oracle Cloud Infrastructure 控制台上,单击数据库连接。请参见 Download Client Credentials (Wallets)

    • 其他用户(非管理员):从管理员处获取 Autonomous AI Database 实例的 Oracle Wallet。

    注意:

    保护 wallet.zip 文件及其内容,以防止未经授权的数据库访问。
  2. 解压缩客户机凭证文件 (wallet.zip)。

使用 python-oracledb 瘦模式 (mTLS) 运行 Python 应用程序

默认情况下,python-oracledb 使用 Thin 模式直接连接到 Autonomous AI Database 实例。

在瘦模式下,只需要钱包 zip 中的两个文件:

  • tnsnames.ora:将用于应用程序连接字符串的网络服务名映射到数据库服务。

  • ewallet.pem:在瘦模式下启用 SSL/TLS 连接。

要以瘦模式连接:

  1. tnsnames.oraewallet.pem 文件移至系统上的某个位置。

    例如,在 Linux 上:

    /opt/OracleCloud/MYDB

    例如,在 Windows 上:

    C:\opt\OracleCloud\MYDB
  2. 在 Python 应用中,设置以下连接参数以连接到 Autonomous AI Database 实例:
    • config_dir:指定包含 tnsnames.ora 的目录。
    • dsn:用于指定 tnsnames.ora 文件中所需的网络别名。
    • password:指定数据库用户密码。
    • user:指定数据库用户。
    • wallet_location:指定包含 PEM 文件 (ewallet.pem) 的目录。
    • wallet_password:指定 PEM 文件 (ewallet.pem) 的口令。下载 wallet.zip 文件时可设置此密码。

    例如,在 Linux 上,使用带有 db2024_low 网络服务名的 oracledb.connect 作为 ADMIN 用户进行连接(该服务名位于 tnsnames.ora 中):

    connection=oracledb.connect(
         config_dir="/opt/OracleCloud/MYDB",
         user="admin",
         password=password,
         dsn="db2024_low",
         wallet_location="/opt/OracleCloud/MYDB",
         wallet_password=wallet_pw)

    例如,在 Windows 上,使用带有 db2024_low 网络服务名的 oracledb.connect 作为 ADMIN 用户进行连接(该服务名位于 tnsnames.ora 中):

    connection=oracledb.connect(
         config_dir=r"C:\opt\OracleCloud\MYDB",
         user="admin",
         password=password,
         dsn="db2024_low",
         wallet_location=r"C:\opt\OracleCloud\MYDB",
         wallet_password=wallet_pw)

    使用“原始”字符串 r...”表示将反斜杠视为目录分隔符。

    如本示例所示,wallet_locationconfig_dir 设置为同一目录(该目录包含 tnsnames.oraewallet.pem)。不需要为这些文件指定相同的目录。

如果您位于防火墙后面,则可以使用连接描述符中的 HTTPS_PROXY 或通过设置连接属性通过代理来隧道 TLS/SSL 连接。成功的连接取决于特定的代理配置。Oracle 不建议在生产环境中使用代理,因为这可能对性能产生影响。有关详细信息,请参阅 Oracle Database 19c Database Net Services Reference 中的 HTTPS_PROXYOracle Database 26ai Database Net Services Reference

在瘦模式下,可以通过添加 https_proxyhttp_proxy_port 参数来指定代理。

例如,在 Linux 上:

connection=oracledb.connect(
     config_dir="/opt/OracleCloud/MYDB",
     user="admin",
     password=password,
     dsn="db2024_low",
     wallet_location="/opt/OracleCloud/MYDB",
     wallet_password=wallet_pw,
     https_proxy='myproxy.example.com',
     https_proxy_port=80)

例如,在 Windows 上:

connection=oracledb.connect(
     config_dir=r"C:\opt\OracleCloud\MYDB",
     user="admin",
     password=password,
     dsn="db2024_low",
     wallet_location=r"C:\opt\OracleCloud\MYDB",
     wallet_password=wallet_pw,
     https_proxy='myproxy.example.com',
     https_proxy_port=80)

使用 python-oracledb Thick Mode (mTLS) 运行 Python 应用程序

默认情况下,python-oracledb 在直接连接到 Oracle Database 的 Thin 模式下运行。当驱动程序在 Thick 模式下运行时,可以使用其他 python-oracledb 功能。

注意:

厚模式要求在运行 Python 的位置安装 Oracle 客户端库。您还必须在 Python 代码中调用 oracledb.init_oracle_client()

在厚模式下,需要从 wallet zip 文件中获取以下三个文件:

  • tnsnames.ora:包含用于应用程序连接字符串的网络服务名,并将字符串映射到数据库服务。

  • sqlnet.ora:指定 SQL*Net 客户端配置。

  • cwallet.sso:包含自动打开的 SSO wallet。

要在“厚”模式下连接,请执行以下操作:

  1. 将文件 tnsnames.orasqlnet.oracwallet.sso 放在系统上。

    使用以下两个选项之一将这些文件放置在系统中:

    • 如果使用 Instant Client,请将文件移至 Instant Client 目录下的 network/admin 子目录分层结构。例如,根据体系结构或客户机系统以及安装 Instant Client 的位置,文件应放置在目录位置,例如:

      /home/myuser/instantclient_19_21/network/admin

      或者

      /usr/lib/oracle/19.21/client64/lib/network/admin

      例如,在 Linux 上,如果使用的是完整的 Oracle Client,则将文件移动到 $ORACLE_HOME/network/admin

    • 或者,将文件移至任何可访问的目录。

      例如,在 Linux 上,将文件移动到目录 /opt/OracleCloud/MYDB 并编辑 sqlnet.ora 以将 wallet 位置目录更改为包含 cwallet.sso 文件的目录。

      例如,在 Linux 上,按如下方式编辑 sqlnet.ora

      WALLET_LOCATION = (SOURCE = (METHOD=file) (METHOD_DATA = (DIRECTORY="/opt/OracleCloud/MYDB")))
      SSL_SERVER_DN_MATCH=yes

      当配置文件不在默认位置时,您的应用程序需要使用调用 oracledb.init_oracle_client() 中的 config_dir 参数或通过设置 TNS_ADMIN 环境变量来指明它们的位置。

      注意:

      这两种设置都不是必需的,如果将所有配置文件都放在 network/admin 目录中,则不需要编辑 sqlnet.ora
  2. 在 Python 应用中,设置以下初始化和连接参数以连接到 Autonomous AI Database 实例:
    • config_dir:在放置配置文件时指定配置目录。仅当配置文件放置在即时客户机配置目录 network/admin 之外的目录中时,才需要执行此操作。
    • dsn:指定 tnsnames.ora 文件中所需的网络别名。
    • password:指定数据库用户密码。
    • user:指定数据库用户。

    在第一个放置配置文件的情况下,通过将 dsn 参数设置为 tnsnames.ora 中的所需网络别名,使用数据库身份证明连接到 Autonomous AI Database 实例。

    例如,要以 ADMIN 用户身份使用 oracledb.init_oracle_client 进行连接并使用 db2024_low 网络服务名进行连接(其中,服务名位于 tnsnames.ora 中):

    oracledb.init_oracle_client()
       connection=oracledb.connect(
           user="admin",
           password=password,
           dsn="db2024_low")

    如果配置文件位于即时客户机配置目录外部的目录中,请在调用 oracledb.init_oracle_client 时设置 config_dir 参数。

    例如,在 Linux 上,要以 ADMIN 用户身份使用 db2024_low 网络服务名进行连接:

    oracledb.init_oracle_client(config_dir="/opt/OracleCloud/MYDB")
       connection=oracledb.connect(
          user="admin",
          password=password,
          dsn="db2024_low")

    例如,在 Windows 上,要以 ADMIN 用户身份使用 db2024_low 网络服务名进行连接:

    oracledb.init_oracle_client(config_dir=r"C:\opt\OracleCloud\MYDB")
       connection=oracledb.connect(
          user="admin",
          password=password,
          dsn="db2024_low")

    使用“原始”字符串 r...”表示将反斜杠视为目录分隔符。

如果您位于防火墙后面,则可以使用连接描述符中的 HTTPS_PROXY 或通过设置连接属性通过代理来隧道 TLS/SSL 连接。成功的连接取决于特定的代理配置。Oracle 不建议在生产环境中使用代理,因为这可能对性能产生影响。有关详细信息,请参阅 Oracle Database 19c Database Net Services Reference 中的 HTTPS_PROXYOracle Database 26ai Database Net Services Reference

在“厚”模式下,可以通过编辑 sqlnet.ora 文件并添加行来指定代理:

SQLNET.USE_HTTPS_PROXY=on

此外,编辑 tnsnames.ora 并将 HTTPS_PROXY 代理名和 HTTPS_PROXY_PORT 端口添加到您计划使用的任何服务名的连接描述符地址列表中。

例如:

mydb_high=(description=
(address=(https_proxy=myproxy.example.com)
(https_proxy_port=80)
(protocol=tcps)(port=1522)(host=...)

有关 Thick 模式的信息,请参见 Enabling python-oracledb Thick mode