自建ngrok服務(wù)支持https訪問

前言

最近從事第三方平臺代小程序?qū)崿F(xiàn)業(yè)務(wù)開發(fā),很多業(yè)務(wù)交互請求需要https嘹履,本地調(diào)試開發(fā)實現(xiàn)不了宙址,不可能把部署到生產(chǎn)服務(wù)器調(diào)試轴脐,那又很不方便。我參考網(wǎng)上很多教程抡砂,很多不完整大咱,不系統(tǒng)。我于是整理出完整教程當(dāng)備用注益。

專業(yè)術(shù)語

內(nèi)網(wǎng)穿透,又叫NAT穿透碴巾,是計算機(jī)用語,翻譯過來就是 你的電腦可以直接被你朋友訪問丑搔。 通常我們的電腦是無法自己被訪問的厦瓢。因為我們的電腦缺少自己的獨立的ip地址。現(xiàn)在ip稀缺啤月,電信運營商已經(jīng)不會隨便分配固定ip給個人煮仇。
通常實現(xiàn)內(nèi)網(wǎng)穿透,是通過路由器上端口映射來實現(xiàn)的谎仲。但是路由器通常不是每個人都有權(quán)限可以訪問和設(shè)置,而且可能存在多級路由器較為復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)浙垫。端口映射也無法實現(xiàn)。這就需要ngrok來實現(xiàn)了。

原理

ngrok 建立一個隧道,將主機(jī)A的http請求 傳遞給 主機(jī)B,從而實現(xiàn)內(nèi)網(wǎng)穿透夹姥。
ngrok分為client端(ngrok)和服務(wù)端(ngrokd)杉武,

32778-0c1af0a3d5798ba6.png

實際使用中的部署如下:
32778-428dc58babf925c8.png

圖中內(nèi)網(wǎng)主機(jī)上安裝客戶端。
公網(wǎng)主機(jī) 安裝服務(wù)端佃声。
client public 則代表 訪問你電腦的用戶或者朋友艺智。
現(xiàn)在都云時代,各種服務(wù)都能找到提供商圾亏。內(nèi)網(wǎng)穿透也是如此十拣。ngrok服務(wù)端相當(dāng)麻煩,如果你只是簡單的穿透,又不是什么敏感信息志鹃,可以找到很多 服務(wù)提供商夭问。例如https://ngrok.com/

  • 下載客戶端根據(jù)你的個人電腦系統(tǒng)下載匹配的客戶端。下載地址: 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服務(wù)

使用別人的服務(wù)曹铃,存在一些限制缰趋。例如不穩(wěn)定、安全問題陕见,費用昂貴等秘血。因此可能需要自己搭建ngrok服務(wù)端。
自建服務(wù)需要具備的條件:

1评甜、具備獨立ip的服務(wù)器灰粮。例如阿里云、騰訊云等忍坷。 我個人使用的阿里云ecs

2粘舟、需要域名。如果是國內(nèi)則需要備案佩研。我個人的域名是 xxxx.com

  • 配置域名

增加2條A記錄,指向你的服務(wù)器柑肴。這里我配置的是 ngrok.xxxx.com 和 *.ngrok.xxxx.com


32778-2de852c725e147ef.png
  • 添加安全組。

開放3個端口旬薯。這里我選擇4443晰骑、4444、8081端口绊序。
其中4443是ngrok自身通信使用些侍。
4444 后面tcp端口轉(zhuǎn)發(fā)使用。
8081 則是http請求轉(zhuǎn)發(fā)使用政模。默認(rèn)是80 但是這里80端口我分配給nginx了岗宣。
截圖中少截圖了4444的配置。

32778-c5be55abf8d86869.png
  • 安裝go(阿里云ESC服務(wù)器)

第一次照著其他教程直接apt-get install golang安裝go語言環(huán)境淋样,結(jié)果編譯的時候報錯耗式,最終使用go 1.8版本順利通過。

  • 下載go安裝包并解包
 wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
tar -zxvf go1.8.linux-amd64.tar.gz
  • 配置環(huán)境變量
sudo vim /etc/profile
# 添加以下內(nèi)容
export GOROOT=/usr/local/go # 注意此處為解壓后文件夾的路徑
export GOPATH=$GOROOT/bin
export PATH=$PATH:$GOPATH
  • 使其生效
source /etc/profile
  • 查看go版本
