自建ngrok服務支持https訪問
摘要:3.更換證書,重新編譯ngrok客戶端和服務端。將ngrok拷貝到客戶端上我的是mac,下載對應darwin_amd64。
前言
最近從事第三方平臺代小程序實現業務開發,很多業務交互請求需要https,本地調試開發實現不了,不可能把部署到生產服務器調試,那又很不方便。我參考網上很多教程,很多不完整,不繫統。我於是整理出完整教程當備用。
專業術語
內網穿透,又叫NAT穿透,是計算機用語,翻譯過來就是 你的電腦可以直接被你朋友訪問。 通常我們的電腦是無法自己被訪問的。因爲我們的電腦缺少自己的獨立的ip地址。現在ip稀缺,電信運營商已經不會隨便分配固定ip給個人。
通常實現內網穿透,是通過路由器上端口映射來實現的。但是路由器通常不是每個人都有權限可以訪問和設置,而且可能存在多級路由器較爲複雜的網絡結構。端口映射也無法實現。這就需要ngrok來實現了。
原理
ngrok 建立一個隧道,將主機A的http請求 傳遞給 主機B,從而實現內網穿透。
ngrok分爲client端(ngrok)和服務端(ngrokd),
32778-0c1af0a3d5798ba6.png
實際使用中的部署如下:
32778-428dc58babf925c8.png
圖中內網主機上安裝客戶端。
公網主機 安裝服務端。
client public 則代表 訪問你電腦的用戶或者朋友。
現在都雲時代,各種服務都能找到提供商。內網穿透也是如此。ngrok服務端相當麻煩,如果你只是簡單的穿透,又不是什麼敏感信息,可以找到很多 服務提供商。例如 https://ngrok.com/- 下載客戶端根據你的個人電腦系統下載匹配的客戶端。下載地址: https://ngrok.com/download
- 啓動
./ngrok http 4444
ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Session Expires 7 hours, 59 minutes Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://ada02116.ngrok.io -> localhost:4444 Forwarding https://ada02116.ngrok.io -> localhost:4444 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
如果此時訪問 http://ada02116.ngrok.io 則等於訪問了 localhost:4444
自建ngrok服務
使用別人的服務,存在一些限制。例如不穩定、安全問題,費用昂貴等。因此可能需要自己搭建ngrok服務端。
自建服務需要具備的條件:
1、具備獨立ip的服務器。例如阿里雲、騰訊雲等。 我個人使用的阿里雲ecs
2、需要域名。如果是國內則需要備案。我個人的域名是 xxxx.com
-
配置域名
增加2條A記錄,指向你的服務器。這裏我配置的是 ngrok.xxxx.com 和 *.ngrok.xxxx.com
32778-2de852c725e147ef.png
-
添加安全組。
開放3個端口。這裏我選擇4443、4444、8081端口。
其中4443是ngrok自身通信使用。
4444 後面tcp端口轉發使用。
8081 則是http請求轉發使用。默認是80 但是這裏80端口我分配給nginx了。
截圖中少截圖了4444的配置。
32778-c5be55abf8d86869.png
-
安裝go(阿里雲ESC服務器)
第一次照着其他教程直接apt-get install golang安裝go語言環境,結果編譯的時候報錯,最終使用go 1.8版本順利通過。
- 下載go安裝包並解包
wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz tar -zxvf go1.8.linux-amd64.tar.gz
- 配置環境變量
sudo vim /etc/profile # 添加以下內容 export GOROOT=/usr/local/go # 注意此處爲解壓後文件夾的路徑 export GOPATH=$GOROOT/bin export PATH=$PATH:$GOPATH
- 使其生效
source /etc/profile
- 查看go版本
go version
-
安裝ngrok(阿里雲ESC服務器)
- 下載安裝包並解壓
wget htps://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/ngrok.tar.gz tar zxvf ngrok.tar.gz cd ngrok
- 生成簽名證書
export NGROK_DOMAIN="ngrok.xxx.com" # 此處爲公網服務器域名(我是用的阿里雲ESC服務器) openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
ngrok目錄下會生成6個新的文件
device.crt device.csr device.key
rootCA.key rootCA.pem rootCA.srl
- 替換證書
cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
- 編譯服務端與客戶端口
make release-server GOOS=linux GOARCH=386 make release-client GOOS=linux GOARCH=amd64 make release-client GOOS=windows GOARCH=386 make release-client GOOS=windows GOARCH=amd64 make release-client GOOS=darwin GOARCH=386 make release-client GOOS=darwin GOARCH=amd64 make release-client GOOS=linux GOARCH=arm make release-client
編譯成功後會在bin目錄下找到ngrokd和ngrok這兩個文件。其中ngrokd 是服務端程序ngrok是客戶端程序。
- 運行服務端
./ngrokd -domain="ngrok.xxx.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
- 將ngrok拷貝到客戶端上我的是mac,下載對應darwin_amd64
scp -P 22 -r root@你的的ngrok服務器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok ./ngrok
- 並在同級文件夾下新建config.yml文件,其中內容如下:
server_addr: "ngrok.xxxx.com:4443" trust_host_root_certs: false tunnels: webapp: proto: http: 8000 https: 8000 subdomain: www tcp12345: remote_port: 4444 proto: tcp: 12345
- 啓動客戶端
./ngrok -config=config.yml start-all
- 穿透成功
ngrok Tunnel Status online Version 1.7/1.7 Forwarding https://www.ngrok.xxxx.cn -> 127.0.0.1:8000 Forwarding http://www.www.ngrok.xxxx.cn -> 127.0.0.1:8000 Web Interface 127.0.0.1:4040 Conn 6 Avg Conn Time 6026.71ms HTTP Requests ------------- GET / 200 OK GET /static/fonts/element-ico 304 Not Modified GET /static/img/login_center_ 304 Not Modified GET /155.js 304 Not Modified GET /static/tinymce4.7.5/tiny 304 Not Modified GET /app.js 200 OK GET / 304 Not Modified GET /favicon.ico 200 OK GET /static/fonts/element-ico 200 OK
停止服務端和客戶端
-
網站配置SSL證書(https),使網站可以通過https訪問
我們申請的是Let's Encrypt通配符SSL證書,因爲他是免費的
-
1.獲取 Certbot 客戶端
下載 Certbot 客戶端 ,並且添加可執行權限
cd /usr/local/ wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
- 2.申請通配符證書
客戶在申請Let’s Encrypt證書的時候,需要校驗域名的所有權,證明操作者有權利爲該域名申請證書,目前支持三種驗證方式:dns-01:給域名添加一個 DNS TXT 記錄。
http-01:在域名對應的 Web 服務器下放置一個 HTTP well-known URL 資源文件。
tls-sni-01:在域名對應的 Web 服務器下放置一個 HTTPS well-known URL 資源文件
使用Certbot客戶端申請證書方法非常的簡單,只需如下一行命令就搞定了。
- 特別注意:
申請通配符證書,只能使用 dns-01 的方式。
xxx.com 請根據自己的域名自行更改。如果要.xxx.com xxx.com都可以使用需要配置 -d “.xxx.com” -d “xxx.com”。
./certbot-auto certonly -d "*.ngrok.xxx.com" -d "ngrok.xxx.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
- 執行完這一步之後,就是命令行的輸出,請根據提示輸入相應內容
1534495467849643.png
-
執行到上圖最後一步時,先暫時不要回車。申請通配符證書是要經過DNS認證的,接下來需要按照提示在域名後臺添加對應的DNS TXT記錄。
-
確認生效後,回車繼續執行,最後會輸出如下內容:
1534495645970573.png
出現這個就代表成功了
-
3.更換證書,重新編譯ngrok客戶端和服務端
cd /home/ngrok/ cp /etc/letsencrypt/live/open.yuelingnet.cn/privkey.pem /home/ngrok/assets/server/tls/snakeoil.key cp /etc/letsencrypt/live/open.yuelingnet.cn/fullchain.pem /home/ngrok/assets/server/tls/snakeoil.crt cp /etc/letsencrypt/live/open.yuelingnet.cn/fullchain.pem /home/ngrok/assets/client/tls/ngrokroot.crt make release-server GOOS=linux GOARCH=386 make release-client GOOS=linux GOARCH=amd64 make release-client GOOS=windows GOARCH=386 make release-client GOOS=windows GOARCH=amd64 make release-client GOOS=darwin GOARCH=386 make release-client GOOS=darwin GOARCH=amd64 make release-client GOOS=linux GOARCH=arm make release-client
- 4.將ngrok重新拷貝到客戶端上我的是mac,下載對應darwin_amd64
scp -P 22 -r root@你的的ngrok服務器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok ./ngrok
- 5.再次運行服務端
./ngrokd -tlsKey="/home/ngrok//assets/server/tls/snakeoil.key" -tlsCrt="/home/ngrok/assets/server/tls/snakeoil.crt" -domain="open.yuelingnet.cn" -httpAddr=":80" -httpsAddr=":443"
- 6.啓動客戶端
./ngrok -config=config.yml start-all
最後測試可以通過https訪問。
歡迎關注我們的微信公衆號,每天學習Go知識