如何使用 ssl 加密 cx_oracle 连接?

Suj*_*uji 3 python oracle ssl cx-oracle python-3.x

我正在使用 python 3.7 版本的 cx_oracle 模块,我需要检查连接是否加密。如果不是,我需要将 ssl 设置为 true 才能使其加密。

这是我用于建立连接的代码:

import cx_Oracle
dsn = cx_Oracle.makedsn(host='127.0.0.1', port=1521, sid='your_sid')
conn = cx_Oracle.connect(user='your_username', password='your_password', dsn=dsn)
conn.close()
Run Code Online (Sandbox Code Playgroud)

Rob*_*dez 6

当您考虑启用连接安全性时,您的第一步应该是使用wallet,甚至在考虑使用 之前ssl,并避免使用密码。如果您的密码在 Python 程序中可见,那么您的网络流量的加密程度并不重要。我知道这不是问题本身的一部分,但这是一个非常好的实践,可用于cx_Oracle.

一个示例(我的 Python 程序在一台 Linux 客户端计算机上运行,​​该计算机也使用 Linux 连接到 Oracle 数据库ssl

客户端

1.创建钱包

mkstore -wrl "/home/myuser/wallet_directory" -create
Run Code Online (Sandbox Code Playgroud)

2.创建凭证

mkstore -wrl "/home/myuser/wallet_directory" -createCredential mynetalias myuser myuserpw
Run Code Online (Sandbox Code Playgroud)

mynetalias我的字符串连接的别名在哪里tns,我将存储在我的tnsnames.ora文件中。在我的示例中,我将使用创建钱包的同一目录。

3.创建tnsnames.ora并添加钱包中使用的相同别名

mynetalias =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = dbhost.example.com)(PORT = 1521))
        (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = orclpdb1)
        )
    )
Run Code Online (Sandbox Code Playgroud)

4.创建sqlnet.ora文件

WALLET_LOCATION =
    (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
            (DIRECTORY = /home/myuser/wallet_dir)
        )
    )
SQLNET.WALLET_OVERRIDE = TRUE
Run Code Online (Sandbox Code Playgroud)

5.将TNS_ADMIN环境变量添加到 bash 配置文件中。

cd
echo "export TNS_ADMIN=/home/myuser/wallet_directory" >> .bashrc
Run Code Online (Sandbox Code Playgroud)

如果您确实知道数据库服务器强制执行完整性和加密,那么您不需要在客户端进行任何配置。不过,您也可以根据您的业务需求执行此操作。将以下行添加到sqlnet.ora钱包所在的文件中

SQLNET.CRYPTO_CHECKSUM_CLIENT = required
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA512)
SQLNET.ENCRYPTION_CLIENT = required
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)
Run Code Online (Sandbox Code Playgroud)

数据库端

为了进行设置SSLencryption我们需要将这些值添加到数据库sqlnet.ora文件中。查看您的要求并讨论正确的安全算法。就我而言,我的数据库接受两种方式的连接(带或不带加密)。

SQLNET.CRYPTO_CHECKSUM_SERVER = accepted
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA512)
SQLNET.ENCRYPTION_SERVER = accepted
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
Run Code Online (Sandbox Code Playgroud)

您可能想在此处查看这些参数:

SQLNET 参数

如何连接

普通的

connection = cx_Oracle.connect(dsn="mynetalias")
Run Code Online (Sandbox Code Playgroud)

水池

pool = cx_Oracle.SessionPool(externalauth=True, homogeneous=False,
                             dsn="mynetalias")
pool.acquire()
Run Code Online (Sandbox Code Playgroud)

请记住,dsn必须与您之前配置中使用的别名完全匹配tnsnames.ora

使用视图提供的信息来V$SESSION_CONNECT_INFO确保您的连接已加密(字段network_service_banner