2018年3月20日 星期二

如何幫 ProfitTrailer 自動交易機器人安裝 SSL 憑證並啟用加密通訊

ProfitTrailer 是一款用於進行加密貨幣買賣的自動交易機器人,也就是俗稱的 BOT

由於採用了 node.js 的架構,因此 ProfitTrailer 可以在 Windows、MacOS 和 Linux 等系統上運作,應該說只要是支援 node.js 套件的系統都可以運行,而且它可以透過網路瀏覽器來作 GUI 層面的操作,降低在終端機上誤操作的機率

由於你要運作 ProfitTrailer 就需要讓電腦不關機,除了把它裝在迷你電腦或是樹莓派等開發板上,把它安裝在網路上的虛擬主機也是可以的,而且相較於運作在開發板上,效能瓶頸比較沒那麼嚴重,我也是選擇把 ProfitTrailer 安裝在 Google Cloud Platform 上的執行單元

而如何在 Google Cloud Platform 上安裝 ProfitTrailer?可以參考這篇文章,我就不贅述了


2018_03_20_224412
運行在 Google Cloud Platform 上的 ProfitTrailer,可以透過網頁操作

但如果運行在 Google Cloud Platform 之類的主機上,然後透過網路去存取,則會碰到資安上的問題,雖然透過 ProfitTrailer 或是交易所的 API 是無法進行轉帳與領現的,但如果你的 ProfitTrailer 有開啟 HotConfig 可以透過網頁修改策略檔案,被入侵的話也是會有所損失,比如惡意調整你的策略讓你虧損,或是直接幫你按下停機鈕把 ProfitTrailer 關閉

而 ProfitTrailer 有提供 SSL 加密通訊的功能,可以將網路介面的部分加密,這篇文章就是教你如何去幫 ProfitTrailer 綁定 HTTPS 通訊

首先,請買一個網域,然後把 DNS 指向 CloudFlare,這很重要

透過 CloudFlare 的 CDN 與防護,可以把運作 ProfitTrailer 主機的真實 IP 位址隱藏在 CDN 後方,當然用誤試法去掃描全網路的 IP 總有一天會碰到,但如果單純用 WHOIS Lookup 跟查閱網域資料,是可以隱藏起來,避免大部分的好事之徒

當然,也是方便我們去簽署 SSL 憑證


2018_03_19_214931
在 CloudFlare 的後台把網域填入之後,要到你購買網域的地方把 DNS 指定為 CloudFlare 的 DNS

要幫 ProfitTrailer 加上 SSL 加密通訊有點複雜,如果照著 ProfitTrailer Wiki - Setup SSL 去弄有很高的機率會搞砸,畢竟不是人人都會在終端機上面安裝 Let's Encrypt 的自動 SSL 憑證簽署模組,此外還有一個問題點

ProfitTrailer 使用的網路介面是基於 Apache Tomcat,簡單說就是建立在極度簡化的前提下,給 Java 程式使用的 HTTP daemon,這也是為何 ProfitTrailer 只支援 PKCS12 這種整合性的金鑰檔,所以在安裝 Let's Encrypt 的模組後,當你好不容易搞定而且生成的 PEM 格式的金鑰檔,還要再把 PEM 格式的金鑰轉換成 PKCS12 加密的 P12 金鑰檔,然後去 ProfitTrailer 的設定檔調整參數才可以

所以我們用簡單點又粗暴的方法來完成簽署 SSL 憑證,透過 SSL For Free 這個網站,就可以直接申請 Let's Encryp 的 SSL 憑證,之後生成加密 P12 金鑰檔步驟就可以更簡單的完成


2018_03_20_003148
前往 SSL For Free 去簽署 SSL 憑證,把你要給 ProfitTrailer 使用的網域填入
2018_03_20_003224
由於 ProfitTrailer 沒辦法去修改網頁端輸出,因此透過最右邊的 Manual Verification (DNS) 去完成
2018_03_20_003232
由於 DNS 支援 TXT Records 這種操作,因此可以用這種方法認證網域的所有權
2018_03_20_003241
按下 Manual Verify Domaon 後,你會看到這個畫面,注意那兩個驗證位址

這時請打開你的 CloudFlare CDN 控制台,前往你的網域,在 DNS 這個項目下,選擇 TXT 這個類型,在 Name 與 Value 那邊依序填入 SSL For Free 要求的網域名稱跟字串,TTL 設定成預設值的自動就好,再按 Add Record

