這篇文章是工作上的一點心得,要講怎麼利用 Stunnel 這個軟體,來建立兩點間的安全連線。
要建立2點間的安全通道當然有很多方式,SSH, VPN, HTTPS 都是方法,但各有優缺點。本文的場景,是要在 PC 和 嵌入式系統上建立一個安全的通道,可以做到用瀏覽器透過 HTTP 來做設定。而 HTTPS 由於需要事先佈署憑証,不然會看到另人不放心的「本網站不安全的」的警告,所以不採用。
東找西找後,發現有這種 TLS-PSK 的標準,透過兩邊輸入密碼,就可以建立安全的通道。但很遺憾的是瀏覽器都不支援,也許是Internet沒有這種需求吧。
Stunnel – SSL Tunnel 建立安全的通道
Stunnel 是一個建立安全通道的軟體,原文的說明寫的很好。「Stunnel 是設計來添加 TLS 功能的代理伺服器,它可以在現有的伺服器端與客戶端建立起安全的連線,而無需修改任何程式碼」
Stunnel is a proxy designed to add TLS encryption functionality to existing clients and servers without any changes in the programs’ code
Stunnel 是以 openssl 為基礎,支援多種平台,包含 Windows 和 Linux,因此很適合我使用的專案。
連線架構
為了讓PC和裝置間可以建立安全的 http via TLS-PSK通道,我的做法如下:
- 在Linux裝置上搭建 busybox 的 http server,但只 listen 127.0.0.1:1080 。
- 在Linux裝置上啟動 stunnel 程式,並設定成接收 ethernet 上的 port 1443,而且運行 TLS-PSK 並指定密碼。當有連線到1443 port的連線,會自動轉到 127.0.0.1:1080,也就是http server。
- 在 PC 上寫一個 Windows 程式,並讓使用者輸入要連線的目標IP與密碼。當使用者按下連線,會動態的產生一個設定檔,並啟動 Windows 的 stunnel 程式。此設定檔使的 stunnel 會接受 127.0.0.1:3180 的連線,並會連到目的端的 port 1443,並用指定的密碼來進行加密。
- 最後,Windows 程式會啟動系統預設的瀏覽器連到 127.0.0.1:3180,此動作就會觸發 stunnel 發起連線,經過幾次的 port forwarding 後,最終與裝置上的 busybox http 連線。
這邊的例子是以 http 做為連線方式,實際上沒有限制哪種服務,自己寫的 TCP 程式也是可以使用的。
Stunnel 安裝設定
下載
Stunnel 分為 Linux 上和 Windows ,基本上是一樣的東西。只是 Linux 上的要自行編譯,而 Windows 上的則有現成的程式可以下載。本文是以 5.48 版做示範,從 5.5 版開始就不提供 Windows 32bit 的版本了,這也是我選擇 5.48 的原因。官方 mirror 的網站,可以在這個英國的網站下載到,或者到我的 google drive 下載。
安裝 Linux Stunnel
本文以虛擬機的方式架設 Ubuntu 18.04 當做示範,會安裝 stunnel 和一個簡易的 web server。然後將 port 1443 的資料轉到 127.0.0.1:1080 port。stunnel 會使用 PSK 方式,並且限定加密演算法為 PSK-AES256-CBC-SHA,這是為防止中間人攻擊,騙取用戶使用較弱的加密方式(例如DES-RC4),以進行破解。
如果你是用在嵌入式系統上的話,就要再自己編個 openssl library 才可以,這點請注意了。下面是完整可以貼上的指令碼,不過還是稍微解說一下。
- 先安裝 libssl-dev,這就是 openssl 的開發版本套件。並安裝 busybox,我們會使用到裡面的簡易 web server
- 解壓縮 stunnel 後,configure 後直接make即可。
- 用 echo 的方式產生三個檔案
- /tmp/index.html : 一個簡單的測試首頁
- /tmp/conf : stunnel 的設定檔,指定連入與連出的 port, 並指定使用的加密方式,並指定使用者密碼檔
- /tmp/pass : 使用者密碼檔,格式是「帳號:密碼」。密碼至少要有20個字
- 最後啟動 stunnel 與 httpd 即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sudo apt-get install libssl-dev sudo apt-get install busybox tar zvfx stunnel-5.48.tar.gz cd stunnel-5.48 ./configure make cd src echo "<H1> Success </H1>" > /tmp/index.html echo "[https]" > /tmp/conf echo "accept = 1443" >> /tmp/conf echo "connect = 1080" >> /tmp/conf echo "ciphers = PSK" >> /tmp/conf echo "PSKsecrets = /tmp/pass" >> /tmp/conf echo "ciphers = PSK-AES256-CBC-SHA" >> /tmp/conf echo "user:12345678901234567890" > /tmp/pass killall stunnel ./stunnel /tmp/conf killall busybox busybox httpd -h /tmp -p 127.0.0.1:1080 |
安裝 Windows Stunnel
Windows 的安裝方式雖然是以 installer 來安裝,但其實只要解壓縮取得一部份的檔案就可以了。不過我們還是按照一般人懂的方式,直接點擊安裝,一直下一步就可以。中間有一步是會跳出 DOS 視窗來輸入憑証資料的,這個我們用不上,一直按 Enter 即可。
然後將下面stunnel 設定檔內容存檔在 D:\conf.txt 。裡面的內容有個 “connect” 的部份,就是剛剛安裝在 Linux 上的 server IP,這邊請自己改成你的 Linux 的IP。
1 2 3 4 5 6 |
[psk] client = yes accept = 127.0.0.1:3180 connect = 192.168.113.128:1443 PSKsecrets = d:\pass.txt ciphers = PSK-AES256-CBC-SHA |
將下面使用者帳號密碼的內容存檔在 d:\pass.txt
1 |
user:12345678901234567890 |
最後再開啟一個 DOS 視窗,執行下面命令,啟動 stunnel 程式。
1 |
"c:\Program Files (x86)\stunnel\bin\tstunnel.exe" d:\conf.txt |
應該就會看到一堆訊息,此時再打開瀏覽器開啟 http://127.0.0.1:3180,應該就可以連到 Linux 上的的網頁了。
Windows 免安裝方式
雖然剛是用安裝的方式來使用 Windows Stunnel,但其實只要將剛安裝的 c:\Program Files (x86)\stunnel\bin\ 裡的檔案,全部複製出來。移到另外一台電腦上也可以使用,並不需要用安裝的,這樣對於在部署安全連線時會比較方便。
結語
在現在這個到處講究安全的資訊時代 (但其實也沒那麼重視),建立一個安全的連線是一個很基本的需求,但其實要建立安全服務並不是那麼容易。透過 Stunnel 的方式,可以使用最通用的PSK方式(也就是手輸入密碼),就可以輕易的建立安全連線了。
可能我比較笨
我要用stunnel 連本機的HFS/一個http file server做實驗 結果失敗了
我看原來的stunnel.conf 有很多鍵值但要改
我有用本文說的conf.txt+pass.txt
過了N天
成功了 至少有轉port listen
2022.06.03 08:14:23 LOG5[main]: stunnel 5.48 on x86-pc-msvc-1500 platform
2022.06.03 08:14:23 LOG5[main]: Compiled/running with OpenSSL 1.0.2o-fips 27 Mar 2018
2022.06.03 08:14:23 LOG5[main]: Threading:WIN32 Sockets:SELECT,IPv6 TLS:ENGINE,FIPS,OCSP,PSK,SNI
2022.06.03 08:14:23 LOG5[main]: Reading configuration from file conf.txt
2022.06.03 08:14:23 LOG5[main]: UTF-8 byte order mark not detected
2022.06.03 08:14:23 LOG5[main]: FIPS mode disabled
2022.06.03 08:14:23 LOG5[main]: Configuration successful
用的是stunnel-5.48-win32-installer.exe解壓出來的一些檔
早前是用 stunnel-5.64-win64-installer.exe 64位元的
結果一直有錯誤 看它的log也看不出什麼毛線,看官網
還去找了 Win32OpenSSL_Light-3_0_3.exe 也不知是不是內建的不行,弄了半天
因為我看5.64裡面沒有 – zlib1.dll, libssl32.dll and libeay32.dll (= openssl library files)
不過 我要用OpenSSL v3.0.3丟主程式過去好像沒用 跑了log還是 好像它編譯的時候是一起的1.x 就像.conf裡面有個鍵值
; Data compression algorithm: zlib or rle
compression = zlib
也是預設值是沒有的 我有改過沒什效,不過我也不會編譯
謝謝您的回饋,我目前的應用還可以用,有需要的人可以參考您的做法。