Go 1.12 TLS 1.3 简单测试

《TLS 1.3 当前(2018.10)支持与部署之现状》中,我们提到 Go 将在 1.12 中支持 TLS 1.3. 作为一个 Gopher, 终于在前几天盼来了 golang 1.12 的发布。

但是从 release 日志看,本次对选择性的部分支持 TLS 1.3, 且默认处于关闭状态:

Go 1.12 adds opt-in support for TLS 1.3 in the crypto/tls package as specified by RFC 8446. It can be enabled by adding the value tls13=1 to the GODEBUG environment variable. It will be enabled by default in Go 1.13.

如果要开启 TLS 1.3, 需要设置环境变量:GODEBUG=tls13=1.

本次发布的 TLS 1.3 的 cipher suite 无法配置,也不支持 0-RTT 模式:

TLS 1.3 cipher suites are not configurable. All supported cipher suites are safe, and if PreferServerCipherSuites is set in Config the preference order is based on the available hardware.

Early data (also called “0-RTT mode”) is not currently supported as a client or server.

要知道,没有 0-RTT 的 TLS 1.3 是没有灵魂的,对本次版本的失望那是肯定的。但是依然在第一时间升级了 Go 版本,简单测试了一下国内网络环境下 TLS 1.3 与 1.2 的握手延迟。如果对 TLS 1.3 握手延迟还不太熟悉,可以参见拙文《TLS1.3/QUIC 是怎样做到 0-RTT 的》 以及 TLS 1.3 Handshake Protocol.

测试代码

需要说明的是,这个测试是不严谨,里面没有考虑 cipher suite 以及 early data 的差异。测试结果定性意义大于定量意义。

测试结果

测试使用的目标服务器地址是 blog.cloudflare.com:443, 我的网络环境下,ping 延迟为 226 ms (1-RTT).

从结果看,有如下结论:

  1. TLS 1.3 平均比 TLS 1.2 建立连接的延迟低约 1-RTT, 跟理论分析是吻合的。但是,
  2. 从 max 项可以看出,部分时候国内到目标服务器网络不稳定带来的波动比 TLS 本身协议优化的 RTT 大的多。因此,稳定高延迟的网络链路有时候比低延迟高抖动的网络更有实际意义。
  3. TLS 建立在 TCP 基础上,TCP 的握手延迟在 TLS 层面是优化不掉的,或者说不是 TLS 的管辖范围,因此,在允许的情况下,尽量复用连接。

一个适合程序员的 Markdown 文档编辑和文档管理方案

我是一个重度的 Markdown 用户。长时间使用过 Day OneUlysses、MacDown,如你所料,最终都放弃了。

坦率讲,Day One 和 Ulysses 是你一打开就会觉得非常惊艳的产品,设计上侧重写作者的主观感受和体验,在细节的打磨上非常到位。但是 Day One 的代码质量实在一般,很多闪退 bug 经常把你的写作热情消灭得荡然无存,且没有一个像样的文档管理功能。Ulysses 虽然有文档管理功能,UI 更加惊艳,尤其是沉浸模式非常吸引人,让你觉得在使用艺术品写作,当然,也会让你产生使用它写作能够提高写作质量的错觉😂 不过,Ulysses 的文档管理和编辑设定更偏向于普通小白用户。这个本身是没有问题的,因为它的定位是让你享受写作,尽可能少的减少其他方面对用户的打扰。显然,作为一个经常需要从源代码级别去修改文档的用户来说,它的这种好意被我当成了一种功能的羸弱。

在很长一段时间内都没有找到满意的 Markdown 软件。于是,索性用回了只有简单编辑功能的 MacDown,同时也在摸索和完善适合自己使用习惯的 Markdown 文档管理和编辑方案。我理想中的 Makrdown 文档管理方案是这样的:

  1. 源代码级的 Markdown 文档编辑能力;不看重所见即所得的功能,且不能接受只提供所见即所得的编辑能力;
  2. 符合开发人员习惯的文档管理能力,像管理源代码一样管理我的 Markdown 文档,随时查找、编辑。
  3. 如果能够支持文档历史版本管理就更棒了。
  4. 成本不要太高,最好是免费的。

不卖关子,先说当前自己用下来比较舒服的方案:Visual Studio Code + Markdown Shortcuts + markdownlint + Bitbucket, 满足自己以上的所有需求,且成本为 0 .

选择 Visual Studio Code 作为编辑器是因为可以把自己写代码的那套文件查找和管理习惯继承过来,并且不需要重新学习和熟悉快捷键。 VS Code 本身支持 Markdown 文档编辑和预览,遗憾的是它的这两个功能都不强大,达不到自己快糙猛的要求。预览功能自己并不看重,因此选择性安装了两个插件(Markdown Shortcuts + markdownlint)来增强其编辑功能。

