Ocsp Stapling 和iOS界面卡顿问题

原文:https://jhuo.ca/post/ocsp-stapling-letsencrypt/

这个问题成功的吸引了我的注意。

起因:一个Flutter写的app在iOS上偶尔会发生了界面卡顿甚至冻结10多秒,但在Android正常。

开始这个问题没太引起重视,觉得是flutter的问题。但后来随着dart的issue里面报告的人逐渐多起来,看起来不是那么简单。不过非常令人迷惑的是这个现象只在iOS偶尔出现,Android从来不出现,这种不确定性使得重现和调试非常困难。

在issue里面发现报告的人大部分疑似是中国用户,之后发现有人提到更换了阿里云证书之后问题不再重现,这使得我们把问题方向放在https上。最终发现服务器的OCSP Stapling失效,造成了soft failure。之后的行为要看客户端实现,有的浏览器接受soft failure,不进行客户端检查,一切正常。但有一些客户端比如Safari会自己去检查了OCSP状态,从而造成界面无响应。检查nginx log发现ocsp.int-x3.letsencrypt.org请求超时,随后确认此域名遭到了DNS污染。

在服务器开启OCSP Stapling对于提升速度帮助很大。所以无论如何也是应该开启的。

但是仍然有两个问题没有解释:

  1. 为什么Android没问题,iOS有问题
  2. 为什么有时候可以重现,有时候不可以重现

为了回答这几个问题,顺便找一个解决方案,我顺着读了一圈代码和协议,从nginx到openssl,从tls到ocsp。最后终于能回答这两个问题了。

1 Android没有问题的原因是,Google不满意ocsp这个解决方案,所以所有google的产品,无论是android还是chrome都不进行ocsp检查。

ocsp作用是检查证书状态,尤其是是否吊销,Google认为检查证书状态并不能增加安全性,并且导致https请求时间变长,并且ocsp服务器本身也可能会出问题,这不是一个可靠的方案。Google通过分发一个列表到本地来解决证书检查问题。当然有人提出争议说分发列表这个过程会因为升级服务器被屏蔽而失效,Google认为如果能屏蔽我们的升级服务器,那么屏蔽ocsp服务器岂不是更容易?所以从2012年开始,Google就逐步取消了ocsp检查。

2 为什么有时候可以,有时候不可以

读nginx代码,发现nginx会把ocsp请求结果放在内存里面,直到过期之前才会再次请求ocsp服务器更新状态。但是如果重启了nginx,内存里面的结果就丢掉了,下一次就会直接请求ocsp服务器。

letsencrypt使用akamai cdn分发ocsp状态,实际上遭到DNS污染的似乎是akamai.net的某一部分节点,应该还有少量没被污染。所以有时候还能取得正确的结果,一旦取得正确的结果之后,在下次nginx重启/ocsp过期之前就会变得一切正常。这使得重现它更加困难。

代码读完之后,也就知道了解决方案:

  • 使用 ssl_stapling_file 配置,从一个外部文件获取ocsp信息 ngx_ssl_stapling_file
  • 使用 ssl_stapling_responder配置,nginx会用这个设置覆盖证书里面的Authority Information Access信息,使得请求ocsp被发送到设置的服务器

两者之间我更倾向后者,后者灵活的多,也省去了跨机器更新文件的麻烦,顺便还能解决以后其它麻烦。

我首先想按照ocsp协议写一个简单的responder,不过搜索之后发现有人很多年前写过一段非常简单的转发代码,直接把请求转发给指定的服务器。虽然必须要设置一个固定的转发服务器(因为原始的Authority Information Access信息被nginx覆盖了)。我想更好的解决方案是修改一下nginx的代码,在这个http请求中把原始的AIA放到header里面一起发给代理,不过考虑到大部分人都会把所有证书集中在一个供应商,设置一个转发地址完全能解决问题。而且避免每次升级给nginx重新打补丁的麻烦。所以就不改了。

我稍微修改了一下这个代码,让程序可以从环境变量获得转发地址,以便于使用docker部署。新的代码在这里: https://github.com/virushuo/ocsp-proxy

部署好了之后在nginx.conf里面增加配置:

1 2 3 4 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/ssl/ca-certs.pem; ssl_stapling_responder http://YOUR_PROXY_IP:8080/;

Author Huo Ju

LastMod 2020-04-29

用 https://www.digicert.com/help/ 果然 nginx 默认没有开启 ocsp stapling

关闭阿里云中国区的推广电话骚扰

从其他地方看到的一个开关,关闭后果然再也没有打过电话给我了。分享一下给大家


1、前由

阿里云中国区于 2018 年冬季推出阿里云轻量应用服务器香港地区,其优惠的价格 24 元/月 与好看的香港带宽 30Mb 吸引了很多人的目光,在香港人均 10 刀起步 10Mb 小水管的寸土寸金之地炸出一地鸡毛。

由于刚开始发售时被”电信用户群”发现速度和延迟非常好并且由于是香港自带香港的无墙网络服务,几天之内迅速产生了大量电信用户,也间接导致香港侧网络运营商直接把电信的流量 QOS 丢包。

而慢慢没几天,用户就开始接到阿里云拨打的电话,向你推荐阿里云中国区的各类服务器,此类电话差不多半个月就有一个,不受其烦。而有一位阿里云用户(找不到出处)发现了阿里云隐藏的猫腻,阿里云日本区比阿里云中国区多了一个和隐私有关的开关,而这个开关在中国区被”特意”的隐藏了。


2、开关位置

首先你需要登陆阿里云,登陆完毕后打开下面的这个网址,在此感谢发现者(本站所能找到的最早的是夜桜的网页 [ 链接 ] )

https://account.console.aliyun.com/#/privacy

此时你可以打开一个默认浏览器页面找不到的网页,而这个网页实际存在并且在日本区是可以从菜单找到的

“我不愿意收到来自阿里云的电话服务,包括如何更好使用阿里云产品及服务,或产品发布以及促销活动的信息。”

默认这条内容是不勾选的,你只需要勾选这个,然后再清理掉阿里云的营销消息通知中的短信通知,就可以清静


3、安骑士

阿里云的安骑士可以说是臭名昭著了,而很多用户用着用着莫名就收到了站内信提示你的服务器有违规内容时,就是它在起作用

阿里云的安骑士官方卸载说明 [ 链接 ]

如果觉得官方的不保准,你还可以使用 Vps2arch 之类的利用内存的 Linux 重装脚本

本站额外也有一份 CentOS 重装的链接 [ 链接 ]

第四,Time Machine 备份。

Time Machine 可以说是 Mac 平台目前最好的备份方案。Time Machine 真得像是时光机,可以自由穿梭到任何一个可以去到的地方。我们可以准备一个移动硬盘,选择非工作时间,将硬盘插入硬盘,打开 Time Machine,开启自动备份,让 Mac 在晚上继续飞吧。至于 Time Machine 专用移动硬盘需要多大,这个因人而异,取决于你的钱包和备份频率。一般用于 Time Machine 的专用移动硬盘至少是 Mac 硬盘总空间的 2 倍以上。Time Machine 第一次备份是全量备份,会占用比较大的磁盘空间,当然我们可以排除不必要的文件。第一次全量备份之后,以后的备份都是增量备份,占用空间会比较小。这里有一个建议,Time Machine 开启加密备份。读者想想啊,Time Machine 备份可是 Mac 的全量拷贝,如果没有加密,假如移动硬盘丢失,别人拿到之后就可以完整地恢复,细思恐极。为了最大程度保障数据的安全,我们需要开启加密备份。这里有个技巧,不要在 Time Machine 设置加密,而是利用磁盘工具将移动硬盘加密,每次备份之前输入磁盘的加密密码,这样备份过程才会比较顺畅。如果使用 Time Machine 提供的加密,它的机制是等备份完成再加密,你将会发现从晚上等到第二天白天,进度条还在那里,不增不减,很是恼人。另外,在 AppSo 还有一系列 Time Machine 使用教程 1,读者可以参考下。

 

 

 

Linux CentOS 7.X 如何修改内核启动默认顺序

我们知道,centos 6.x是通过/etc/grub.conf就行内核启动顺序修改的,而且比较直观查看。但centos 7的系统和6就不一样了,是通过grub2为引导程序。下边简单说下centos 7的内核启动顺序如何修改。
1,首先查看当前系统有几个内核。比如:

[[email protected] ~]# cat /boot/grub2/grub.cfg |grep menuentry
if [ x”${feature_menuentry_id}” = xy ]; then
menuentry_id_option=”–id”
menuentry_id_option=””
export menuentry_id_option
menuentry ‘CentOS Linux (3.10.0-327.22.2.el7.x86_64) 7 (Core)’ –class centos –class gnu-linux –class gnu –class os –unrestricted $menuentry_id_option ‘gnulinux-3.10.0-327.el7.x86_64-advanced-80b9b662-0a1d-4e84-b07b-c1bf19e72d97’ {
menuentry ‘CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)’ –class centos –class gnu-linux –class gnu –class os –unrestricted $menuentry_id_option ‘gnulinux-3.10.0-327.el7.x86_64-advanced-80b9b662-0a1d-4e84-b07b-c1bf19e72d97’ {
menuentry ‘CentOS Linux (0-rescue-7d26c16f128042a684ea474c9e2c240f) 7 (Core)’ –class centos –class gnu-linux –class gnu –class os –unrestricted $menuentry_id_option ‘gnulinux-0-rescue-7d26c16f128042a684ea474c9e2c240f-advanced-80b9b662-0a1d-4e84-b07b-c1bf19e72d97’ {

2,设置默认的启动内核。比如我们选择上边中的CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)这个内核为默认启动。

grub2-set-default “CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)” 配置默认内核
验证是否修改成功:

