終於解決 Linux 上 VPN 連線 SSL 連線錯誤的問題

前一陣子把家裡的桌機裝上 Ubuntu, 慢慢的把一些工作環境轉移過去,但最後一塊拼圖一直卡在和醫院連線的 VPN 上,client 是裝了,但就是連不上,曾經嘗試除錯過幾次但都沒成功,這次倒是一鼓作氣的搞定了。

醫院的 VPN solution 是 Pulse Secure, 話說這家公司也奇怪,client 軟體還不隨便讓人下載,得透過一些網路上奇妙的備份,實在有點怕會不會抓下來的版本有後門,但也很難預防。

本來以為是 pulse secure 版本的問題,因為某些版本甚至連最開始的 login 畫面都出不來,一路從 5.2, 5.3, 8.2, 9.0 往上試,但都不能連線。從它的 log 檔 ($HOME/.pulse_secure/pulse/pulsesvc.log) 來看,主要的問題似乎是 SSL 連線無法建立,certificate 不能驗證

20180808015905.92949 pulsesvc[p9450.t11777] dsssl.warn ssl_init : Failed to load CA certificates (DSSSLSock.cpp:1515)
20180808015905.119615 pulsesvc[p9450.t11777] dsssl.error verify_server_cert_callback : Certificate Verification Failed : error:unable to get local issuer certificate depth:0 errorno:20 (DSSSLSock.cpp:1588)
20180808015905.119673 pulsesvc[p9450.t11777] dsssl.info log_cert_info : Subject : OU = Domain Control Validated, OU = Hosted by iSecurity Inc., OU = COMODO SSL Wildcard, CN = *.femh.org.tw (DSSSLSock.cpp:1555)
20180808015905.119733 pulsesvc[p9450.t11777] dsssl.error SSL_connect failed. Error 1 (DSSSLSock.cpp:1834)

的確在 Windows 或 Mac 上第一次連線時,也是會跳出一個,無法驗證的警告視窗,但只要按下接受,之後就都可以正常使用,但 Linux 版的卻沒有這樣的設計。

另一個有趣的現象是,如果用 browser 直接連線,是不會有憑證錯誤的問題,但如果用 OpenSSL 測試,卻也是不通過的,browser 應該是有做過一些自己的處理。

症狀:

  1. 用 browser 可以正常連線
  2. 但用 openssl 或是 curl 會出現
    verify error:num=20:unable to get local issuer certificate
    Verify return code: 21 (unable to verify the first certificate)
    

查了一下,主要應該是因為 server 端的 Certificate chain bundle 沒有做好,所以最根本的解法應該是從 server 端下手,但資訊室⋯⋯我還是自己想辦法處理算了。

在 Ubuntu 下要新增 Root 和 Intermediate CA, 要先找到 chain 連包含了那些路徑,可以從 browser 內建的憑證工具去看,以醫院用的 COMODO 為例,可以從它官方 support 下載(理論上應該也可以從 browser export 出來,但我試了卻不行,搞不清楚 🤷‍♂️)

依照我的 case, 一共要有

comodorsaaddtrustca.crt
addtrustexternalcaroot.crt
comodorsadomainvalidationsecureserverca.crt

這三個檔案。可以先把 crt 檔放在同一個目錄下,用 openssl s_client -connect host:port -CApath cert_dir 測試,如果 ok 了就可以新增到系統裡,[步驟l如下:

sudo mkdir /usr/share/ca-certificates/extra
sudo cp *.crt /usr/share/ca-certificates/extra/
sudo dpkg-reconfigure ca-certificates

跳出 GUI 設定畫面後把上面新增的全選就 ok 了,新增好後用 openssl s_client -connect host:port 連線就會出現

Verify return code: 0 (ok)

Pulse Secure 也可以正常連線了。

總算讓大部份的工作可以轉移到 Linux 桌面系統上來進行。