Markdown Shortcuts 提供了很多编辑 Makrdown 文档的风骚快捷键。我自己常用的有:

  • 快速转换成列表:

  • excel 表数据转表格:

其他命令如下:



markdownlint 则是一个语法检查 lint 工具。虽然 Markdown 语法很简单,但是因为经常编辑源代码和插入 html 代码,有一个 lint 还是能够辅助你提前发现很多 typos.

得益于 VS Code 强大而丰富的插件生态,Markdown 周边的各种功能都能通过这些插件解决,只有你想不到,没有插件没做到的。比如,如果你想导出文档为 PDF,你可以尝试 Markdown PDF; 如果你是数据公式重度用户,你可以使用 Markdown+Math
.

Bitbucket 则是用 git 来做文档的历史版本管理,免费,且支持私有仓库。如此一来,基本上编辑 Makrdown 与编写项目代码的有了相同的使用体验。

小结

习惯这东西本身就是个性化化的东西,并且一旦适应了就很难改变。以上方案只是一个我自己比较舒服的使用习惯。这个方案并不完美,比如它并没有考虑 Markdown 重度图片用户插图的效率问题。另一方面,Evernote 大陆版发布的新版本已经开始支持 Markdown 文档功能(国际版不支持哟)。如果,你是印象笔记的铁粉,不妨一试。

移除 macOS 中被企业策略强制安装的 Chrome 插件扩展的方法

公司配发的 Macbook 安装了一些监控软件,毕竟是办公设备,这点倒是无可厚非。但是,其中的 Forcepoint DLP Endpoint 会向日常使用的主力浏览器 Chrome 中安装一个 WebsenEndpoint 的扩展插件。

这个插件的作用不必多说,但是有一个副作用就是让 Chrome 无法自动填写任何网站用户名密码。每天要输入上百次的密码这种体力活是绝对不能忍受的。于是尝试卸载这个插件。但是这个插件是使用企业策略 (Installed by enterprise policy) 强制安装,无法在Chrome中下载。但是可以通过将与之关联的 Profile 删除实现卸载的作用:

但是过两天,Forcepoint 又会把这个插件装回来😂 不过没关系,我们有的是办法。

方法一:通过占用 Chrome 插件文件位置,防止真正插件重新装回

原理是这样的:Chrome 的插件安装在 ~/Library/Application Support/Google/Chrome/Default/Extensions 目录下:

除去 Temp, 每个文件夹对应一个插件。我们希望移除的插件的文件夹名称是 kmofofmjgmakbbmngpgmehldlaaafnjn。由于 macOS 文件夹下,相同名称的文件和文件夹只能存在一个。因此,我们只需要在插件删除以后,在这个目录下新建一个名称为 kmofofmjgmakbbmngpgmehldlaaafnjn 的空文件:

然后,再通过文件系统的 Lock 功能锁定改文件,防止该文件被 Forcpoint 删除:

至此,大功告成,so easy!

方法二:修改 Forcepoint DLP Endpoint 插件安装脚本,禁止强奸 Chrome

法一虽然可以防止Chrome被重新安装插件,但是过几天以后,你会在你的 Profiles 配置下发现,虽然 Chrome 插件安装失败了,但是依然会成功安装这个 Profile:

虽然不会干扰系统的任何功能,但是估计很多强迫症患者看到这个还是挺难受的……从图中我们可以看到,这个插件的路径在 /Library/Application Support/Websense Endpoint/DLP:

其中 setup_chrome_ext.sh 就是强插 Chrome 的脚本:

脚本写得简单粗暴:通过 $PROFILES -I -F "/Library/Application Support/Websense Endpoint/DLP/WebsenseEndpointExtension.config" 向系统强行安装 profile. 要防止其安装插件,把这行代码删除即可。但是,这个文件是属于 admin 用户组的,我们平时使用的账号,即使集合 sudo 也只是 wheel 用户组,是干不过 admin 的,导致我们无法在正常模式下编辑该文件:

因此,我们需要通过 Command (⌘)-R 重启到恢复模式,然后在 /Volumes/mac.os/Library/Application Support/Websense Endpoint/DLP 目录下,将对应代码删除即可。

至此,自己基本满意了🤔

后记

稍微浏览了一下 /Library/Application Support/Websense Endpoint 文件夹,发现其实这个软件不仅强插 Chrome, 还会强插 FireFox:

艾玛……proxy…吓死宝宝了,已经不想改脚本了。直接在恢复模式下删除文件,然后用方法一的方法,建了一个 Lock 文件锁定这个位置。什么,还有 upgrade.sh? 你怎么不上天呢,也一并删除了……突然想起,自己在无所不能的恢复模式下,要不整个软件一起删除了?想到隔天IT技术小哥可能过来找麻烦,就此打住吧😂