CryptographicException在经典ASP与MySQL TLS



我正面临着这个问题,当我试图调用一个COM可见c#类在经典ASP页面试图执行一个MySQL查询数据库。(这里MySQL使用TLS)。

在这里,在我的例子中,一个经典的asp页面,我们创建SomeUser类的实例,然后调用SetId方法,它将尝试创建MySQL连接,并失败与此stacktrace。为了更加清晰,这里的SomeUser类是COMVisible。

经典ASP代码片段

dim dummy: set dummy= new SomeUser
dim dummyObj: set dummyObj= dummy.obj
dummyObj.SetId(ID)

System.Security.Cryptography.CryptographicException: The system cannot find the file specified. 
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) at System.Security.Cryptography.X509Certificates.X509Utils.LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle pCertCtx) 
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) 
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password) at MySql.Data.MySqlClient.NativeDriver.GetClientCertificates() 
at MySql.Data.MySqlClient.NativeDriver.StartSSL() at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.Driver.Open() 
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() 
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection() 
at MySql.Data.MySqlClient.MySqlConnection.Open() at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at Some.Other.Namespace.Execute(MySqlConnection connection, String sql, DataTable table, DataParameter[] dataParameters) at Some.Other.Namespace.Execute(MySqlConnection connection, String sql, DataParameter[] dataParameters) at Some.Other.Namespace.Execute(String sql, DataParameter[] dataParameters) 
at SomeNamespace.SomeDc.GetData(UInt32 Id) at 
SomeNamespace.User.GetData(UInt32 ID) at SomeNameSpace.SomeUser.SetId(Int32 Id)

关于Stack Overflow的类似问题。

在我的情况下,这个解决方案(将加载用户配置文件设置为true)只适用于ASPX页面,但在这种情况下不起作用。

还有一点我想强调w3wp.exe运行在默认应用程序池与ApplicationPoolIdentity。

到目前为止,我已经尝试了很多东西,但没有运气。任何指向正确方向的点都将大有帮助。

我已经尝试过了。

  • 将所有应用程序池的Load User Profile设置为true
  • 将应用程序池标识更改为网络服务,本地系统
  • 将应用程序池标识更改为自定义帐户(我使用管理员帐户来尝试)

我对ASP没有任何线索,所以我不明白你在做什么。

然而,异常日志似乎可以告诉我们哪里出了问题。ASP/COM应用程序试图加载客户端当连接到MySQL服务器时,无法找到相应的文件。这可能是由于权限的原因,也可能仅仅是因为该文件不存在。

请注意,这是一个不太常见的问题,可能会使您无法快速找到解决方案。证书的问题通常是由于服务器证书不受信任、被撤销或过期。但在本例中,COM部分试图加载客户端证明是它的身份服务器。

解决这个问题的方法取决于具体情况:

  • 如果你在控制MySQL服务器,你可以配置它,使它不请求客户端证书。然后,COM代码不再需要加载客户端证书,您可以相应地更改COM对象的行为。但是,在服务器端关闭客户端身份验证可能是不安全的。

  • 你似乎在控制COM代码,所以你可以重新访问它,看看它在哪里试图加载MySQL客户端证书。检查它试图加载哪个文件,并检查文件系统上是否有该文件。如果不存在该证书,并且无法在没有客户端证书的情况下工作,则必须生成客户端证书。
    我不知道COM对象是如何工作的,虽然。即使你没有找到一个地方,它试图显式加载客户端证书,它可能会评估一些MySQL客户端配置文件,告诉它使用(特定)客户端证书连接到服务器。这些文件的名称可能像mysql.ini,my.ini,my.cnf或类似的。

澄清:以上段落是关于MySQL客户端MySQL TLS的证书连接。这与web服务器证书无关。

如果你需要MySQL客户端认证,你应该一步一步地测试:

  1. 生成合适的MySQL客户端证书
  2. 把客户端证书和私钥放在COM应用程序运行的机器上。
  3. 登录到该机器并安装本地MySQL客户端
  4. 在那台机器上,尝试用客户端身份验证建立一个到MySQL服务器的加密连接,使用本地MySQL客户端使用您的客户端证书。
    如果这不起作用,可能没有机会从你的COM对象中工作,所以你需要先解决这个问题。
  5. 在最后一步中,再次尝试您的ASP应用程序/COM对象。确保它有足够的权限来读取证书和私钥,并且它们都存在于预期的位置。

如果与本机客户端连接成功,但COM对象仍然无法连接,我可能有一个如何调试这种情况的额外想法。在这种情况下,只需留下评论;我最终会修改这个答案。

最新更新