Pensieve: 2202

2022-02-27 12:19

所观所读所玩所听

Netflix上重温了让子弹飞, 依旧是看不太明白, 很多情节可以有相对比较开放的解读, 所以可以公说公有理. 不过片子本身的节奏感很好, 剧情也能够自洽, 不要要求太多了, 能在国内站着把钱挣了本身就不容易. 另外看完了人生一串3, 意料之外清理之中的有不少武汉的烧烤入镜(虽然我都从来没吃过). 最喜欢的一句台词是掌握火候那一集的片头, “特想问问那个不靠谱的烧烤师傅:用炭的剧烈氧化反应控制好美拉德反应你能不能”, 这句实在太化学也太理科了.

书读完了release it!的第二版. 这本书是我近期读过的技术书籍里对我提升最大帮助最大的一本了. 想我大一开始学编程时, 老师的一句话我一直记在心里, 编程一方面要自己多写代码, 另一方面也要多看其他人写的代码. 对于维护一个生产环境下的产品, 一方面要多自己参与各种操作涨经验值, 一方面也要多看其他公司的事故报告, 提升自己的水平. 而回头来说这本书, 这本书就像是一个事故报告的合集. 作者讨论了很多他经历过的各种事故各种生产环境中的幺蛾子, 这能够让你对各种情况下有可能发生什么情况有一个了解. 最近事情多, 否则真该把这本单独拿出来写一个读书笔记, 好好总结下. 另外读完了一个短报告, 说得是Google内部怎么做发布管理, 快速浏览完了Unix Power Tools的第三版, 这本旧书是一直是身不能至心向往之, 不过有机会认真开始读才觉得一方面比较浅显, 对现在的我而言没什么帮助了; 另一方面是有点过时了, 现在很多日常必要的技术在成书时都完全不存在.

听了这个原神的宣传音乐, 把璃月的原声皎月云间之梦加到了Apple Music里面.

PS5上玩了玩FF7, 不过里面的低模让人有点出戏, 如果索尼是在UE5的基础上做重制就好了. 也尝试了一下流放之路, 只不过玩了一个Act后就放弃了, 没太吸引人, 而且不能在任天堂Switch玩实在是没有吸引力. 这个月玩得最多的是Gran Turismo Sport的赛道体验模式, 每天和自己的影子比赛, 一点一点提高, 感觉玩完了以后比较有成就感比较充实, 也比较放松. 手机上玩Everdale, 也还挺放松. 手机上另外在玩Netflix家的Knittens, 免费无内购, 虽然三消再怎么玩也玩不出花来, 不过至少不会太被坑.

TLS

最近搞Spinnaker开放x509加密的API端口, 做了不少的实验. 在这儿尽量用人话加上各种命令样例解释一下.

先来点基础的, 解释一下TLS的工作原理. 作为预备知识, 你得用过公私钥, 比如用私钥来登陆服务器等. 如果这个没用过, 后面这些解释看个热闹也好.

首先说CA根证书, 操作系统/浏览器厂商为了方便用户往往帮我们做了这件事情, 所以很多人不太清楚这部分. 你可以理解成微软/苹果/谷歌在我们的个人电脑里面放了很多CA的公钥. 如果没有这些公钥, 浏览器按照默认配置是无法浏览网页的, 原因是TLS握手无法完成. 作为一个实验, 我们可以执行下面的命令:

#run an alpine linux container
docker run -it alpine sh

#In the container, try to access google.com
wget https://google.com/    # This works

# find the ca-certificates in the image:
cd /etc/ssl/certs && ls -l

# You'll see a `ca-certificates.crt` file there. Now remove it:
rm /etc/ssl/certs/ca-certificates.crt

# Try to access google.com:
wget https://google.com/

# The output would look like:
# Connecting to google.com (142.250.70.238:443)
# ssl_client: google.com: certificate verification failed: unable to get local issuer certificate
# wget: error getting response: Connection reset by peer

上面实验中删除的ca-certificates.crt文件包含了上百个证书. 你在后面可以看到用了查看某一个证书的命令. 顺便的, 这是一个纯文本文件, 所有的证书全部用PEM格式按个放着, 如果高兴的话, 可以写一个脚本来删除某一个证书. 比如文件头部有一个证书是西班牙由政府背书的CA的公钥, 如果删除了这个证书, 我猜访问不少西班牙网站会有问题.

接下来我们看TLS握手. 相比于TCP握手而言, TLS握手会需要验证服务器端的身份. 一般的客户端都会实现对服务器端证书的检测. 为什么? 因为TLS加密相比于HTTP的优势就是可以避免中间人攻击. 现在你就可以看到, 前面我们提及的CA根证书就是为了解决这个问题而诞生的. 如果没有根证书, 你没有办法相信另外一台服务器, 你没有办法辨别它是不是中间人. 顺便说一下, 有些公司里会在发给员工使用的电脑上安装根证书, 通过这些额外的根证书, 这些公司可以在本地充当中间人, 解密TLS流量.

然后说握手, 进行TLS握手时, 客户端(一般是浏览器)有ca根证书, 服务器端有一个被CA签名的TLS证书. 在握手过程中, 双方会协商TLS版本和传输加密的一些技术细节. 接下来客户端会判断服务器端的CA是否可信任, 然后双方商定一个当前TLS会话的加密密钥, 后续的传输都是被这个密钥保护的. 具体的TLS握手可以通过下面的实验来观察:

curl -vvv https://google.com/

请注意, 每次你在浏览TLS保护的网页时, 你的电脑和服务器都会这样一起跳舞.

最后说下自签名的CA, 每个人都可以随时生成一个CA根证书. 但是想想也知道你没有公信力能够让操作系统厂商信任你的根证书, 也不能劝说一个个人或商业公司信任你的CA并用你的证书来签名他们的TLS证书. 一般来说, 自签名的CA都用来实现私有网络中端对端的传输加密.

最后的最后列一些注意事项:

# This command will inspect the metadata in the ca file
openssl x509 -text -in ca.crt

# The CA cert should have x509v3 extensions defined,
# in which `CA:TRUE` should be in the Basic Constraints section
# and `Certificate Sign` be in the Key Usage section.
X509v3 extensions:
    X509v3 Basic Constraints: critical
        CA:TRUE
    X509v3 Key Usage: critical
        Digital Signature, Key Encipherment, Certificate Sign
# This command will inspect the metadata in the certificate file
openssl x509 -text -in gate.crt

# Again, we are expecting x509v3 extensions.
# We should have the SANs covering all the domains that we may use
# And we should have TLS web server/client authn defined in the Extended Key Usage section.
# We are being lazy and using the same set of keys for server/client auth.
X509v3 extensions:
    X509v3 Subject Alternative Name:
        DNS:*.oes.svc, DNS:spin-x509, DNS:localhost
    X509v3 Extended Key Usage:
        TLS Web Server Authentication, TLS Web Client Authentication
keytool -list -keystore gate.jks
# The above command will print out the name and the fingerprint for the certificates in the store. To verify that we have the right file in the store, we can check the fingerprint of each certificate by running:

openssl x509 -noout -fingerprint -sha256 -inform pem -i ca.crt
openssl x509 -noout -fingerprint -sha256 -inform pem -i gate.crt
openssl s_client -showcerts -servername some-server -connect some-server:8083