问题描述
我有一个ASP.NET Core应用程序,该应用程序使用nuget软件包Oracle.ManagedDataAccess.Core
v2.19.80和Dapper
连接到Oracle数据库。根据请求数据,每次可能需要连接到不同的数据库。
连接发生的字符串是这样创建的:
public DatabaseConnector(IConfiguration configuration,IDbConnectionFactory connectionFactory,ISyncPolicy policy)
{
var packageSettings = configuration.GetPackageConfiguration();
var connectionString = new OracleConnectionStringBuilder
{
DataSource = packageSettings.DataSource,UserID = packageSettings.Username,Password = packageSettings.Password,ConnectionTimeout = 5,};
_dbConnection = connectionFactory.CreateConnection(connectionString.ConnectionString);
_policy = policy;
}
运行以下查询时
SELECT sys_context('USERENV','NETWORK_PROTOCOL') AS network_protocol
FROM dual
响应为tcp
。如何配置连接或连接字符串,或如何做才能将协议从tcp
更改为tcps
。
根据文档here,这是2种受支持的类型。我想确保我的连接是安全的(SSL / TLS 1.2)。
到目前为止,我已经阅读了以下文档,但尚未实现目标。
阅读的文档:
我也尝试添加以下内容:
OracleConfiguration.OracleDataSources.Add("test","(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname or IP>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<service name>)(SERVER=dedicated)))");
使用此命令执行查询
_dbConnection.Query<string>(databaseQuery,queryParameters);
我也查看了属性TnsAdmin
,但不确定如何使用OracleConnectionStringBuilder
类构建查询字符串时公开的属性。看起来是ora文件的路径,但是我没有这样的文件。
解决方法
自版本10g第2版起,本机网络加密和带有SSL / TLS的TCP / IP不再是“高级安全性选项”的一部分,因此,您可以配置数据库服务器和客户端中的所有元素以建立安全连接通过TCPS。
基本上,您需要在服务器和客户端中都使用orapki
实用程序,并在服务器端重新配置listener.ora
和sqlnet.ora
文件。
在这种情况下,您需要在Windows的ODAC组件随附的Oracle客户端中重新配置客户端元素。
您必须满足以下先决条件:
- 正常运行的数据库服务器12.2或更高版本(推荐)
- 安装了Oracle Client(推荐12.1或更高版本)的客户端计算机
- 在要用于TCPS的端口中,没有本地或网络防火墙阻止服务器与客户端之间的通信。
- 您可以为钱包使用自签名证书,也可以使用自己公司信任的证书。
使用自动登录功能创建服务器钱包
$ mkdir -p /your_wallet_directory
$ orapki wallet create -wallet "/your_wallet_directory" -pwd yourpassword -auto_login_local
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004,2014,Oracle and/or its affiliates. All rights reserved.
创建自签名证书并将其加载到钱包中
$ orapki wallet add -wallet "/your_wallet_directory" -pwd yourpassword \
-dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004,Oracle and/or its affiliates. All rights reserved.
导出证书,以便我们稍后将其加载到客户钱包中
$ orapki wallet export -wallet "/your_wallet_directory" -pwd yourpassword \
-dn "CN=`hostname`" -cert /tmp/`hostname`_certificate.crt
客户钱包和证书
在您的客户端计算机上执行以下操作
$ mkdir -p /my_client_wallet
$ orapki wallet create -wallet "/my_client_wallet" -pwd myclientpassword -auto_login_local
创建自签名证书并将其加载到客户端的钱包中
$ orapki wallet add -wallet "/my_client_wallet" -pwd myclientpassword -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650
在客户端中导出证书,以便我们以后可以将其加载到服务器中
$ orapki wallet export -wallet "/my_client_wallet" -pwd myclientpassword -dn "CN=`hostname`" -cert /tmp/clientcertificate.crt
交换证书
连接的每一端都需要信任对方,因此我们必须将服务器中的证书作为受信任的证书加载到客户端的钱包中,反之亦然。将每边完成的出口证书转移到另一边,然后使用
导入在客户中
orapki钱包添加-wallet“ / my_client_wallet” -pwd yourclientpassword -trusted_cert -cert /serverhostname_certificate.crt
在服务器中
orapki钱包添加-wallet“ / your_wallet_directory” -pwd yourwalletpassword
-trusted_cert -cert /tmp/myclienthost-certificate.crt
一旦我们准备好了钱包并且在连接的两边都安装了证书,我们就可以在sqlnet.ora
中配置$ORACLE_HOME/network/admin
文件
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /your_wallet_server_directory)
)
)
SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA)
您可能需要考虑要支持的密码套件。您可能希望避免使用那些仅支持TLS的支持SSLv3的支持。您的决定可能因Oracle数据库和客户端版本而异。
最后,将侦听器配置为接受SSL / TLS加密的连接。编辑$ORACLE_HOME/network/admin/listener.ora
文件,添加钱包信息以及TCPS条目。
请注意,我将1521用于标准连接,将2484用于TCPS连接
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /your_wallet_directory)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourdns)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = yourdns)(PORT = 2484))
)
)
ADR_BASE_LISTENER = /your_adr_path
,
有两种加密 SQLNET 流量的方法。
- 使用钱包/证书和网络层 (SSL/TLS)
- 使用原生 Oracle 加密,不加密网络层,但会加密沿其发送的每个数据包
就我而言,我们选择了选项 2,只要您在对查询 select NETWORK_SERVICE_BANNER from v$session_connect_info where SID = sys_context('USERENV','SID')
的响应中看到 ASE256(这是数据库服务器端所请求的),那么我会说您不错。
您可以按原样显式配置您的连接,但在我的情况下我不必这样做,因为默认情况下 oracle 服务器已配置为需要它。
OracleConfiguration.SqlNetEncryptionClient = "required";
OracleConfiguration.SqlNetCryptoChecksumClient = "required";
来源: