openssl证书链验证

证书链

浏览器是怎么保证访问的网站是正经的官方网站而不是其他的钓鱼网站呢,Chome浏览器访问网站时,可信任的网站地址旁边会有一个绿色的锁标准,表明该网站是可信任的,它是怎么知道该网站是可信任的呢。

因为浏览器会内置一些证书,其他证书都是有这些证书签发的, 通过内置的证书来验证其他证书的有效性。这些浏览器内置的证书叫做Root CA(根CA证书), 其他网站的证书都是由Root CA证书一层一层往下签发的。

证书认证原理

  1. 服务器首先生成一个密钥对,把公钥提交给CA
  2. CA用自己的私钥对服务器提供的公钥进行签名得到证书
  3. https服务器在与客户端进行连接的时候会将证书和公钥一起发给客户端,客户端用CA的公钥对证书进行验证,对比一致则证明该证书确实是CA发布的。

一次DNS服务器BUG调试

背景

公司做了一个DNS服务器,测试没问题了,架设到网关上使用,出现了电脑能解析域名,手机不能解析的情况问题。

问题解决过程

有时候找到问题在哪比解决问题本身更难。同一个路由器的下的电脑能访问,手机不能访问。先在网关上进行抓包,分析手机发送的DNS请求和电脑发送的DNS请求有什么不同,无果,手机和电脑发送的DNS请求并没有什么不同,服务器端返回的响应也一样。找了一下午也没有找到。有时候找bug就像写作一样,当写不出东西的时候不如出去走走,弄不好灵感就来了。第二天偶然发现手机上并不是所有的域名都不能解析,有个别的域名还是能访问的,又进行了一些域名进行尝试,总结出一个规律:知名的网站大多数不能访问比如百度、腾讯、网易等等,而一些不知名的小网站能够访问。尝试尝试自己注册的域名,果然能访问。有突破口就好办了,然后开始分析公共DNS服务器返回的大网站和小网站的DNS报文有什么不同。

bind中基数树的建立

BIND9新引入了视图的概念,简单的来讲就是能根据不同的来源IP来返回不同的数据。其中网段的存储,网段的快速匹配都是用基数树来实现的。下面是BIND创建基数树的代码。

相关结构体

BIND的IP地址结构

1
2
3
4
5
6
7
8
9
10
11
struct isc_netaddr {
unsigned int family;
union {
struct in_addr in;
struct in6_addr in6;
#ifdef ISC_PLATFORM_HAVESYSUNH
char un[sizeof(((struct sockaddr_un *)0)->sun_path)];
#endif
} type;
isc_uint32_t zone;
};