Приемете самоподписан TLS/SSL сертификат във VB.NET

Търся начин за валидиране (или заобикаляне на валидирането за) самоподписани SSL сертификати с помощта на VB.NET. Намерих код за това в C# и се опитах да го конвертирам във VB код, но нямам късмет.

Ето кода на C#: https://stackoverflow.com/questions/560804/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“ или ламбда израз като единствен аргумент към неговия конструктор.


person compcentral    schedule 13.05.2011    source източник


Отговори (5)


Във VB.Net трябва да пишете

ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
person SLaks    schedule 13.05.2011
comment
Да.. Това беше. Реших, че пропускам нещо просто. Видях това в съобщението за грешка и се кълна, че опитах, но предполагам, че не. Благодаря. - person compcentral; 14.05.2011

Едноредов:

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

Кредити за Роби Тендиан

person MrCalvin    schedule 06.03.2018
comment
или по-кратко: ServicePointManager.ServerCertificateValidationCallback = Function(s, c, h, e) True - person Filip Cornelissen; 17.01.2020

Не съм сигурен, но това трябва да работи:

ServicePointManager.ServerCertificateValidationCallback = _
      New RemoteCertificateValidationCallback(AddressOf AcceptAllCertifications)

http://msdn.microsoft.com/de-de/library/system.net.security.remotecertificatevalidationcallback%28VS.90%29.aspx

person Tim Schmelter    schedule 13.05.2011
comment
@compcentral: Сигурен ли си, че и двете са правилни? Изглежда, че са малко по-различни. - person Tim Schmelter; 14.05.2011
comment
Моят синтаксис беше въведен от VB.Net 2005 (като C#) - person SLaks; 14.05.2011

Всички отговори тук сляпо приемат всеки сертификат. Това е пропуск в сигурността.

При прилагането на 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

За X509Certificate.GetCertHashString претоварване, което отнема HashAlgorithmName.SHA256, имате нужда от .NET 4.8. В по-стари версии използвайте параметъра -less overload, който връща SHA-1 хеш.


Въз основа на Безопасно ли е да тествате свойството X509Certificate.Thumbprint, когато знаете, че невалиден сертификат е безопасен?

За C# версията на кода вижте FtpWebRequest Отдалеченият сертификат е невалиден според процедурата за валидиране.

person Martin Prikryl    schedule 10.03.2021

Във VB.Net,

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls

решава проблема с по-малко сигурните приложения.

person vidhya    schedule 07.07.2016