Avatar billede SommerFyr Seniormester
10. juli 2024 - 17:34 Der er 12 kommentarer

Proxy server..

Hej jeg er ved at prøve at lave en proxy server..
men jeg kan ikke få ssl del til at virker og er lidt usikker på hvordan jeg skal løse denne opgave..

Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Security.Cryptography.X509Certificates
Imports System.Net.Security
Imports System.Threading
Module ProxyServer
    ' Liste over godkendte websteder
    Private approvedWebsites As List(Of String) = New List(Of String) From {
        "anotherexample.com"
    }

    Sub Main()
        ' Start listening for incoming connection requests
        Dim listener As New TcpListener(IPAddress.Any, 8080)
        listener.Start()
        Console.WriteLine("Proxy server started on port 8080...")

        While True
            ' Accept incoming client connection
            Dim client As TcpClient = listener.AcceptTcpClient()
            Dim thread As New Thread(Sub() HandleClient(client))
            thread.Start()
        End While
    End Sub

    Private Sub HandleClient(ByVal client As TcpClient)
        Try
            ' Get the client stream
            Dim clientStream As NetworkStream = client.GetStream()
            Dim reader As New StreamReader(clientStream)
            Dim writer As New StreamWriter(clientStream)

            ' Read the request line
            Dim requestLine As String = reader.ReadLine()
            Dim requestParts As String() = requestLine.Split(" "c)
            Dim method As String = requestParts(0)
            Dim url As String = requestParts(1)
            Dim version As String = requestParts(2)

            ' Parse the URL
            Dim uri As New Uri(url)
            Dim host As String = uri.Host

            ' Check if the host is approved
            If Not IsApprovedWebsite(host) Then
                ' Send blocking page
                SendBlockingPage(writer)
                client.Close()
                Return
            End If

            Dim port As Integer = If(uri.Scheme = "https", 443, 80)

            ' Establish a connection to the target server
            Dim targetClient As New TcpClient(host, port)
            Dim targetStream As NetworkStream = targetClient.GetStream()
            Dim targetStream2

            ' Handle SSL/TLS if needed
            If uri.Scheme = "https" Then
                Dim sslStream As New SslStream(targetStream, False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)
                sslStream.AuthenticateAsClient(host)
                targetStream2 = sslStream
            End If

            ' Forward the request to the target server
            Dim targetWriter As New StreamWriter(targetStream)
            targetWriter.WriteLine(requestLine)
            While True
                Dim headerLine As String = reader.ReadLine()
                If String.IsNullOrEmpty(headerLine) Then
                    Exit While
                End If
                targetWriter.WriteLine(headerLine)
            End While
            targetWriter.WriteLine()
            targetWriter.Flush()

            ' Forward the response to the client
            Dim targetReader As New StreamReader(targetStream)
            While True
                Dim responseLine As String = targetReader.ReadLine()
                If responseLine Is Nothing Then
                    Exit While
                End If
                writer.WriteLine(responseLine)
                writer.Flush()
            End While

            ' Close the connections
            client.Close()
            targetClient.Close()
        Catch ex As Exception
            Console.WriteLine("Error: " & ex.Message)
        End Try
    End Sub

    ' Check if the website is approved
    Private Function IsApprovedWebsite(ByVal host As String) As Boolean
        Return approvedWebsites.Contains(host.ToLower())
    End Function

      ' Send a blocking page to the client
    Private Sub SendBlockingPage(ByVal writer As StreamWriter)
        writer.WriteLine("HTTP/1.1 403 Forbidden")
        writer.WriteLine("Content-Type: text/html;charset=UTF-8")
        writer.WriteLine("Connection: close")
        writer.WriteLine()
        writer.WriteLine("<html><head><title>403 Forbidden</title></head>")
        writer.WriteLine("<body><h1>Access Denied</h1>")
        writer.WriteLine("<p>You do not have permission to access this site.</p>")
        writer.WriteLine("</body></html>")
        writer.Flush()
    End Sub

    ' The following method is invoked by the RemoteCertificateValidationCallback delegate.
    Public Function ValidateServerCertificate(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) As Boolean
        ' Implement your own certificate validation logic here
        Return True
    End Function


End Module

få fejl i denne

' Handle SSL/TLS if needed
            If uri.Scheme = "https" Then
                Dim sslStream As New SslStream(targetStream, False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)
                sslStream.AuthenticateAsClient(host)
                targetStream = sslStream <-- her..
            End If



lige pt kan jeg kun få ikke http sider til at køre..
Avatar billede arne_v Ekspert
10. juli 2024 - 20:13 #1
Hvilken fejl?

Og hvorfor ikke bare wrappe en StreamWriter direkte omkring sslstream?
Avatar billede SommerFyr Seniormester
10. juli 2024 - 20:29 #3
jeg fik denne kode, og kan ikke helt lure hvorfor den ikke kan lide ssl site. den brokker sig

' Establish a connection to the target server
            Dim targetClient As New TcpClient(host, port)
            Dim targetStream As NetworkStream = targetClient.GetStream()

            ' Handle SSL/TLS if needed
            If uri.Scheme = "https" Then
                Dim sslStream As New SslStream(targetStream, False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing)
                sslStream.AuthenticateAsClient(host)
                targetStream = sslStream <-- brokker den sig
            End If

første trode jeg at det var fordi targetStream bliv brugt og ikke matce så oprette jeg dim targetStream2 og rette den men bliv ikke klover..

har du et bud på fejl eller nåde af din kode der kan bruge for jeg kan ikke helt se hvordan din kode skulle hjælpe her..
Avatar billede arne_v Ekspert
10. juli 2024 - 20:39 #4
Hvad er den præcise fejlmeddelse?
Avatar billede SommerFyr Seniormester
10. juli 2024 - 21:02 #5
Value of type sslStream cannot be converted to NetworkStream
Avatar billede SommerFyr Seniormester
10. juli 2024 - 21:05 #6
Value of type 'SslStream' cannot be converted to 'NetworkStream'.
Avatar billede arne_v Ekspert
11. juli 2024 - 01:49 #7
Ja.

SslStream arver fra Stream og NetworkStream arver fra Stream, men SslStream arver ikke fra NetworkStream.

Det pæneste er nok at bruge din sslStream direkte til StreamWriter og StreamReader.

Hurtigste workariund må være at ændre:

Dim targetStream As NetworkStream = ...

til:

Dim targetStream As Stream = ...
Avatar billede SommerFyr Seniormester
11. juli 2024 - 09:50 #8
Ja nu brokker den sige ikke, men det virker heller ikke. kan ikke besøge sider med ssl
Avatar billede arne_v Ekspert
11. juli 2024 - 15:27 #9
Er der nogen fejlmeddelelser?
Avatar billede SommerFyr Seniormester
11. juli 2024 - 15:45 #10
Nej igen fejl beskeder. men den kan ikke lide når jeg besøger en https side.. som siger den bare som om side er nede.. men selve programmer kommer ikke med fejl
Avatar billede arne_v Ekspert
12. juli 2024 - 03:59 #11
Du må sætte noget debug output ind så vi kan følge hvad der sker.
Avatar billede SommerFyr Seniormester
12. juli 2024 - 14:34 #12
Jeg har prøve i går at sætte flere Console.WriteLine uden jeg fik data fra den
dog kun brokker den sige med denne
Ugyldig URI: Skemaet for URI'en er ikke gyldigt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester