![](/img/trans.png)
[英]Converting SQL Server connection to Oracle database connection (ASP.NET Core MVC & C#)
[英]How to change protocol for Oracle database connection in ASP.NET Core?
我有一个 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
。
根据此处的文档,这些是 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 版开始,本机网络加密和 TCP/IP 与 SSL/TLS 不再是高级安全选项的一部分,因此您可以配置数据库服务器和客户端中的所有元素以通过 TCPS 建立安全连接。
基本上你需要在服务器和客户端使用orapki
实用程序,并在服务器端重新配置listener.ora
和sqlnet.ora
文件。
在您的情况下,您需要重新配置 Oracle 客户端中的客户端元素,该客户端是 Windows 的 ODAC 组件附带的。
您必须满足以下先决条件:
使用自动登录创建服务器钱包
$ 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, 2014, 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
一旦我们准备好钱包和连接双方的证书,我们就可以在$ORACLE_HOME/network/admin
配置sqlnet.ora
文件
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)
您可能需要考虑要支持哪些密码套件。 您可能希望避免支持 SSLv3 的那些,而选择仅支持 TLS 的那些。 您的决定可能因 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 流量的方法。
就我而言,我们选择使用选项 2,只要您在对查询的响应中看到 ASE256(这是数据库服务器端请求的) select NETWORK_SERVICE_BANNER from v$session_connect_info where SID = sys_context('USERENV','SID')
那么我会说你很好。
您可以按原样显式配置您的连接,但在我的情况下我不必这样做,因为默认情况下 oracle 服务器已配置为需要它。
OracleConfiguration.SqlNetEncryptionClient = "required";
OracleConfiguration.SqlNetCryptoChecksumClient = "required";
资料来源:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.