排查MQTT協定SSL/TLS憑證的問題

最近在轉移heroku上的玩具,發現後端對接的模組沒回應,原來遭遇mqtts憑證過期的問題。但是mqtts沒辦法用瀏覽器開啟取得server的憑證,那究竟要怎麼取得憑證呢?

我們可以透過openssl的s_client工具來協助

openssl s_client -showcerts -connect {domain name}:{port} </dev/null

{domain name}:{port}的部份因為s_client不支援http://這種URL前綴,所以就得自己分port

  • http協定port是80
  • https協定port是443
  • mqtt協定port是1883
  • mqtts協定是8883

最後的 < /dev/null沒有加上的話,指令會卡著不結束;按下Ctrl+D讓它自然停止,或是按下Ctrl+C讓它強制停止。

2023-04-14 備註: 如果你的機器上沒有/dev/null裝置,可以使用下替代指令

echo -n | openssl s_client -showcerts -connect {domain nmae}:{port}


s_client會顯示溝通的流程和最後驗證的結果,若不想看這麼多訊息,你可以將它導到檔案參考下面"匯出成.cert檔案"部份

然後我就看到憑證錯誤的部份是NotBefore和NotAfter所寫的時間,兩個竟然是一樣的阿!

   v:NotBefore: Aug 16 03:43:27 2021 GMT; NotAfter: Aug 16 03:43:27 2022 GMT

SNI需使用的參數

如果遠端server有使用SNI(一個IP有多個domain),則要多加 -servername {domain nmae}


匯出成.cert檔案

如果是想用ubuntu內建憑證工具來看,就接上openssl x509 -text

openssl s_client -showcerts -connect {domain nmae}:{port} </dev/null  | openssl x509 -text  > server.cert


2023-04-14 備註:上面這個cert檔案在我的新環境下有點不太一樣

留言