2 回答

TA貢獻1862條經驗 獲得超7個贊
我答應提供我的例子,它來了?;旧衔业慕鉀Q方案建立了一個到遠程服務器的 ssh 隧道并通過這個隧道查詢遠程數據庫。ssh 隧道是解決方案的一部分。
我必須做的第一件事是將 PuTTY .ppk 私鑰文件轉換為有效的 OpenSSH .pem 密鑰文件。這可以使用 PuTTYgen 中的導出功能輕松完成。因為我想支持密碼加密的私鑰,所以我還需要一個函數來解密密鑰并將其從解密的原始格式重新格式化為 golang.org/x/crypto/ssh/ParsePrivateKey 接受的有效格式,這是獲取用于身份驗證的簽名者列表。
解決方案本身由包含在兩個文件中的包組成。應用程序的主要部分在 main.go 中完成,其中包含所有相關的數據分配以及與數據庫查詢相關的代碼。與 ssh 隧道和密鑰處理相關的所有內容都包含在 sshTunnel.go 中。
該解決方案不提供安全密碼存儲的機制,也不要求輸入密碼。密碼在代碼中提供。但是,實現密碼請求的回調方法并不會太復雜。
請注意:從性能角度來看,這不是一個理想的解決方案。它還缺乏適當的錯誤處理。我已經提供了這個例子。
該示例是一個經過測試且有效的示例。我在 Windows 8.1 PC 上開發并使用了它。數據庫服務器位于遠程 Linux 系統上。您需要更改的只是 main.go 中的數據和查詢部分。

TA貢獻1828條經驗 獲得超13個贊
好吧,我認為你可以做到“全圍棋”。
SSH 部分和端口轉發
我喜歡的東西就這樣(我沒有谷歌更好的例子)。
請注意此代碼的兩個問題:
它實際上并不正確:它在接受客戶端連接之前連接到遠程套接字 ,而它應該相反:接受客戶端連接到端口轉發的本地套接字,然后使用活動的 SSH 會話連接到遠程套接字,如果成功, 生成兩個 goroutines 以在這兩個套接字之間鏟除數據。
在配置 SSH 客戶端時,它出于未知原因明確允許基于密碼的身份驗證。您不需要這個,因為您使用的是基于公鑰的身份驗證。
一個可能會絆倒您的障礙是管理對您的 SSH 密鑰的訪問。它的問題在于一個好的密鑰應該受密碼保護。
你說密鑰的密碼“存儲在價值中”,老實說,我不知道“價值”是什么。
在我使用的系統上,SSH 客戶端要么要求輸入密碼來解密密鑰,要么使用所謂的“SSH 代理”:
在基于 Linux 的系統上,它通常是
ssh-agent
在后臺工作的 OpenSSH二進制文件,它通過 Unix 域套接字訪問,并通過檢查名為SSH_AUTH_SOCK
.在 Windows 上,我使用 PuTTY,它有自己的代理
pageant.exe
. 我不知道 PuTTY SSH 客戶端使用哪種方式來定位它。
要訪問 OpenSSH 代理,golang.org/x/crypto/ssh
提供agent
可用于定位代理并與之通信的子包。如果您需要從 獲取密鑰pageant
,恐怕您需要弄清楚使用什么協議并實現它。
MySQL部分
下一步是將其與go-sql-driver
.
我會以最簡單的方式開始:
當您的 SSH 端口轉發工作時,讓它在本地主機上的隨機端口上偵聽傳入連接。當連接打開時,從返回的連接對象中獲取端口。
使用該端口號構建連接字符串以傳遞給
sql.DB
您將創建以使用的實例go-sql-driver
。
然后驅動程序將連接到您的端口轉發端口,您的 SSH 層將完成剩下的工作。
在您完成這項工作后,我將探討您選擇的驅動程序是否允許進行一些更細粒度的調整,例如允許您直接將一個io.ReadWriter
(打開的套接字)的實例傳遞給它,以便您可以完全跳過端口轉發設置和只需生成通過 SSH 轉發的新 TCP 連接,即跳過“本地偵聽”步驟。
- 2 回答
- 0 關注
- 282 瀏覽
添加回答
舉報