Spring WebSocket: рукопожатие не выполнено из-за недопустимого заголовка обновления: пусто

Я использую wss (защищенные веб-сокеты) с пружиной из бэкэнда и STOMP для клиента JavaScript.

Кто-нибудь знает, почему получить:

Handshake failed due to invalid Upgrade header: null

6 ответов

Я встретил ту же проблему с прокси-сервером nginx для Tomcat. Это потому, что я не поддерживаю запрос wss. Для поддержки запроса wss я использую конфигурацию, как показано ниже:

# WebSocketSecure SSL Endpoint
#
# The proxy is also an SSL endpoint for WSS and HTTPS connections.
# So the clients can use wss:// connections 
# (e.g. from pages served via HTTPS) which work better with broken 
# proxy servers, etc.

server {
    listen 443;

    # host name to respond to
    server_name ws.example.com;

    # your SSL configuration
    ssl on;
    ssl_certificate /etc/ssl/localcerts/ws.example.com.bundle.crt;
    ssl_certificate_key /etc/ssl/localcerts/ws.example.com.key;

    location / {
        # switch off logging
        access_log off;

        # redirect all HTTP traffic to localhost:8080
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # WebSocket support (nginx 1.4)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Следующее решение работает для меня

<VirtualHost _default_:443>
    
    ServerName my.app
    ServerAdmin admin@my.app
    DocumentRoot /var/www/html
    SSLCertificateFile ...
    SSLCertificateKeyFile ...
    SSLCertificateChainFile ...
    
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade}^websocket$ [NC,OR]
    RewriteCond %{HTTP:Connection}^upgrade$ [NC]
    RewriteRule .* wss:/127.0.0.1:8081%{REQUEST_URI} [P,QSA,L]
    RewriteCond %{REQUEST_URI} ^/api/wsendpoint/%{var1}/%{var2}/websocket [NC,OR]

    ....
    
</VirtualHost>

Надеюсь, это поможет... Приведенное выше решение является частью следующей ссылки:https://forum.mattermost.org/t/solved-apache2-reverseproxy-with-websocket-https/437/3

Наконец-то я нашел решение.

Мне пришлось открыть порт HTTPS в Tomcat для обработки запросов WSS.

этот пост кажется закрытым, но я не нашел здесь точного решения, поэтому опубликую его для будущих нужд

Я решил с конфигурацией обратного прокси (в моем случае apache httpd)

сначала вам нужно включить некоторые моды в httpd.conf

      LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule rewrite_module modules/mod_rewrite.so

затем войдите в конфигурацию вашего виртуального хоста и используйте эти правила

      RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) "ws://[YOUR_URL]:[YOUR_PORT]/$1" [P,L]

очевидно, замените [YOUR_URL] и [YOUT_PORT] реальным URL-адресом и портом и замените "ws" на "wss", если вы используете безопасный веб-сокет.

это все!

если вы сделали правильные вещи на своем сервере, вы можете прочитать следующие заголовки

      upgrade: WebSocket
connection: Upgrade

DefaultHandshakeHandler — «Сбой рукопожатия из-за недопустимого заголовка обновления: ноль»

здесь URL должен содержать номер порта

пример: ws:// или wss://{baseUrl}:8080/ваша конечная точка веб-сокета

и используйте эти команды на сервере, чтобы включить прокси

      $ sudo a2enmod proxy
$ sudo service apache2 restart
$ sudo a2enmod proxy_wstunnel
$ sudo service apache2 restart

вы можете прочитать эту статью https://github.com/spring-projects/spring-framework/issues/16978#issuecomment-453418847

У меня было такое же сообщение об ошибке, когда я тестировал веб-сокет на Kotlin +SpringBootTest.

Ошибка говорит о том, что я забыл добавить HttpHeader с именем «Upgrade» и другие ws-заголовки.

Я использую эти заголовки, и проблема исчезла:

              val headers = HttpHeaders()
        headers["Upgrade"] = listOf("websocket")
        headers["Connection"] = listOf("Upgrade")
        headers["Sec-WebSocket-Version"] = listOf("13")
Другие вопросы по тегам