热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

localhost拒绝了我们的连接请求vscode_移动办公——在iPad上运行VSCode

导语越来越多的业务开始上云,现在的个人开发环境也有上云的趋势。利用VSCode的远程开发模式,很多开发者已经把代码和编译环境都配置在云服务器上ÿ

导语


越来越多的业务开始上云,现在的个人开发环境也有上云的趋势。利用VSCode的远程开发模式,很多开发者已经把代码和编译环境都配置在云服务器上,本地的笔记本只是一个接入端。而这个接入端不一定是电脑,也可以使iPad等更轻量的设备。


Code Server


到目前为止,微软还没有提供iPad版本的VSCode。幸运的是,有一个叫coderom的团队提供了一个code server,安装到Linux服务器上之后,可以通过浏览器打开VSCode,进而实现从iPad上远程开发的目的。
同时,coderom还提供了code server的docker镜像,配置起来更加简便。
所以你需要的资源包括:一台云服务器,一个域名(可选,但用域名会方便很多),一台配了键盘的iPad。


开箱即用的方式


云服务安装好docker之后,直接把code server的容器跑起来就可以了:

docker run -it -p 80:8080 -v "$PWD/code:/home/coder/project" -u "$(id -u):$(id -g)" -e PASSWORD='abde32c' codercom/code-server:3.7.4

然后在iPad的浏览器上打开你的域名

74107cc1424be62508b89340bc7d8990.png

上面docker启动时时已经通过环境变量指定密码,如果不指定密码,code server会随机生成一个。输入密码,即可开始iPad编程之旅。

a438405649ff1efd7bf9ac8007cd5454.png

安全保障


从上面的截图右下角也可以看到,现在访问code server没有加密,很不安全。一个方式是用一个ssh客户端进行端口转发,然后iPad直接访问本地端口来访问code server。iPad的ssh客户端可以选择Terminus。于是,docker容器改成只监听本地端口:

docker run -it -p 127.0.0.1:8090:8080 -v "$PWD/code:/home/coder/project" -u "$(id -u):$(id -g)" -e PASSWORD='abde32c' codercom/code-server:3.7.4

然后用Terminus做端口转发:

520cf5179d210dca035e56412036af8d.png

但是iPad一个应用不在前台时很容易被清理掉,然后端口转发就停止了。好在现在iPad可以多应用开启,只不过要挤占有限的屏幕空间,用起来并不畅快。

HTTPS


另一个方式是通过HTTPS访问。code server也自带了https选项,但这里我没有选择使用它。因为我觉得更合适的方式是各个模块各司其职,让code server专门负责vscode的事情,通过另一个程序来做HTTPS的请求转发。另外一个考虑是,自己来做HTTPS请求转发,可以灵活定制。可以考虑写一个golang程序来做HTTPS监听,并将请求转发到本地的8090端口。

提供HTTPS服务需要有证书,因为这里的HTTPS服务仅仅是自己访问,只需要用一个自签名证书就可以了。推荐的方式是先生成一个rootCA根证书,再用这个根证书颁发一个服务器证书server.key和server.crt。这样客户端只需要信任根证书,服务端证书就自动被信任,而且以后服务端再换证书,客户端也不用修改。注意下面的http://your.domain.com需要替换成你的真实域名。

# generate rootCA locally.
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -days 750 -subj "/C=US/L=CA/O=VSCode Server CA/CN=VSCode Server Root CA" -key rootCA.key -out rootCA.crt# generate server certificate and key.
openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key -subj "/C=US/ST=CA/O=VSCode Server/CN=your.domain.com" -out server.csr
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -days 365 -sha256 -extensions SAN -extfile <(cat /etc/ssl/openssl.cnf <(printf "n[SAN]nsubjectAltName &#61; DNS:your.domain.comnextendedKeyUsage &#61; serverAuth")) -in server.csr -out server.crt

服务器上需要rootCA.crt、server.key、server.crt&#xff0c;iPad需要rootCA.crt&#xff0c;rootCA.key应该仅保存在你的个人机器上。然后再实现一个golang的HTTPS服务器&#xff1a;

