因爲衆所周知的緣由,golang.org 沒法直接訪問,golang 文檔和安裝包沒法下載,golang.org/x/net 等官方包沒法下載。linux
常看法決方案是無腦掛代理,解決一切問題,但爲了以最小成本解決,我折騰出了這種方法,徹底本機運行,無需外部代理和額外的服務器。是否是很爽?nginx
其實有官方鏡像能夠用:git
在本機自建 https 透明代理服務,經過 hosts 把 golang.org 解析到本機,代理服務再去請求鏡像站。程序員
這裏就有另外一個須要解決的問題,如 golang.org/x/net
包,通過透明代理後,實際訪問的網址是 https://golang.google.cn/x/net
。雖然這個網址直接打開沒問題,但並不能經過 go get
拉取到包。緣由能夠看網頁源碼,裏面其實記錄了一個跳轉網址,告訴 go get
工具,應該到 https://go.googlesource.com/net
拉取源碼。很不幸,go.googlesource.com
也沒法訪問,但能夠用官方 github 鏡像代替:https://github.com/golang/net
。github
這個教程已經遍地都是了,我這裏就直接上代碼了。因爲個人電腦系統是 win10,這些命令實際上是在 wsl 中執行的。golang
# 建立工做目錄 mkdir ~/ssl cd ~/ssl # CA 證書 openssl genrsa -des3 -out ca.key 2048 openssl req -sha256 -new -x509 -days 365 -key ca.key -out ca.crt \ -subj "/C=CN/ST=HN/L=XC/O=wzv5/OU=wzv5/CN=wzv5Root" # 這裏會提示輸入密碼,記好密碼,以後要用 # 要製做的證書名字及 DNS export KEYNAME=golang export DNSNAME="DNS:golang.org,DNS:go.googlesource.com" # 建立 https 證書 openssl genrsa -des3 -out $KEYNAME.key 2048 # 這裏會提示輸入密碼,隨便輸一個 openssl rsa -in $KEYNAME.key -out $KEYNAME.key # 輸入上一步的密碼,這行命令實際上是用來清除密碼的 openssl req -new \ -sha256 \ -key $KEYNAME.key \ -out $KEYNAME.csr \ -subj "/C=CN/ST=HN/L=XC/O=wzv5/OU=wzv5/CN=$KEYNAME" openssl x509 -req \ -days 365 -sha256 \ -CA ca.crt \ -CAkey ca.key \ -in $KEYNAME.csr \ -out $KEYNAME.crt \ -extensions SAN \ -extfile <(printf "[SAN]\nsubjectAltName=$DNSNAME") # 這裏會要求輸入 CA 證書的密碼
咱們只須要 .crt 和 .key 文件,前者是公鑰,後者是私鑰。緩存
CA 證書的密碼要記好,以後若是須要其餘域名的證書,能夠重複使用 CA 證書。安全
其實最初我是想用 nginx,配置文件都寫一半了,忽然意識到這算不算大炮打蚊子呢,這麼簡單一個需求,至於上 nginx 麼,找個簡單易用的工具湊合得了,因而就換成了 caddy。bash
caddy 是 go 語言寫的 http 服務器,很是易用,也符合本文的 go 生態,用 go 解決 go 中遇到的問題,多麼和諧。服務器
從 https://github.com/mholt/caddy/releases/latest 下載 caddy,只須要壓縮包內的可執行文件,其餘文件無視。
仍然以 win10 的 wsl 做爲運行環境來舉例。把解壓出來的 caddy 可執行文件放到 PATH 路徑中,如 /usr/local/bin/caddy
。建立目錄 /usr/local/etc/caddy/ssl
,把上面建立的 golang.crt
和 golang.key
文件放進來。建立文件 /usr/local/etc/caddy/Caddyfile
,寫入如下內容:
https://golang.org { tls /usr/local/etc/caddy/ssl/golang.crt /usr/local/etc/caddy/ssl/golang.key proxy / https://golang.google.cn/ } https://go.googlesource.com { tls /usr/local/etc/caddy/ssl/golang.crt /usr/local/etc/caddy/ssl/golang.key proxy / https://github.com/golang/ }
caddy 的配置文件格式是否是很是簡潔?想一想 nginx 要寫多少。。
最後啓動 caddy。
caddy -conf /usr/local/etc/caddy/Caddyfile
因爲不一樣的系統方法不同,這裏就拿我使用的 win10 系統舉例。
雙擊 ca.crt
文件,系統會彈出證書信息界面,選擇「安裝證書」,安裝到「當前用戶」的「受信任的根證書頒發機構」。
對於 linux 系統,能夠本身查閱 man update-ca-trust
,文檔也很詳細。
網絡上鋪天蓋地全是設置 http.sslVerify = false
,可是切記,不到萬不得已千萬不要這麼幹,證書鏈是網絡安全的基礎,禁用證書校驗是很是危險的行爲。而且做爲程序員,你得爲你的用戶負責,確保本身的開發環境是安全的。
這裏我選擇爲 git 設置自定義的 CA 證書列表,也就是 http.sslCAInfo
。
首先從 https://curl.haxx.se/ca/cacert.pem 下載默認證書,用文本編輯器打開 cacert.pem
,把上面咱們本身建立的 ca.crt
文件的內容追加到末尾,保存退出,就獲得了一個包含默認 CA 和咱們自籤 CA 的證書包文件。
修改 git 設置:
git config --global http.sslcainfo <改爲你本身的路徑>/cacert.pem
若是不想這麼麻煩,還有一種方法,就是爲指定的域名禁用證書校驗。
直接編輯文件 $HOME/.gitconfig
,寫入如下內容:
[http "https://go.googlesource.com"] sslverify = false
也就是隻對 go.googlesource.com
域名禁用證書驗證。
127.0.0.1 golang.org 127.0.0.1 go.googlesource.com
因爲 DNS 緩存,或許你須要重啓才能生效。
go get -u -v golang.org/x/net go get -u -v github.com/gin-gonic/gin
不出意外,上述命令可以在國內網絡中正常運行,只不過速度可能有點慢,畢竟 github 在國內的訪問並不穩定。
我在實際使用中,實際上是把 caddy 開機啓動了,這樣電腦一啓動就是直接可用的狀態。同時,caddy 還兼顧修復 steam 社區的做用,具體方法就不說了,省得被封嘍,原理都差很少,就是把不能訪問的域名解析到本機,而後找到某種能夠直接訪問的方式,寫到 caddy 配置文件中。