Mi è capitato di dover scaricare dei file da un sito WEB, verificando che la fonte sia corretta. Essendo per uso interno aziendale, ho pensato di creare un certificato auto-firmato e controllare se la firma è corretta.

Cercando in rete sono riuscito a fare questo codice in VB.NET:

Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate _
 , ByVal chain As X509Chain, ByVal sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
   'Controlla che il certificato sia esattamente quello riportato come risorsa del programma "cert"
   If certificate.GetRawCertDataString() = New X509Certificate(My.Resources.cert).GetRawCertDataString() Then
     Return True
   End If
   Return False
 End Function

Private Function fncRequest(ByVal strURL As String) As String
  'Connessiona al server per il download dei dati...
  Dim request As HttpWebRequest
  Dim response As HttpWebResponse
  Dim encoding As New System.Text.ASCIIEncoding()
  'Seguenza con controllo errori
  Try
    'Crea l'oggeto per la richiesta
    request = CType(WebRequest.Create(strURL), HttpWebRequest)

    'Passa oggetto per verifica la validità del certificato
    ServicePointManager.ServerCertificateValidationCallback = _
      New Net.Security.RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)

    'Apre la connessione al server
    response = CType(request.GetResponse(), HttpWebResponse)
    If response.StatusCode = HttpStatusCode.OK Then
      Dim sBuild As System.Text.StringBuilder = New System.Text.StringBuilder

      ' Lancia la richiesta HTTP, la pagina desiderata
      Dim ReceiveStream As Stream = response.GetResponseStream()
      Dim read(256) As [Byte]

      ' Legge la risposta tramite un buffer di 256 byte
      Dim count As Integer = ReceiveStream.Read(read, 0, 256)
      'Ricezione del file
      While count > 0
        sBuild.Append(encoding.GetString(read, 0, count))
        'Legge i prossimi dati
        count = ReceiveStream.Read(read, 0, 256)
      End While
      ' Chiude la risorsa usata per ricevere i dati della pagina
      ReceiveStream.Close()
      ' Chiude la risorsa usata per archiviare la risposta
      response.Close()
      'Ritorna la risposta ottenuta
      Return sBuild.ToString()
    Else
      'Nessuna risposta
      Return Nothing
    End If
  Catch exc As Exception
    'Errore nella procedura, indirizzo non valido o certificato non accettato
    Return Nothing
  End Try
End Function