package mainimport ("crypto/tls""crypto/x509""fmt""io/ioutil""net/http""net/http/httputil""net/url""time"
)func main() {codeServer, _ :&#61; url.Parse("http://localhost:8090/")codeServerDirector :&#61; func(req *http.Request) {req.Header.Add("X-Forwarded-Host", req.Host)req.Header.Add("X-Origin-Host", codeServer.Host)req.URL.Scheme &#61; "http"req.URL.Host &#61; codeServer.Host}codeServerProxy :&#61; &httputil.ReverseProxy{Director: codeServerDirector}http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Printf("proxy receive request from: %v at: %vn", r.RemoteAddr, time.Now())codeServerProxy.ServeHTTP(w, r)})certificate, err :&#61; tls.LoadX509KeyPair("../cert/server.crt", "../cert/server.key")if err !&#61; nil {fmt.Printf("load certificate fail: %vn", err)return}certPool :&#61; x509.NewCertPool()ca, err :&#61; ioutil.ReadFile("../cert/rootCA.crt")if err !&#61; nil {fmt.Printf("read ca file fail:%vn", err)return}if ok :&#61; certPool.AppendCertsFromPEM(ca); !ok {fmt.Println("failed to append certs")return}tlsconfig :&#61; &tls.Config{Certificates: []tls.Certificate{certificate},ClientAuth: tls.NoClientCert, //tls.RequireAndVerifyClientCert,ClientCAs: certPool,}s :&#61; &http.Server{Addr: "0.0.0.0:443",Handler: nil,TLSConfig: tlsconfig,}s.ListenAndServeTLS("", "")
}

这个golang的HTTPS服务器的功能非常单一&#xff0c;就是将所有请求转发给localhost:8090&#xff0c;即code server的端口。
iPad客户端需要信任rootCA.crt&#xff0c;然后直接打开https://your.domain.com&#xff0c;然后就可以到达之前输入密码的界面&#xff0c;进入编程环境。


还能更安全吗


注意现在只是客户端验证服务端的证书&#xff0c;服务端并没有验证客户端的证书&#xff0c;拦在攻击者前面的只有一个密码了。我们可以让服务端也校验客户端的证书&#xff0c;实现双向认证。先用之前的根证书颁发一个客户端证书&#xff1a;

# generate client certificate and key.
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key -subj "/C&#61;US/ST&#61;CA/O&#61;VSCode Client/CN&#61;your.domain.com" -out client.csr
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -days 365 -sha256 -extensions SAN -extfile <(cat /etc/ssl/openssl.cnf <(printf "n[SAN]nsubjectAltName &#61; DNS:your.domain.comnextendedKeyUsage &#61; clientAuth")) -in client.csr -out client.crt
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt

然后整个打包发送到iPad上&#xff0c;安装为描述文件。注意我们已经信任了根证书&#xff0c;这个client.crt会自动被信任。HTTPS服务器的tls配置修改为要求客户端提供证书&#xff1a;

tlsconfig :&#61; &tls.Config{Certificates: []tls.Certificate{certificate},ClientAuth: tls.RequireAndVerifyClientCert,ClientCAs: certPool,
}

接着重新启动HTTPS服务器。
这种方式在Mac的Chrome验证通过&#xff0c;不过遗憾的是&#xff0c;iPad上的Chrome不认手动导入的客户端证书&#xff0c;Safari则仅在第一此连接时使用了客户端证书&#xff0c;后面的又不读取了&#xff0c;服务端会报tls: client didn&#39;t provide a certificate的错误。
所以目前暂时还只能使用单向HTTPS&#43;密码的方式&#xff0c;为了更加安全&#xff0c;端口就不能长期打开了&#xff0c;仅在使用的时候把code server和HTTPS服务器打开。


总结


在iPad上用VSCode连接云服务器开发是可行的。通过配置独立于cod server 的HTTPS转发服务&#xff0c;可以加入更多的定制功能&#xff08;比如自签名证书和客户端验证&#xff09;。期待最终能实现iPad上的双向HTTPS验证方式使用VSCode。



推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
so杨xi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有