在 VB.NET 中接受自签名的 TLS/SSL 证书

31

我正在寻找一种使用VB.NET验证(或绕过验证)自签名SSL证书的方法。我在C#中找到了这样的代码,并尝试将其转换为VB代码,但没有成功。

以下是C#代码:How do I use WebRequest to access an SSL encrypted site using https?

以下是我尝试过的内容:

Imports System
Imports System.Net
Imports System.Security.Cryptography.X509Certificates

Public Class clsSSL
    Public Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function
End Class

在使用WebRequest之前,我有一行代码导致了一个错误。

ServicePointManager.ServerCertificateValidationCallback =
    New System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications)

错误信息如下:

委托 'System.Net.Security.RemoteCertificateValidationCallback' 需要一个“AddressOf”表达式或者 lambda 表达式作为其构造函数的唯一参数。


你的 AcceptAllCertifications 没有接受自签名证书。它接受所有证书,甚至是恶意站点和攻击者的证书。你应该接受已知的证书。请参见我的答案 - Martin Prikryl
6个回答

36

在VB.Net中,您需要编写:

ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications

14

一句话概括:

System.Net.ServicePointManager.ServerCertificateValidationCallback = _
  Function(se As Object, _
  cert As System.Security.Cryptography.X509Certificates.X509Certificate, _
  chain As System.Security.Cryptography.X509Certificates.X509Chain, _
  sslerror As System.Net.Security.SslPolicyErrors) True

感谢Robby Tendean提供的帮助。


7
"ServicePointManager.ServerCertificateValidationCallback = Function(s, c, h, e) True" 可以翻译为: "ServicePointManager.ServerCertificateValidationCallback = 函数(s, c, h, e) True"。 - Filip Cornelissen

4

这里的所有答案都盲目地接受任何证书。这是一个安全漏洞。

在实施ServicePointManager.ServerCertificateValidation回调函数时,应该验证证书。例如,通过将证书的哈希值与已知值进行比较:

Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates

ServicePointManager.ServerCertificateValidationCallback =
    Function(sender As Object, certificate As X509Certificate, chain As X509Chain,
             errors As SslPolicyErrors)
        Return _
            (errors = SslPolicyErrors.None) Or
            certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
                "EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA67737179E3C85BC3CD09D4EEC")
    End Function

对于采用 HashAlgorithmName.SHA256X509Certificate.GetCertHashString 重载函数, 需要使用 .NET 4.8。在旧版本中,请使用返回 SHA-1 哈希值的无参数重载函数 the parameter-less overload


基于当你知道一个无效的证书是安全的时候,测试X509Certificate.Thumbprint属性是否安全

有关C#版本的代码,请参见FtpWebRequest "远程证书根据验证过程是无效的"


问题的标题是“在VB.NET中接受自签名的TLS/SSL证书”,请不要给我您的个人安全意见。请坚持回答问题。 - Mike
@Mike 这正是我的答案所展示的。而其他所有答案都展示了如何盲目接受任何(合法和恶意)证书。 - Martin Prikryl

2

2
我的语法是由VB.Net 2005引入的(类似于C#)。 - SLaks

0
在VB.Net中,
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls

解决了不安全应用程序的问题。


-1

在VB.Net中

ServicePointManager.ServerCertificateValidationCallback = Function(s, c, h, e) True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接