openssl wss return 426 Upgrade header



  • Servus zusammen,

    Ich schreibe gerade einen websocket/http Client und stehe vor einem Problem was nicht direkt mit dem Programmieren zu tun hat eher mit dem Verständnis. Ich hoffe dies ist hier der richtige Platz dafür.

    Ich verbinde den Client mit einem socks5 Proxy und richte diesen auf den websocket Zielhost:80 ein und sende den Handshake und alles läuft problemlos. Versuche ich jedoch den Zugriff via websocket Zielhost:433 bekomme ich die Rückmeldung:

    HTTP/1.1 426 Upgrade header MUST be provided
    Server: nginx/1.18.0 (Ubuntu)
    Date: Sun, 16 Jan 2022 12:06:09 GMT
    Transfer-Encoding: chunked
    Connection: keep-alive
    Sec-WebSocket-Version: 13
    X-Powered-By: Ratchet/0.4.1
    

    Ich habe diesen Request genutzt mit und ohne ssl (ws/wss):

    GET wss://demo.piesocket.com/v3/channel_1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwm&notify_self HTTP/1.1
    Host: demo.piesocket.com
    Pragma: no-cache
    Cache-Control: no-cache
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
    Upgrade: websocket
    Connection: upgrade
    Origin: https://www.piesocket.com
    Sec-WebSocket-Version: 13
    Accept-Encoding: gzip, deflate, br
    Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
    Sec-WebSocket-Key: NVJmaFhVWjZqUU9rNU5IUw==
    Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
    

    sende ich diesen Header nun ein 2. mal habe ich kurz Verbindung zum Zielhost:443 bekomme 1, 2 frame zugesandt und werde dann direkt via opcode 0x08 (close event) geschlossen.

    Ich denke nicht das es an den Settings des proxys liegt da Anfragen auf http(80/443) problemlos laufen. Ich denke eher ich muss noch ein flag bei den ssl Optionen setzen welche bei mir so aussehen:

    const SSL_METHOD* meth;
    SSL_CTX* ctx;
    SSL* ssl;
    BIO* sbio;
    		
    SSL_library_init();
    SSL_load_error_strings();
    meth = SSLv23_method();
    ctx = SSL_CTX_new(meth);
    		
    ssl = SSL_new(ctx);
    sbio = BIO_new_socket(Socket, BIO_NOCLOSE);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
    SSL_set_bio(ssl, sbio, sbio);
    		
    SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL);
    		
    SSL_connect(ssl);
    

    Ich bin für jeden Denkanstoß dankbar.

    Liebe Grüße



  • Hey Leute,

    ich habe die Lösung gefunden und berichte sie mal damit nachfolgende Leser mit dem selben Problem auch eine Lösung finden zur Richtigkeit.

    Problem war das der erste Aufruf des Handshake über den Proxy das Cert seitens des Proxy zerrissen hat. Man muss sich das Cert erneut holen damit es nicht zerrissen wird.

    Verbindung zum Proxy herstellen und einrichten mit Zielrichtung auf Zielhost:Port
    Socket lesen und prüfen ob Status 426 angeboten wird für den Wechsel des Protokolls auf rfc6455.
    Rest des Socket leer lesen und die Zeilenvorschübe(\n,\r, 0, etc) nullen bzw Ignorieren (recv kommt unaufgefordert)
    Handshake erneut senden und die Sache läuft mit dem richtigen Zertifikat

    liebe Grüße


Log in to reply