ngrok编译

ngrok编译

安装golang

官方golang安装文档:https://golang.google.cn/doc/install

配置国内源

 go env -w GOPROXY=https://goproxy.cn,direct

关掉GO111MODULE

go env -w GO111MODULE=off 

配置访问github

proxy_host=$1 # 192.168.126.173
proxy_port=$1 # 7890
export https_proxy=http://${proxy_host}:${proxy_port}
export http_proxy=http://${proxy_host}:${proxy_port} 
export all_proxy=socks5://${proxy_host}:${proxy_port}

下载源码

git clone https://github.com/inconshreveable/ngrok.git

生成证书

# 设置域名
export NGROK_DOMAIN="new.liuyunuo.cn"
# 生成CA私钥
openssl genrsa -out rootCA.key 2048
# 使用CA私钥,生成CA自签证书
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
# 使用CA证书和CA私钥,给设备证书请求签名,生成设备证书
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

拷贝证书

拷贝证书到ngrok项目中(证书会编译到项目中)

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

make release-server release-client

使用

有证书问题

修改源码忽略证书

diff --git a/src/ngrok/client/debug.go b/src/ngrok/client/debug.go
index 749fcf0..83ecbb5 100644
--- a/src/ngrok/client/debug.go
+++ b/src/ngrok/client/debug.go
@@ -1,3 +1,4 @@
+//go:build !release// +build !releasepackage client
diff --git a/src/ngrok/client/release.go b/src/ngrok/client/release.go
index 4c4b117..ba21a19 100644
--- a/src/ngrok/client/release.go
+++ b/src/ngrok/client/release.go
@@ -1,3 +1,4 @@
+//go:build release// +build releasepackage client
diff --git a/src/ngrok/client/tls.go b/src/ngrok/client/tls.go
index 63a707a..f2a305d 100644
--- a/src/ngrok/client/tls.go
+++ b/src/ngrok/client/tls.go
@@ -31,5 +31,5 @@ func LoadTLSConfig(rootCertPaths []string) (*tls.Config, error) {pool.AddCert(certs[0])}-       return &tls.Config{RootCAs: pool}, nil
+       return &tls.Config{RootCAs: pool, InsecureSkipVerify: true}, nil}
diff --git a/src/ngrok/client/update_debug.go b/src/ngrok/client/update_debug.go
index e001b6a..064c25c 100644
--- a/src/ngrok/client/update_debug.go
+++ b/src/ngrok/client/update_debug.go
@@ -1,3 +1,4 @@
+//go:build !release && !autoupdate// +build !release,!autoupdatepackage client
diff --git a/src/ngrok/client/update_release.go b/src/ngrok/client/update_release.go
index 2971731..09bc941 100644
--- a/src/ngrok/client/update_release.go
+++ b/src/ngrok/client/update_release.go
@@ -1,3 +1,4 @@
+//go:build release || autoupdate// +build release autoupdatepackage client
diff --git a/src/ngrok/server/tls.go b/src/ngrok/server/tls.go
index e59545b..ada52c0 100644
--- a/src/ngrok/server/tls.go
+++ b/src/ngrok/server/tls.go
@@ -36,6 +36,7 @@ func LoadTLSConfig(crtPath string, keyPath string) (tlsConfig *tls.Config, err e}tlsConfig = &tls.Config{
+               ClientAuth:   tls.NoClientCert,Certificates: []tls.Certificate{cert},}

测试

可以工作

编译脚本参考

脚本只是编译,源码需要自己根据git diff 记录修改哦