[[email protected] ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3,重启机器观察。
重启成功以后查看下机器的内核是不是该内核:

[[email protected] ~]# uname -r
3.10.0-327.el7.x86_64
说明:该教程针对正常的centos 7.x是没有问题的,但是比如对linode这种服务器是不管用的,这里被坑的厉害!linode是他们后台自己设置了启动顺序的。如果要自己可以修改,需后台编辑这个host并设置grub2,否则你怎么修改都不会成功。

转载请注明:21运维 » Linux CentOS 7.X 如何修改内核启动默认顺序

取消 yum 损坏。Broke Fedora after accidentally cancelled yum update

https://serverfault.com/questions/681486/broke-fedora-after-accidentally-cancelled-yum-update

 

I just did the same thing on a Fedora 22 system. I couldn’t upgrade or reinstall any of the packages. Running package-cleanup –cleandups wanted to remove glibc, which wanted to pretty much all of the packages on the system.

To resolve the issue, I performed a distro-sync on all of the duplicate packages.

sudo package-cleanup --dupes | perl -pe 's/-\d+.*$//' | sort -u | grep -vP '^Loaded' | xargs sudo dnf distro-sync -y

Then followed up with

sudo dnf upgrade
sudo package-cleanup --cleandupes

电信 光纤猫 贝尔E8-C-EPON 破解超级管理员密码

第二步、以用户名:“telecomadmin” 密码:“nE7jA%5m”登录设备。

二、破解超级管理员密码

1、打开 http://192.168.1.1,用光纤猫上的账户密码进行登录。

2、下载 http://192.168.1.1/backupsettings.conf

3、用记事本或者任何能打开 .conf 的软件(比如 SublimeText)打开backupsettings.conf,然后 ctrl+f 查找 Password,这就是你的超级管理员密码。

4、再次打开 http://192.168.1.1,如果之前的还登陆着,先退出,然后用账号名为 telecomadmin,密码为你之前找到的 Password 进行登录。现在我们就能看到完整的设置界面了。

TCPing 工具介绍

TCPing 介绍

TCPing 和 Ping 工具非常类似,但与之不同的是,它通过 TCP 端口工作。TCPing 还支持监听具体某个端口的状态。

因此,即使服务器禁止 Ping,也可以通过 TCPing 来测试与服务器的连接。

TCPing 客户端下载

来自 kirchner 源代码的 TCPing

来自 Eli Fulkerson 源代码的 TCPing

来自 richard 源代码的 TCPing

Eli Fulkerson 写的 TCPing 工具更加强大,可以输出连接时间等信息。而 kirchner 的版本只能输出此端口是否打开。

Linux 用户如果需要更加强大的 TCPing 工具,可以使用此脚本:

安装方法:

  1. 安装 tcptraceroute:

Debian / Ubuntu 用户:

sudo apt-get install tcptraceroute

CentOS / REHL 用户,设置 RepoForge 先,再:

sudo yum install tcptraceroute
  1. 下载 tcpping 脚本:
cd /usr/bin
sudo wget http://www.vdberg.org/~richard/tcpping
sudo chmod 755 tcpping

TCPing 工具使用方法

  • Windows 用户可以将其放入 X:\Windows\System32 文件夹下(X 代表系统分区),然后就可以直接在 CMD 命令行中使用。
  • 类 Unix 系统请自行在 /bin 或其他目录下放置可执行文件或软链接。

具体用法可参见各客户端原网站。

 

 

from : http://tookdes.org/geek/archives/tcping-intro.html

How to upload to Google Cloud Storage buckets using CURL

Signed URLs are pretty nifty feature given by Google Cloud Platform to let anyone access your cloud storage (bucket or any file in the bucket) without need to sign in.

Official documentation gives step by step details as to how to read/write to the bucket using gsutil or through a program. This article will tell you how to upload a file to the bucket using curl so that any client which doesn’t have cloud SDK installed can do this using a simple script.
This command creates a signed PUT URL for your bucket.
 gsutil signurl -c 'text/plain' -m PUT serviceAccount.json gs://test_bucket_location  

Here is my URL:

 https://storage.googleapis.com/[email protected]&Expires=1490266627&Signature=UfKBNHWtjLKSBEcUQUKDeQtSQV6YCleE9hGG%2BCxVEjDOmkDxwkC%2BPtEg63pjDBHyKhVOnhspP1%2FAVSr%2B%2Fty8Ps7MSQ0lM2YHkbPeqjTiUcAfsbdcuXUMbe3p8FysRUFMe2dSikehBJWtbYtjb%2BNCw3L09c7fLFyAoJafIcnoIz7iJGP%2Br6gAUkSnZXgbVjr6wjN%2FIaudXIqAxyz4O6VU%2FIob8RHmfYBD3rYw8oRmZer0g%2BMTDw5Bu3%2BdjbxCriCOkOLWkvlpBGvd71hRP89lxpD%2FwX1N1pzAiRBpmKAhpKrYrq8h4kNLAtTHXYSz5j%2Bzb28UD4YMG52n8UpfyPgFIg%3D%3D  

Now this command will upload a text file to the bucket using the signed URL we created:

 $ curl -X PUT -H 'content-type: text/plain' -d @test_upload.txt https://storage.googleapis.com/[email protected]&Expires=1490266627&Signature=UfKBNHWtjLKSBEcUQUKDeQtSQV6YCleE9hGG%2BCxVEjDOmkDxwkC%2BPtEg63pjDBHyKhVOnhspP1%2FAVSr%2B%2Fty8Ps7MSQ0lM2YHkbPeqjTiUcAfsbdcuXUMbe3p8FysRUFMe2dSikehBJWtbYtjb%2BNCw3L09c7fLFyAoJafIcnoIz7iJGP%2Br6gAUkSnZXgbVjr6wjN%2FIaudXIqAxyz4O6VU%2FIob8RHmfYBD3rYw8oRmZer0g%2BMTDw5Bu3%2BdjbxCriCOkOLWkvlpBGvd71hRP89lxpD%2FwX1N1pzAiRBpmKAhpKrYrq8h4kNLAtTHXYSz5j%2Bzb28UD4YMG52n8UpfyPgFIg%3D%3D  

On similar lines, you can create a RESUMABLE URL and then upload file using following command:

 $ curl -v -X 'POST' -H 'content-type: text/plain' -H 'x-goog-resumable:start' '[signed url]' -d ''  

This command gives ‘session URI’ which is similar to signed url, but longer!

 $ curl -v -X PUT -d @test_upload.txt -H 'content-type: text/plain' '[session URI]'  

Simple isn’t it!

 

 

 

http://opreview.blogspot.jp/2017/03/how-to-upload-to-google-cloud-storage.html