2

我正在尝试使用 SSL 证书通过 Oracle.ManagedDataAccess Nuget 包连接到 Amazon RDS 实例。

我可以使用使用 orapki 生成的钱包通过 SQL*Plus 成功连接。按照AWS 说明生成的钱包

我想通过 Oracle.ManagedDataAccessin C# 做同样的事情,我正在尝试使用同一个钱包。

我的 C# 看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;

namespace OracleDataAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"USER ID=***;PASSWORD=***;DATA SOURCE=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS)(HOST = ***) (PORT = 2484)))(CONNECT_DATA = (SID = ***))   (SECURITY = (SSL_SERVER_CERT_DN = C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=***)))";
            var connection = new OracleConnection(connectionString);
            connection.Open();
        }
    }
}

我的 app.config 有我钱包的位置:

<oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name = "WALLET_LOCATION" value="(SOURCE=(METHOD =FILE)(METHOD_DATA=(DIRECTORY=C:\ssl_wallet))) "/>
      </settings>
    </version>
</oracle.manageddataaccess.client>

我得到一个 OracleException Open()

Oracle.ManagedDataAccess.Client.OracleException:“网络传输:解析钱包位置时 SSL 失败”

除了内部例外:

TCPS:无效的 SSL 钱包(魔术)

它肯定会找到并可以访问钱包文件,因为如果您将位置更改为无效的位置,您会得到不同的内部异常,例如:

DirectoryNotFoundException:找不到路径“C:\ssl_wallet2\cwallet.sso”的一部分。

我找不到任何明显的证据来说明为什么该钱包应该无效,因为 SQL*Plus 已使用它成功连接到同一台服务器。

Invalid SSL Wallet (Magic)没有产生任何我能找到的相关内容。这种方法有什么我遗漏的吗?

编辑:

您的堆栈跟踪可能包含:

Culture=neutral, PublicKeyToken=b77a5c561934e089Array 不能为空或 null。参数名称: System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) at System.Security.Cryptography.X509Certificates.X509Certificate2.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags) 在 OracleInternal.Network.TcpsTransportAdapter.Negotiate(ConnectionOption conOption

4

1 回答 1

2

原来 orapki 生成的钱包文件在这里不合适。

解决方案是使用 Windows 证书存储来代替持有 RDS 证书颁发机构。

在这种情况下,您从 AWS 下载 RDS 的 PKCS7 文件并将其导入 Windows 中的受信任的根证书颁发机构。

然后,您将app.config您的钱包位置更改为 Microsoft 证书存储,如下所示:

<oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name = "WALLET_LOCATION" value="(SOURCE=(METHOD =MCS)) "/>
      </settings>
    </version>
</oracle.manageddataaccess.client>

然后一切都按预期工作。

于 2018-09-07T11:04:42.823 回答