#!/bin/bashset -e
set -x
CURRENT_PATH=$(cd $(dirname $0) && pwd)# 设置域名
NGROK_DOMAIN="new.liuyunuo.cn"# 设置中国代理
go env -w GOPROXY=https://goproxy.cn,direct# 关闭Module模式
go env -w GO111MODULE=off mkdir -p certs
cd certs# 生成CA私钥
openssl genrsa -out rootCA.key 2048
# 使用CA私钥,生成CA自签证书
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=${NGROK_DOMAIN}" -days 3650 -out rootCA.pem
# 生成设备私钥
openssl genrsa -out device.key 2048
# 使用设备私钥,生成设备证书请求
openssl req -new -key device.key -subj "/CN=${NGROK_DOMAIN}" -out device.csr
# 使用CA证书和CA私钥,给设备证书请求签名,生成设备证书
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 3650cd ${CURRENT_PATH}cp certs/rootCA.pem assets/client/tls/ngrokroot.crt
cp certs/device.crt assets/server/tls/snakeoil.crt
cp certs/device.key assets/server/tls/snakeoil.keyGOOS=linux GOARCH=amd64 make release-server
mkdir -p ngrok_server_linux_amd64
cp ./bin/ngrokd ./ngrok_server_linux_amd64/cat << 'EOF' > "./ngrok_server_linux_amd64/start.sh"
#!/bin/bashscriptPath=$(cd $(dirname $0) && pwd)
cd ${scriptPath}
./ngrokd_wdt.sh 2>&1 >/dev/null &EOFcat << EOF > "./ngrok_server_linux_amd64/ngrokd_wdt.sh"
#!/bin/bashscriptPath=\$(cd \$(dirname \$0) && pwd)
cd \${scriptPath}for ((;;))
doecho "restart ngrokd" >> ngrokd.log./ngrokd -domain="${NGROK_DOMAIN}" -httpAddr=":16080" -httpsAddr=":16443" -tunnelAddr=":4443"sleep 1
doneEOFchmod a+x ./ngrok_server_linux_amd64/*
tar -zcvf ngrok_server_linux_amd64.tgz ngrok_server_linux_amd64GOOS=linux GOARCH=amd64 make release-client
mkdir -p ngrok_client_linux_amd64
cp ./bin/ngrok ./ngrok_client_linux_amd64/cat << 'EOF' > "./ngrok_client_linux_amd64/start.sh"
#!/bin/bashscriptPath=$(cd $(dirname $0) && pwd)
cd ${scriptPath}
./ngrok_wdt.sh 2>&1 >/dev/null &EOFcat << 'EOF' > "./ngrok_client_linux_amd64/ngrok_wdt.sh"
#!/bin/bashscriptPath=$(cd $(dirname $0) && pwd)
cd ${scriptPath}for ((;;))
doecho "restart ngrok" >> ngrok.log./ngrok -config ngrok.cfg -log=stdout -log-level="DEBUG" start sshsleep 1
doneEOFcat << EOF > "./ngrok_client_linux_amd64/ngrok.cfg"
server_addr: "${NGROK_DOMAIN}:4443"  
trust_host_root_certs: false
tunnels:ssh:proto:tcp: 22remote_port: 15022EOFchmod a+x ./ngrok_client_linux_amd64/*
tar -zcvf ngrok_client_linux_amd64.tgz ngrok_client_linux_amd64GOOS=linux GOARCH=arm64 make release-client
mkdir -p ngrok_client_linux_arm64
cp ./bin/linux_arm64/ngrok ./ngrok_client_linux_arm64/cat << 'EOF' > "./ngrok_client_linux_arm64/start.sh"
#!/bin/bashscriptPath=$(cd $(dirname $0) && pwd)
cd ${scriptPath}
./ngrok_wdt.sh 2>&1 >/dev/null &EOFcat << 'EOF' > "./ngrok_client_linux_arm64/ngrok_wdt.sh"
#!/bin/bashscriptPath=$(cd $(dirname $0) && pwd)
cd ${scriptPath}for ((;;))
doecho "restart ngrok" >> ngrok.log./ngrok -config ngrok.cfg -log=stdout -log-level="DEBUG" start sshsleep 1
doneEOFcat << EOF > "./ngrok_client_linux_arm64/ngrok.cfg"
server_addr: "${NGROK_DOMAIN}:4443"  
trust_host_root_certs: false
tunnels:ssh:proto:tcp: 22remote_port: 15022EOFchmod a+x ./ngrok_client_linux_arm64/*
tar -zcvf ngrok_client_linux_arm64.tgz ngrok_client_linux_arm64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发是否会重复Java的结果?

今日话题&#xff0c;嵌入式开发是否会重复Java的结果&#xff1f;嵌入式开发与Java开发在性质和稳定性上有一些不同&#xff0c;因此不太容易出现与Java相似的结果。嵌入式开发通常属于第二产业&#xff0c;主要涉及制造业领域&#xff0c;如电子、机械&#xff08;汽车&#…

Android-----res资源文件夹

1 res资源文件夹 res目录 assets目录 两者的区别在于&#xff1a; res目录下所有的资源文件都会在R.java文件下生成对应的资源id&#xff0c;而assets目录并不会&#xff1b;res目录我们可以直接通过资源id访问到对应的资源&#xff1b;而assets目录则需要我们通过AssetManag…

RTDETR论文快速理解和代码快速实现(训练与预测)

文章目录 前言一、摘要二、论文目的三、论文贡献四、模型结构1、模型整体结构2、backbone结构3、neck结构4、混合编码器(neck) 五、RTDERT模型训练(data-->train)1、环境安装2、训练1、数据准备2、数据yaml文件3、训练代码4、训练运行结果 3、推理1、推理代码2、推理运行结果…

基于web的楼房销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本楼房销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

嵌入式MCU和SOC之间的区别是什么?

今日话题&#xff0c;嵌入式MCU和SOC之间的区别是什么&#xff1f;表面上看&#xff0c;MCU代表嵌入式微控制器&#xff0c;而SOC代表片上系统&#xff0c;似乎只是嵌入式系统的不同称谓。然而&#xff0c;在实际的研发和产品设计中&#xff0c;你会发现它们在软硬件层面存在显…

JAVA面试题15

什么是Java中的多线程编程&#xff1f; 它有什么作用&#xff1f; 答案&#xff1a;多线程编程是一种同时执行多个线程的机制&#xff0c;用于实现并发处理和提高程序性能。Java中的多线程编程可以将任务分配给不同的线程并行执行&#xff0c;利用多核处理器的优势&#xff0c;…

MySQL数据库 约束

目录 约束概述 外键约束 添加外键 删除外键 删除/更新行为 约束概述 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 分类: 注意&#xff1a;约束是作用于表中字段上…

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…

Map集合体系

Map集合的概述 Map集合是一种双列集合&#xff0c;每个元素包含两个数据。 Map集合的每个元素的格式&#xff1a;keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合的完整格式&#xff1a;{key1value1 , key2value2 , key3value3 , ...} Map集合的使用场景…

配置自定义RedisTemplate 解决redis序列化java8 LocalDateTime

目录 配置自定义RedisTemplate 引入依赖 配置连接redis 编写测试类 出现问题 配置序列化 解决redis序列化java8 LocalDateTime 问题背景 问题描述 问题分析 解决方案一&#xff08;全局&#xff09; 解决方案二&#xff08;单个字段&#xff09; 配置自定义RedisTe…

数据可视化分析大屏,大数据统计UI页面源文件(信息分析平台免费PS资料)

数据可视化可以帮助数据分析者更好地理解数据&#xff0c;发现数据中的规律和趋势。通过图表和图形等可视化工具&#xff0c;数据分析者可以更快速地发现数据中的关系&#xff0c;比如相关性、趋势、异常值等。对于普通用户来说&#xff0c;理解复杂的数据可能会很困难。通过数…

页面菜单,通过get请求一个url后,跳转另外一个页面,+丢失问题

业务场景描述&#xff1a; 在A系统&#xff0c;菜单点击跳B系统这个操作。 A系统菜单是get请求到B系统的一个缓冲页面&#xff0c;然后这个缓冲页面获取到url中的accessToken后&#xff0c;在这个页面中通过post请求后端接口。 问题描述&#xff1a; 当accessToken中包含了…

你见过哪些令你膛目结舌的代码技巧?

代码世界有很多令人大呼小叫的技巧&#xff01;有的代码像魔术师一样巧妙地隐藏了自己&#xff0c;有的像魔法师一样让你眼花缭乱&#xff0c;还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已&#xff0c;让我们觉得自己仿佛置身于编码的魔幻世界。快来分享你见过哪些令你膛…

Selenium4+Python3 - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

一、iframe操作 iframe识别&#xff1a; 语法&#xff1a; driver.switch_to.frame(‘方式’) 1、常见处理方法三种 index&#xff1a;下标name&#xff1a;id或name属性的值webelement&#xff1a;元素 2、通过下标进入 进入第一个iframe&#xff1a; driver.switch_to.…

Linux c可变参数 va_xx函数(比如va_start+va_end)避坑

写了个错误的代码&#xff0c;如下: void myPtintf(constchar *format, ...) {va_list args;va_start(args, format);printf(format, args);va_end(args); } 结果运行出来字符打印是对的&#xff0c;但是参数一直有问题&#xff0c;最后发现va_startva_end需要跟vprintf向结合…

CGAL的STL扩展

1、介绍 CGAL是以通用编程范式的精神设计的&#xff0c;与标准模板库&#xff08;STL&#xff09;协同工作。本章记录了非几何的STL样组件&#xff0c;这些组件在STL标准中没有提供&#xff0c;但在CGAL中提供&#xff1a;一个管理就地插入项&#xff08;插入项不复制&#xff…

linux/ubuntu 批量解压脚本,解压kiiti-raw data

目的&#xff1a;我下载完kitti-raw data后&#xff0c;发现全是zip的压缩包&#xff0c;一个个unzip解压有点太emm&#xff0c;写了个下面的.sh脚本 #!/bin/bashfor file in *.zip; doif [ -e "$file" ]; thenecho "Extracting: $file"unzip -o "$f…

C 库函数 - clock()

描述 C 库函数 clock_t clock(void) 返回程序执行起&#xff08;一般为程序的开头&#xff09;&#xff0c;处理器时钟所使用的时间。为了获取 CPU 所使用的秒数&#xff0c;您需要除以 CLOCKS_PER_SEC。 在 32 位系统中&#xff0c;CLOCKS_PER_SEC 等于 1000000&#xff0c;…

本地生活团购外卖怎么做?一招教你轻易入行!

如果说今年生意不好做的话&#xff0c;那么年初做本地生活服务这个赛道的现在是喜忧参半。喜的是在本地生活干团购和外卖把钱给挣上了。忧的是官方清退了所有的全国本地生活服务商。通过官方渠道基本是没的玩了。本来还想着干个三五年。实现车子、房子、票子自由。这计划全落空…

Modbus-ASCII数据帧

Modbus-ASCIl传输模式中&#xff0c;每个字节均以ASCI编码&#xff0c;实际报文中1个字节会以两ASCIl字符发送&#xff0c;因此这种模式比Modbus-RTU模式效率要低。 例如报文数据 x5B "5""B" X35 X42 . 数据帧格式如下: 从ASCI报文帧可以看出&#xff0…