我正在尝试使用SSL证书通过Oracle.ManagedDataAccess Nuget包连接到Amazon RDS实例。
我可以使用orapki生成的钱包通过SQL * Plus成功连接。通过跟随AWS instructions生成的钱包
我想通过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>
我在Open()
上得到了一个OracleException:
Oracle.ManagedDataAccess.Client.OracleException:'网络传输:解析钱包位置时SSL失败'
内部异常:
TCPS:无效的SSL钱包(魔术)
它绝对可以找到并可以访问钱包文件,因为如果你将位置更改为无效的东西,你会得到一个不同的内部异常,例如:
DirectoryNotFoundException:找不到路径'C:\ ssl_wallet2 \ cwallet.sso'的一部分。
我找不到任何明显的东西来说明为什么钱包应该是无效的,因为SQL * Plus已经使用它来成功连接到同一个服务器。
Invalid SSL Wallet (Magic)
不会产生任何我能找到的相关信息。这种方法中有什么我想念的吗?
事实证明,orapki生成的钱包文件不适合这里。
解决方案是使用Windows证书存储来代替持有RDS证书颁发机构。
在这种情况下,您下载PKCS7 file for RDS from AWS并将其导入Windows中的受信任的根证书颁发机构。
然后,您更改您的app.config
以将您的钱包位置设置为Microsoft证书存储区,如下所示:
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name = "WALLET_LOCATION" value="(SOURCE=(METHOD =MCS)) "/>
</settings>
</version>
</oracle.manageddataaccess.client>
然后一切都按预期工作。