自签名证书部署在本地伪造成可信站点的方法[chrome58以后也适用]

需求:

由于你懂的原因,某些在线公共资源成为不可访问。 比如一些CDN服务器提供的jQuery文件,字体等。 但是越来越多的网站内嵌的资源是来自这些CDN服务器的。 比如GitHub用的是ajax.googleapis.com提供的jQuery库。
办法:

在本地部署一个站点,修改host把ajax.googleapis.com指向本地ip地址,比如127.0.0.1。

问题出现
如果是http方式的话,这样就可以了。 在本地站点里建立和远程一致的目录结构就可以了。但是一般这些CDN都是https的,因此需要自签名一个证书给本地web服务器使用(nginx或者apache)。如果是IE或者Chrome版本较低的话生成证书导入系统,OK。
更复杂的问题
Chrome58以后对https的证书认证较为严格,证书里必须带有正确的Common Name,也就是必须有DNS Name=ajax.googleapis.com, IP Address=127.0.0.1这样的信息,浏览器才认为真正安全。

步骤

1. 安装或者编译一个OpenSSL, 在bin目录里有OpenSSL可执行程序 (Linux, Windows, MacOX 都可以的)
2. 修改openssl.cnf文件。
在[ req ]一节下找到req_extensions = v3_req 取消注释(去掉#号)
在[ v3_req ] 一节 增加 subjectAltName = @alt_names
在[ v3_req ] 一节 的上方增加一节

[ alt_names ]
DNS.1 = ajax.googleapis.com
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 192.168.11.70

3. 开始正常的步骤制作证书, 简单贴几个命令,想知道这些命令的详细含义,可以在网上搜索资料“用OpenSSL生成Nginx证书”

(注意命令不能换行)


openssl genrsa -des3 -out googleapis.key 2048
openssl req -new -sha256 -key googleapis.key -out googleapis.csr //这一步会填一些东西,随便填
openssl x509 -req -days 3650 -in googleapis.csr -signkey googleapis.key -out googleapis.cer -extensions v3_req -extfile C:/openssl_out/ssl/openssl.cnf

4. 安装googleapis.cer到系统中(Windows的是双击,选择安装证书)
5. 把googleapis.key和googleapis.cer的路径配置到nginx服务器里。
6. 修改host文件,让ajax.googleapis.com指向你的服务器地址(127.0.0.1)

验证结果
查看证书 应该包含 基本约束,密钥约束和使用者可选名称这3项, 使用者可选名称里有DNS.1 = ajax.googleapis.com这样的内容
浏览器访问https://ajax.googleapis.com是绿色的锁。