【发布时间】: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