沒意外的話,完成操作後,當你點擊 SSL For Free 產生的網址時,就會看到相應的字串紀錄


2018_03_20_003938
先在 Name 填入 _acme-challenge
2018_03_20_003953
然後在 TXT content 填入相應的亂數字串
2018_03_20_010750
應該要像是這樣
2018_03_20_004210
回到 SSL For Free,點擊 Download SSL Certificate,你會看到這個畫面,這是在驗證中
2018_03_20_004229
沒意外的話,就會看到這個畫面,屬於那個網域的 Certificate、Private Key 與 CA Bundle 都會出現
2018_03_20_004238
由於安全性的關係,上面的圖都把字串的部分遮蔽

看到 Certificate、Private Key 與 CA Bundle 生成後,你可以點選 Download SSL Certificate Files,或是開啟你熟悉的編輯器,然後分別存成三個 PEM 格式的金鑰檔案

然後,請妥善保管你的金鑰檔案,特別是 Private Key,因為有了 Private Key 就可以製作網站 SSL 憑證

接著請開啟 FTP 軟體,把這三個金鑰檔案丟到虛擬主機上


2018_03_20_010903
我在使用者的個人目錄裡面創建了一個 ssl 資料夾,專門存放這些檔案

接下來請開啟你的終端機,先切到 root 權限,Google Cloud Platform 的話就是輸入 sudo su,接下來請使用 cd 指令切換到你剛剛上傳金鑰檔案的資料夾,然後輸入這個指令
openssl pkcs12 -export -in CA.pem -out crt.p12 -inkey PK.pem -CAfile CAB.pem -caname root -name tomcat 

把 CA.pem 替換成你儲存 Certificate 的金鑰檔案名稱,PK.pem 替換成你儲存 Private Key 的金鑰檔案名稱,CAB.pem 替換成你儲存 CA Bundle 的金鑰檔案名稱,其餘指令都是照舊,接著會要你輸入一個密碼,如果很懶、而且你的 ProfitTrailer 登入密碼是長度超過二十字元的強密碼,那也是可以用一樣的密碼啦

沒意外的話,這個指令就會生成一個名稱為 crt、副檔名為 p12 的 P12 金鑰檔,記下那個檔案的位置,沒亂跑的話,它會乖乖待在那個你剛剛上傳的資料夾,然後再用 cd 指令切換到你安裝 ProfitTrailer 的資料夾,編輯 application.properties 這個系統參數檔(我是用 Vim 這個編輯器),加入這些參數在 server.port 後面,當然 server.port 也要調整,建議調成 443
server.port = 443
security.require-ssl = ture
server.ssl.key-store: /home/user/ssl/crt.p12
server.ssl.key-store-password: p12password
server.ssl.key-password: p12password
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat

/home/user/ssl/crt.p12 替換成你存放 crt.p12 的目錄位置(要包含 crt.p12 檔案),p12password 替換成生成 P12 金鑰檔時填寫的密碼,然後存檔離開,沒意外的話,重開 ProfitTrailer 然後等一會,你應該就可以正常訪問 ProfitTrailer 的登入畫面了

在 CloudFlare CDN 控制台,前往你的網域,在 Crypto 這個項目下,把 SSL 的等級調整成 Full 或是 Full (strict),並開啟 Always use HTTPS,則 CloudFlare 會驗證你的 P12 金鑰檔是否正確,如果有異常的話,通常會出現 Error 525 SSL handshake failed 來提醒你 P12 金鑰檔可能過期或是你簽爛了


2018_03_20_011511
你的 application.properties 看起來應該是這樣
2018_03_20_011705
重開 ProfitTrailer 然後等一會,你應該就可以透過 HTTPS 正常訪問 ProfitTrailer 的登入畫面

最後注意一點,Let's Encrypt 的 SSL 憑證預設期限是九十天,而 SSL For Free 會在 SSL 憑證過期前兩週發信提醒你要更新,就照前面的程序,去 SSL For Free 更新 DNS TXT Records 後拿取更新的 SSL 憑證,然後一樣透過那個 openssl 指令生成新的 P12 金鑰檔去替換掉舊的金鑰檔就好

如果你覺得這篇有所幫助,也可以給我一點贊助

Bitcoin | 1FcBQGbpgHjkh7C3zK8asQyMauK5Lm3Dh2
Ethereum | 0x6071cc4ca777862b934046acae5e840d1944a60d

沒有留言:

張貼留言