如何使用SSL加密建立cx_oracle连接?

3
我正在使用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()

如果您不想自己设置SSL/TLS,可以快速使用Oracle的本地网络加密。请参阅cx_Oracle文档Securely Encrypting Network Traffic to Oracle Database - Christopher Jones
2个回答

6
作为想要加强连接安全性的人,你应该首先使用一个wallet,甚至在考虑使用ssl之前,避免使用密码。如果你的Python程序中的密码是可见的,那么你的网络流量再加密也没有用。我知道这不是问题本身的一部分,但这是一个非常好的实践方法,并且适用于cx_Oracle

以下是一个例子(我的Python程序运行在一个Linux客户端机器上,它使用ssl连接到运行在Linux上的Oracle数据库

客户端

1.创建钱包

mkstore -wrl "/home/myuser/wallet_directory" -create

2.创建凭据

mkstore -wrl "/home/myuser/wallet_directory" -createCredential mynetalias myuser myuserpw

其中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)
        )
    )

4.创建sqlnet.ora文件

WALLET_LOCATION =
    (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
            (DIRECTORY = /home/myuser/wallet_dir)
        )
    )
SQLNET.WALLET_OVERRIDE = TRUE

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

cd
echo "export TNS_ADMIN=/home/myuser/wallet_directory" >> .bashrc

如果您确定数据库服务器执行完整性和加密,则无需在客户端配置任何内容。但是,根据业务需要,您也可以或者同时进行配置。将以下行添加到存放钱包的sqlnet.ora文件中。
SQLNET.CRYPTO_CHECKSUM_CLIENT = required
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA512)
SQLNET.ENCRYPTION_CLIENT = required
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)

数据库端

为了设置SSL加密,我们需要将这些值添加到数据库的sqlnet.ora文件中。请查看您的要求并讨论正确的安全算法。在我的情况下,我的数据库可以接受有或没有加密的连接。

SQLNET.CRYPTO_CHECKSUM_SERVER = accepted
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA512)
SQLNET.ENCRYPTION_SERVER = accepted
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)

您可能需要查看这些参数:

SQLNET 参数

如何连接

普通连接

connection = cx_Oracle.connect(dsn="mynetalias")

pool = cx_Oracle.SessionPool(externalauth=True, homogeneous=False,
                             dsn="mynetalias")
pool.acquire()

请记住,dsn 必须与您在配置 tnsnames.ora 时使用的别名完全匹配。

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


很好地提到了钱包,以便从配置文件中删除可读的凭据。 - user123664
1
@ik_zelf,感谢您的友善评论。我确实认为这值得一提,因为我相信当任何人都可以读取您的密码时,拥有ssl并不太重要;) - Roberto Hernandez
1
我删除了我的回答。 - user123664
在某些用例(和操作系统或shell)中,在.bashrc文件中设置TNS_ADMIN是可以的,但并非所有情况都适用。对于其他选择,请参阅cx_Oracle文档中的可选Oracle Net配置文件(例如tnsnames.ora)。 - Christopher Jones
我不是安全专家,但这个答案似乎设置了Oracle的“本地网络加密”,这肯定比什么都没有要好。在Oracle文档https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-85027CCD-62A0-4E95-8B02-020745D50900中涵盖了SSL的设置。 - Christopher Jones

0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - kilojoules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接