如何更改 ASP.NET Core 中 Oracle 数据库连接的协议?

How to change protocol for Oracle database connection in ASP.NET Core?

我有一个 ASP.NET 核心应用程序,它使用 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 class 构建查询字符串时公开。好像是一个ora文件的路径,但我没有这样的文件。

从版本 10g Release 2 开始,本地网络加密和 TCP/IP 与 SSL/TLS 不再是高级安全选项的一部分,因此您可以配置数据库服务器中的所有元素和客户端通过 TCPS 建立安全连接。

基本上你需要在服务器端和客户端都使用orapki实用程序,并在服务器端重新配置listener.orasqlnet.ora文件。

在您的情况下,您需要在 Oracle 客户端中重新配置客户端元素,该客户端随 Windows 的 ODAC 组件一起提供。

您必须满足以下先决条件:

  • 功能正常的数据库服务器 12.2 或更高版本(推荐)
  • 安装了 Oracle Client 的客户端计算机(推荐 12.1 或更高版本)
  • 在您要用于 TCPS 的端口中,没有本地或网络防火墙阻止服务器和客户端之间的通信。
  • 钱包可以使用self-signed证书,也可以使用自己公司信任的证书。

使用auto-login

创建服务器钱包
$ 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.

创建self-signed证书并将其加载到钱包

$ 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

创建self-signed证书并加载到客户端中的钱包

$ 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 add -wallet "/my_client_wallet" -pwd yourclientpassword -trusted_cert -cert /serverhostname_certificate.crt

在服务器中

orapki wallet add -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 流量的方法。

  1. 使用Wallets/Certificates和网络层(SSL/TLS)
  2. 使用本机 Oracle 加密,它不加密网络层,但加密沿它发送的每个数据包

就我而言,我们选择了选项 2,只要您在对查询的响应中看到 ASE256(这是数据库服务器端请求的内容)select NETWORK_SERVICE_BANNER from v$session_connect_info where SID = sys_context('USERENV','SID'),那么我会说你好

您可以按原样显式配置您的连接,但在我的情况下我不必这样做,因为 oracle 服务器已配置为默认需要它。

OracleConfiguration.SqlNetEncryptionClient = "required";
OracleConfiguration.SqlNetCryptoChecksumClient = "required";

来源:

  1. Database security - video 解释在 34:00
  2. Oracle Network Encryption