作为想要加强连接安全性的人,你应该首先使用一个
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
)。