隐藏服务器证书信息防止证书嗅探
后知后觉 现有 7 评论

避免 CDN 后的真实服务器被侦测到,实际上还应该配置虚拟空机头。

一般情况下想将网站隐匿都会对接 CDN,将源站放在 CDN 后,保护真实 IP 地址不暴露,实际上只如此操作并不是安全(相对的)的,因为服务器依然对外开放,即使不清楚主机 (Host) 信息,依然可以使用 TLS 模拟握手工具嗅探到服务部署的证书,即可获取服务器绑定的域名(虽然也不一定是真正的服务器地址,比如也可能是负载均衡器等中间件的地址)。

服务配置

为了防止空主机头请求泄漏信息,可以配置虚假的默认虚拟主机进行规避,添加以下内容到 NGX 配置文件,比如命名为 invalid.conf 放入 conf.d 目录即可。

server {
    listen       80 default_server;
    server_name  localhost;

    location / {
        return  404;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       443 ssl http2 default_server;
    server_name  localhost;

    ssl_protocols              TLSv1.2 TLSv1.3;
    ssl_certificate            cert.d/invalid.com/server.crt;
    ssl_certificate_key        cert.d/invalid.com/server.key;

    location / {
        return 444;
    }
}
小贴士:返回码 444 是 NGINX 特有返回码,不返回信息直接丢弃请求。

还有一点需要注意

整个 Web 服务器的加密算法和协议都使用配置最低的虚拟主机配置,因此若使用了类似 HTTP/2 和 TLSv1.3 或者自定了加密套件的优先级等需要同步到此虚拟主机配置中,否则都将被默认降级至 TLSv1.2 和默认加密套件。

自签证书

为了保护 HTTPS 证书还需要个人签发一个假证书用于 443 端口,生成自签证书步骤如下。

生成私钥

openssl genrsa -des3 -out server.key 2048
小贴士:此命令生成 RSA 型私钥,使用 des3 算法,密钥强度 2048 位,必须为私钥添加密钥(至少 4 位)。

生成 CSR

openssl req -new -key server.key -out server.csr
小贴士:需要依次输入国家,地区,城市,组织,组织单位,Common Name 和 Email。因为是为了防止嗅探,因此可以胡乱填写,可以按谷歌的假证书进行配置,PING 谷歌得到地址后,访问 https://ip 即可查看假证书信息,按照其填写即可。

去除密码

在第一步中创建的私钥是有密码的,在使用时不方法,因此需要去除私钥中的密码。

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

生成证书

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
小贴士:生成后将证书移动至上述配置中的证书文件夹中即可。比如 /etc/nginx/cert.d/invalid.com/ 中即可。

测试

使用浏览器访问 https://ip 即可看到伪造的证书。这样就不会泄漏源站的域名信息。


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。
  1. avatarImg 果然

    如何使用呢?

    Chrome 79.0 macOS Catalina
    IP 属地 未知
  2. avatarImg 心灵博客

    意思是攻击者大量的扫ip 443 ,然后获取域名?

    Chrome 75.0 macOS Mojave
    IP 属地 未知
    1. avatarImg
      @心灵博客

      上面评论的兄弟说的对,一般这个都是用来探测某网站的源站,扫描 IPv4 全网的 443 端口(工作量和耗时并没有想象中大)即可探测到某个域名的源站在哪。

      Chrome 79.0 macOS Catalina
      IP 属地 未知
    2. avatarImg Ming
      @心灵博客

      我的理解应该是用这种方式进行寻找源站更好,所谓的攻击应该不算

      Chrome 79.0 Windows 10
      IP 属地 未知
  3. avatarImg Jack

    请问这种操作后还需要上 CDN 么?

    Chrome 78.0 Windows 10
    IP 属地 未知
    1. avatarImg zongsir
      @Jack

      不知道,你问问博主

      Chrome 78.0 macOS Mojave
      IP 属地 未知
    2. avatarImg 飞翔的企鹅
      @Jack

      我觉得应该是没关系的,毕竟目的不同。

      Chrome 72.0 Android Pie
      IP 属地 未知