摘要: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/
./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知識

相關文章