go version
  • 安裝ngrok(阿里云ESC服務(wù)器)

    • 下載安裝包并解壓
    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" # 此處為公網(wǎng)服務(wù)器域名(我是用的阿里云ESC服務(wù)器)
    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
  • 編譯服務(wù)端與客戶端口
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 是服務(wù)端程序ngrok是客戶端程序刊咳。

  • 運行服務(wù)端
./ngrokd -domain="ngrok.xxx.com"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" 
  • 將ngrok拷貝到客戶端上我的是mac彪见,下載對應(yīng)darwin_amd64
scp -P 22 -r  root@你的的ngrok服務(wù)器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok  ./ngrok
  • 并在同級文件夾下新建config.yml文件,其中內(nèi)容如下:
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  

停止服務(wù)端和客戶端

  • 網(wǎng)站配置SSL證書(https),使網(wǎng)站可以通過https訪問

我們申請的是Let's Encrypt通配符SSL證書娱挨,因為他是免費的

  • 1.獲取 Certbot 客戶端
    下載 Certbot 客戶端 ,并且添加可執(zhí)行權(quán)限
cd /usr/local/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
  • 2.申請通配符證書

客戶在申請Let’s Encrypt證書的時候余指,需要校驗域名的所有權(quán),證明操作者有權(quán)利為該域名申請證書跷坝,目前支持三種驗證方式:dns-01:給域名添加一個 DNS TXT 記錄酵镜。
http-01:在域名對應(yīng)的 Web 服務(wù)器下放置一個 HTTP well-known URL 資源文件。
tls-sni-01:在域名對應(yīng)的 Web 服務(wù)器下放置一個 HTTPS well-known URL 資源文件
使用Certbot客戶端申請證書方法非常的簡單柴钻,只需如下一行命令就搞定了淮韭。

  • 特別注意:

申請通配符證書,只能使用 dns-01 的方式贴届。
xxx.com 請根據(jù)自己的域名自行更改靠粪。如果要.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
  • 執(zhí)行完這一步之后毫蚓,就是命令行的輸出占键,請根據(jù)提示輸入相應(yīng)內(nèi)容
    1534495467849643.png
  • 執(zhí)行到上圖最后一步時,先暫時不要回車元潘。申請通配符證書是要經(jīng)過DNS認(rèn)證的畔乙,接下來需要按照提示在域名后臺添加對應(yīng)的DNS TXT記錄。

  • 確認(rèn)生效后柬批,回車?yán)^續(xù)執(zhí)行,最后會輸出如下內(nèi)容:


    1534495645970573.png

    出現(xiàn)這個就代表成功了

  • 3.更換證書袖订,重新編譯ngrok客戶端和服務(wù)端

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氮帐,下載對應(yīng)darwin_amd64
scp -P 22 -r  root@你的的ngrok服務(wù)器ip地址:/usr/local/ngrok/bin/darwin_amd64/ngrok  ./ngrok
  • 5.再次運行服務(wù)端
./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訪問。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洛姑,一起剝皮案震驚了整個濱河市上沐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞艾,老刑警劉巖参咙,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硫眯,居然都是意外死亡蕴侧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門两入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來净宵,“玉大人,你說我怎么就攤上這事≡衿希” “怎么了紧武?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敏储。 經(jīng)常有香客問我阻星,道長,這世上最難降的妖魔是什么已添? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任妥箕,我火速辦了婚禮,結(jié)果婚禮上酝碳,老公的妹妹穿的比我還像新娘矾踱。我一直安慰自己,他們只是感情好疏哗,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布呛讲。 她就那樣靜靜地躺著,像睡著了一般返奉。 火紅的嫁衣襯著肌膚如雪贝搁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天芽偏,我揣著相機(jī)與錄音雷逆,去河邊找鬼。 笑死污尉,一個胖子當(dāng)著我的面吹牛膀哲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播被碗,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼某宪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锐朴?” 一聲冷哼從身側(cè)響起兴喂,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焚志,沒想到半個月后衣迷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡酱酬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年壶谒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳沽。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佃迄,死狀恐怖泼差,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呵俏,我是刑警寧澤堆缘,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站普碎,受9級特大地震影響吼肥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻车,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一缀皱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧动猬,春花似錦啤斗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彼水,卻和暖如春崔拥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凤覆。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工链瓦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盯桦。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓慈俯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拥峦。 傳聞我的和親對象是個殘疾皇子贴膘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355