首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CryptographicException技术实现经典ASP中的MySQL

问用CryptographicException技术实现经典ASP中的MySQL
EN

Stack Overflow用户
提问于 2022-05-10 09:18:40
回答 1查看 235关注 0票数 4

当我试图调用经典ASP页面中的COM可视c#类时,我面临这个问题,它试图对数据库执行一个MySQL查询。(在这里,MySQL在TLS上)。

在我的例子中,经典的asp页面之一,我们创建SomeUser类的实例,然后调用将尝试创建MySQL连接的SetId方法,并在这个堆栈跟踪中失败。为了完全清楚起见,这里的SomeUser类是COMVisible。

经典ASP代码片段

代码语言:javascript
复制
dim dummy: set dummy= new SomeUser
dim dummyObj: set dummyObj= dummy.obj

dummyObj.SetId(ID)

异常

代码语言:javascript
复制
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)

Similar question on Stack Overflow在这上面。

在我的示例中,此解决方案(将Load用户配置文件设置为true)仅适用于ASPX页面,但在本例中不起作用。

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

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

到目前为止,我已经尝试过的事情了。--

将所有应用程序的pools.

  • Changing应用程序池标识为网络服务、本地系统和其他存在于IIS.

  • Changing应用程序池标识的用户配置文件加载到自定义帐户(我使用管理员帐户来尝试此操作)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-17 00:14:23

我对ASP没有任何线索,所以我不明白你尝试了什么。

然而,异常日志似乎可以判断出出了什么问题。当连接到服务器时,ASP / COM应用程序试图加载一个MySQL客户端证书,但找不到相应的文件。这可能是由于权限造成的,也可能是由于该文件不存在而发生的。

请注意,这是一个不太常见的问题,可能会使您无法快速找到解决方案。证书的问题通常是由于服务器证书不受信任、撤销或过时所致。但是在这种情况下,COM部分试图加载一个客户端证书,以便它能够向服务器证明的 identity 。

解决问题的办法取决于情况:

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

  • 您似乎控制了COM代码,因此您可以重新访问它并查看它试图加载MySQL客户端证书的位置。检查它尝试加载的文件,并检查文件系统上是否有该文件。如果它不存在,而且如果不使用客户端证书也不是一种选择,则必须生成客户端证书。

不过,我不知道COM对象是如何工作的。即使您找不到它试图显式加载客户端证书的位置,它也可能评估一些MySQL客户端配置文件,这些文件告诉它在连接到服务器时使用(特定的)客户端证书。这些文件可能有mysql.ini、my.ini、my.cnf等名称.

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

如果需要MySQL客户端身份验证,则应逐步进行测试:

certificate.

  • Put
  1. 生成一个适当的MySQL客户端证书,该客户端证书连同私钥一起连接到运行COM应用程序的机器上。
  2. Log在该计算机上并在那里安装本机MySQL client (可用于Windows)。在该计算机上,尝试通过客户端身份验证与MySQL服务器建立加密连接,使用本地MySQL客户端<代码>E 236并使用客户端证书建立到MySQL服务器的加密连接。

如果这不起作用,很可能它不可能在COM对象中工作,因此您需要首先解决这个问题。

  • 在最后一步中,再次尝试您的ASP应用程序/ COM对象。确保它有足够的权限读取证书和私钥,并且两者都存在于预期的位置。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72183698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档