WebSocket的SSL認證失敗問題記錄

caohaoyu發表於2018-07-29

一、問題背景

線上伺服器程式使用的是swoole框架,由主程式直接監聽8008埠,然後在使用過程中概率性會出現連線失敗的情況,觀察報錯主要為

WebSocket connection to 'wss://XXX:8008/' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR

二、排查原因

在網上查詢資料的過程中也看到了類似問題的出現原因,然後進行排查,特記錄下大概率的原因,以供參考。

1.SSL證照問題(由於是概率性出現的所以暫時排除這個原因)
2.swoole是否開啟了openssl,使用SSL必須在編譯swoole時加入--enable-openssl選項(在伺服器上執行命令php --ri swoole,即可檢視是否編譯進去,驗證已編譯故排除)
3.更改完配置需要重啟程式(看到有些人在處理的時候沒有進行重啟故一直不生效,需注意)
4.程式和nginx同時監聽一個埠(伺服器沒這種情況,故排除)
5.socket程式未啟動(出現問題時觀察了下程式,程式在正常執行,故排除)

三、解決方案

通過第二點的描述可以發現並沒有找到實質的原因,但是看到網上比較常見的做法是用nginx轉發到其他埠,問了下公司其他相關服務也是使用類似處理方案,所以為了線上業務的穩定,果斷採用!

在nginx配置中增加了對8008埠的監聽,然後代理轉發到8088埠,swoole程式中改為監聽8088埠,殺掉swoole程式(不殺的話因為8008埠被佔用,nginx重啟會失敗),重啟nginx,重啟swoole程式,線上驗證,大功告成。

server {
    listen 8008;
    ssl on;
    ssl_certificate      ssl.cer;
    ssl_certificate_key  ssl.key;
    location / {
    proxy_pass https://127.0.0.1:8088;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 600;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
}
複製程式碼

四、nginx配置詳解

留坑,待更新

五、真正原因探查

目前來講,這個問題並沒有解決,只是從旁邊繞過去了,但是真正的原因還是要努力的查檢視的......

1.在swoole官網上看到有關證照的內容,說是證照格式必須為PEM,不支援DER格式的,線上伺服器之前程式是使用的DER格式的,(按理說如果是證照有問題要麼一直正常要麼一直失敗,不應該出現概率性失敗的情況),所以是否由於證照為DER格式導致概率失敗可作為一個探查方向。

WebSocket的SSL認證失敗問題記錄

相關文章