隐藏服务器证书信息防止证书嗅探

 Technique  3 comments

一般情况下想将网站隐匿都会对接 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/ 中即可。

测试

以下图片为谷歌测试截图,仅供参考,效果相同。

附录

参考链接

回复
  1. Jack

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

    Chrome 78 Windows 10 回复
    1. zongsir
      @Jack

      不知道,你问问博主

      Chrome 78 macOS Mojave 回复
    2. 飞翔的企鹅
      @Jack

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

      旗鱼浏览器 1.12 Android Pie 回复