【问题标题】:vb Could not establish secure channel for SSL/TLSvb 无法为 SSL/TLS 建立安全通道
【发布时间】:2018-04-26 19:27:35
【问题描述】:

我正在处理一个不是我编写、继承的项目,并且有一个我不确定如何解决的问题。我的背景不是 .NET,所以请原谅任何听起来不对的地方,因为我可能不知道正确的术语应该是什么。

我们正在使用 Visual Studio 2008 编译一个在 Windows CE 6.0 上运行的项目。我们正在使用 Compact Framework v2.0。该软件在网络 (WIFI) 连接的工业环境中的嵌入式处理器上运行。主界面是用VB编写的,所有支持的DLL都是用C#编写的。

到目前为止,我们只需要为 GET 请求连接到 http(非安全)网址。为了安全起见,我们现在需要将这些地址切换到 https(安全)。

HttpWebRequest 是从 VB 构建/提交的。当我提供带有 https 地址的代码时,我收到主题中的 “无法为 SSL/TLS 建立安全通道” 错误。

这是该请求的代码:

                            Dim myuri As System.Uri = New System.Uri(sUrl)
                            Dim myHttpwebresponse As HttpWebResponse = Nothing
                            Dim myhttpwebrequest As HttpWebRequest = CType(WebRequest.Create(myuri), HttpWebRequest)
                            myhttpwebrequest.KeepAlive = False
                            myhttpwebrequest.Proxy.Credentials = CredentialCache.DefaultCredentials
                            myhttpwebrequest.ContentType = "text/xml"
                            myhttpwebrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
                            myhttpwebrequest.AllowAutoRedirect = False
                            myhttpwebrequest.Timeout = 150000
                            Dim mycred As NetworkCredential = New NetworkCredential(username, password)
                            Dim myCredentialCache As CredentialCache = New CredentialCache()
                            myCredentialCache.Add(myuri, "Basic", mycred)
                            myhttpwebrequest.Credentials = myCredentialCache
                            myhttpwebrequest.Method = "GET"
                            myhttpwebrequest.ProtocolVersion = HttpVersion.Version10
                            ServicePointManager.CertificatePolicy = New AcceptServerNameMismatch
                            myHttpwebresponse = CType(myhttpwebrequest.GetResponse(), HttpWebResponse)

我在过去一天左右做了很多阅读,这表明 CertificatePolicy 是我可以覆盖 ICertificatePolicy 类以从本质上验证所有 SSL 请求的地方。绝对不安全,也不理想,但我不确定处理这些请求的另一种方法。

我的班级是:

Public Class MyCertificatePolicy
        Implements ICertificatePolicy

    Public Shared DefaultValidate As Boolean = True
    Public Sub trustedCertificatePolicy()
    End Sub

    Public Function CheckValidationResult(ByVal srvPoint As ServicePoint, _
       ByVal cert As X509Certificate, ByVal request As WebRequest, ByVal problem As Integer) _
       As Boolean Implements ICertificatePolicy.CheckValidationResult
        Return True
    End Function
End Class

不幸的是,当响应返回时,它从不调用 CheckValidationResult()。因此,没有验证和错误。

所以我的问题...

  • 根据我阅读的所有内容,执行此操作的“正确”方法是使用 ServerCertificateValidationCallback。不幸的是,我们正在使用的 Compact Framework 版本(也许全部?)不包括在内。有什么我遗漏的东西会导致该函数不被调用吗?

  • 同样,根据我的阅读,我相信我们运行的框架不支持 TLS v1.1 或 v1.2。大多数当前服务器正在运行。 VB 中有没有办法解决这个问题?

  • 还有其他可以使用的Request方法吗?

非常感谢任何关于从这里去哪里的帮助或指导!

【问题讨论】:

  • 听起来 TLS 版本支持是个问题。看起来 Windows CE 6.0 两周前刚刚停止支持...我不想让您的希望破灭,所以也许有人有一个解决方案可以让您修复它。
  • 我知道支持已经结束,CE 的全部内容都已成定局。 2022 年 6 月是最后的结局……但我们(我)仍然需要看看是否有办法通过我们现有的设置来接受 https URL。如果我无法使用合法的 SSL 检查使其工作,那么我正在寻找一种方法来伪造它,就像在我的示例中一样。
  • 请参阅此 Microsoft 文档,了解有关 TLS/SSL Settings 和注册表调整以启用/禁用 SSL/TLS 协议。我真的不知道这一切是否适用于 Windows CE,尽管我非常怀疑。
  • 您的第二点是正确的:Windows CE 6.0(使用 .NET CE 3.5)仅支持最高 TLS 1.0。 Microsoft 提供了一个补丁,显然可以让您在 .NET 3.5 中使用 TLS 1.2(虽然不知道它是否适用于 CE),您可以尝试(查看更多信息:stackoverflow.com/q/43240611)或者您可以尝试查找 TLS 1.2 的第三方 .NET 实现。

标签: vb.net ssl https compact-framework windows-ce


【解决方案1】:

您需要在设备上安装受信任的根证书,该证书与您服务器上的 SSL 证书相匹配。

或者更改服务器上的证书以匹配设备上的受信任根之一。默认情况下,这些设备附带的受信任 CA 数量非常少,这与包含世界上几乎所有 CA 的桌面浏览器不同。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 2020-08-05
    • 2011-04-28
    • 2023-03-14
    • 2014-07-17
    • 2011-05-26
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多