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

linux shell 踢人下线, kill or terminate unwanted tty/pts

How to kill or terminate unwanted tty/pts sessions in Linux?

Did you ever face this situation, a lot of terminal connections to your server?

Before starting, we have a brief discussion on TTY. The word tty stands for teletype terminals. Some years ago, user terminals were connected to computers’ electromechanical teleprinters or teletypewriters (TeleTYpewriter, TTY), since then the name TTY has continued to be used as the name for the text-only console. Here CryBit going to explain the command-line option to kill unwanted or unused or idle ttys.

We need the PID (Process ID) of that particular terminal (tty). First check the active connections server using the command “w.” Please see the sample output pasted below:

tty
[email protected] [~]# w
 02:05:41 up 234 days, 23:46,  3 users,  load average: 1.47, 1.89, 1.98
USER     TTY      FROM              [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    w3-oc.lolipop-i   23:51   53:49   0.04s  0.04s -bash
root     pts/2    w3-oc.lolipop-i   01:11    0.00s  0.01s  0.01s w
root     pts/3    w3-oc.lolipop-i   01:12   53:32   0.00s  0.00s -bash

Here, you can see three tty connections to your server, pts/0, pts/2 and pts/3 where PTS stands for pseudo terminal. You can also see which processes are currently executing for those tty connections. In this command we could not see the process ID (PID) of those ttys.

We can use the PS command to find out the process ID. Here is the sample output:

# ps -ft tty

Example

[email protected] [~]# ps -ft pts/0
UID          PID    PPID  C STIME TTY          TIME CMD
root      331857  331761  0 Oct09 pts/0    00:00:00 -bash

Here You will get the user info and process ID. Then use kill command to terminate that tty connection.

# kill 

For the above example

# kill 331857

If the process doesn’t gracefully terminate, just as a last option you can forcefully kill by sending a SIGKILL

# kill -9 

Another way; single command to kill tty connections

You can also use the PKILL command along with the switch “-t” to kill a tty connection forcefully. Please see the commend pasted below:

# pkill -9 -t 

Example

# pkill -9 -t pts/0

How to check the current tty/pts session where you connected?

Yup, before going with the kill command, you must have an idea about your tty/pts session. This can be simply checked using the command ps or tty. See the usages pasted below:

Using ps

[[email protected] ~]# ps
  PID TTY          TIME CMD
29849 pts/0    00:00:00 bash
29996 pts/0    00:00:00 ps

Using tty

[[email protected] ~]# tty
/dev/pts/0

tty is the best command!!

That’s it!! Go ahead and kill _/\_
Thanks!

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

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


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,读者可以参考下。

 

 

 

Scroll Reverser – 逆向滚轮[Mac]

Mac OS X 10.7 Lion 里面门槛最高的功能就是默认颠倒了鼠标滚轮的方向。原来向下滚轮页面下滑,而现在恰恰相反。显然,这样使用起来和 iOS 设备更加相像。宰父二狗已经决定完全投入教主怀抱。为了加速放弃原有习惯,在  Mac OS X 10.7 发布之前为自己的雪豹装了 Scroll Reverser。软件唯一功能就是翻转鼠标滚轮方向,和 Lion 中一样。@appinn

https://pilotmoon.com/scrollreverser/

 

为什么 Mac 的鼠标滚轮方向与 PC 相反?

我觉得苹果最傻逼的一点是明明提供了鼠标和触控板分别设定的选项,却必须强迫鼠标也跟随触控板的设定···自然滚动用在鼠标滚轮上特别别扭,但是改过来的话,用触摸板就别扭了

iOS/OS X全新两步验证: 废除恢复密钥功能

 

威锋网讯 7 月 9 日消息,苹果在今天凌晨对 iOS 9 和 OS X El Capitan 的测试版都进行了更新,同时苹果还对一个没有在最新测试版里出现的功能进行了确认:经过改进的两步验证。威锋网消息,一名苹果发言人向 MacWorld 表明,不久之后他们将在 iOS 9 和 OS X El Capitan 当中启用全新的两步验证,其中一个最大特点就是废除恢复密钥功能。

在目前的安全系统下,如果用户同时遗失了可信任的设备和恢复密钥,不仅意味着账号登陆不了,而且还会被迫放弃原有的 Apple ID。

iOS 9 和 El Capitan 的两步验证(two-step verification)经过更新之后,将更名为“双重认证”(暂译two-factor authentication),取消输入 14 位数恢复密钥的验证步骤。如果用户遗失了可信任的设备,苹果客服会提供实时解决方案,帮助用户恢复 Apple ID。这一次改进有望在 iOS 9 和 OS X El Capitan 正式版发布时实现。

“开启双重认证功能之后,在 Mac 和 Windows 设备上通过 iTunes 购物将需要你输入 6 位数的密码,而这一个 6 位数的密码将自动发往你的 iOS 9 又或者是 OS X El Capitan 设备”。

 

http://www.feng.com/apple/news/2015-07-09/IOSOS-X-new-two-step-verification-abolishing-the-restore-key-function_618295.shtml

apple官方应该是在提倡双重验证,逐步停止两步验证,具体看这里:
从两步验证切换至双重认证
和“两步验证”比“双重认证”才是我真正想要的 – ZEALER 社区

 

Recovering From a Kernel Panic Using a Custom ISO linux 急救

https://www.vultr.com/docs/recovering-from-a-kernel-panic-using-a-custom-iso

There are times when we modify our kernels to optimize them, upgrade them, or tinker around with them. Unfortunately for Linux-based operating systems, this means that there is the possibility of kernel panics – the equivalent to a “blue screen of death” on Windows. It’s important that you know how to recover from these, as any KVM VPS (including Vultr) or dedicated server that you use has its own kernel.

For this article, I’ll explain how to recover from a kernel panic on a Vultr VPS. I will be using an ISO from the SystemRescueCd project.

Step 1: Finding the error

From the Vultr control panel, select your VPS and hit VNC console. Attempt to boot the server, and you’ll be able to see the error. Take note of this so that you can repair it.

Step 2: Mounting a custom ISO from the control panel

Click the “ISO” option, and input the SystemRescueCd ISO URL. You may visit the official site for newer images.

http://iweb.dl.sourceforge.net/project/systemrescuecd/sysresccd-x86/4.5.3/systemrescuecd-x86-4.5.3.iso

vultr_upload_iso.png

From there, head back to your VPS controls and click “Mount ISO”.

You will be greeted with a pop-up screen by pressing the VNC console. Click “Enter” on the first option, and your system will start up.

start_up.png

Step 3: Rescuing your kernel

Now that you have access to a shell prompt, create a directory to mount your VPS’s disk.

mkdir /rescuedisk

Now, mount the disk.

mount /dev/vda1 /rescuedisk

You now have access to your files. At this point, you can choose whether to copy your files to a remote server, or research the kernel panic’s message that you took note of earlier.

An example of a kernel panic issue would be a missing /etc/shadow file, or any missing system file. You could replace a missing file with a backup by copying over /etc/shadow- to /etc/shadow. For example:

cd /rescuedisk
cp etc/shadow- etc/shadow

Once you have finished fixing the issue, unmount the ISO from the Vultr control panel and reboot your VPS by typing reboot in the prompt. If your issue was fixed, then your VPS will boot normally.

Chrome 60 地址栏快速查看 SSL 证书信息

Chrome功能回归:点击挂锁查看SSL证书信息

轻松查看SSL证书信息

运行最新版Chrome 60的用户,可以通过浏览器地址栏的安全挂锁,轻松两步即可查看网站SSL证书颁发者、使用者及有效期等详细信息。

(1)点击地址栏挂锁图标

(2)在下拉的“页面信息”栏中点击“有效”

此外,Chrome还新增了一个功能,鼠标悬停在“有效”按钮上,立即浮现SSL证书颁发者信息,不过只有当网站部署有效SSL证书时才会展示,可防止任意形式的欺诈和恶意软件的蓄意混淆。

它的展示是这样的:

不过,有关TLS版本、加密算法等有关HTTPS连接和配置的信息,仍然需要到“开发者工具”中的“Security”标签下查看。

如何设置该功能

该功能目前处于关闭状态,直到Chrome完成对“页面信息”菜单的修复。您只需按照以下简短说明启用该功能,就可以立即体验。

(1)将chrome://flags/#show-cert-link复制粘贴到地址栏中

(2)在该页面找到‘Show certificate link’,点击“启用”(如下图)

(3)在页面下方点击“立即重新启动Chrome”

浏览器重启后,就可以使用该功能啦。

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 如何修改内核启动默认顺序