内网环境自签名超长期HTTPS证书,并在Chrome中显示为安全证书
环境说明:本环境在AD域内(方便使用组策略安装证书),内网环境,Chrome为当前最新版130+,如果没有AD域的,就得想办法给所有电脑安装证书,比如说使用桌管等软件下发Bat。
用到的工具有:Openssl、域组策略
先决条件:
生成证书的终端需已安装OpenSSL,安装过程如下
1 下载 OpenSSL 安装包
https://slproweb.com/products/Win32OpenSSL.html
根据你的系统选择版本: Windows 64 位系统 ➜ 选择 Win64 OpenSSL
Windows 32 位系统 ➜ 选择 Win32 OpenSSL
通常选择: Win64 OpenSSL v3.x Light(较小安装包) 或 Win64 OpenSSL v3.x(完整版)
2 运行安装程序 下载后双击 .exe 安装文件运行。 (安装时提示找不到 Visual C++ redistributables? 官网下载:https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist )
安装路径可以使用默认路径,选“将 OpenSSL 的 bin 目录添加到系统 PATH”选项
3 验证是否安装成功 打开命令行(cmd)或 PowerShell,输入:openssl version
4 安装后提示找不到 openssl 命令
可能是系统没有添加 OpenSSL/bin 到环境变量。
你可以手动设置环境变量: 打开系统环境变量设置: 控制面板 ➜ 系统 ➜ 高级系统设置 ➜ 环境变量 在系统变量中找到 Path,添加安装路径如C:\Program Files\OpenSSL-Win64\bin
确认后重新打开终端即可。
操作步骤:
一、生成自签名证书
1. 进入CMD,找一个或者新建一个目录,用来放置生成的文件
mkdir、cd等,具体命令略。
2. 生成私钥
openssl genrsa -out server.key 2048
3. 生成请求文件
openssl req -new -key server.key -out server.csr -sha256
4. 在当前目录创建一个san.cnf文本文件,写入下列内容,其中三个www.test.com,要替换为你要签名的完整域名,此步骤不可省略,若省略,Chrome会报告缺少SAN字段,证书不安全。
[req]distinguished_name=req_distinguished_namereq_extensions=req_extprompt=no[req_distinguished_name]CN=www.test.com[req_ext]subjectAltName=DNS:www.test.com,DNS:www.test.com
CMD执行命令,其中7300是有效期天数,即20年,chrome要求使用安全等级高一些的哈希算法,所以签名参数用的sha256,如果不指定默认使用sha1,对于sha1,Chrome会报不安全。
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout server.key -out server.crt -config san.cnf -extensions req_ext -sha256
5. 验证证书是否正确
openssl x509 -in server.crt -noout -text
到这一步就已经有了公钥、私钥文件了,可以正常使用了。
6. (附)生成PFX证书交换文件
PFX 是微软和很多企业系统(比如 IIS、Windows AD、Azure、Java keystore)用来部署证书的标准格式,适合一次性导入所有相关内容。
执行CMD命令,通过刚刚公私钥文件来生成PFX文件。
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
二、组策略信任证书(如果没有AD域的,就想办法下发这个证书给终端并且安装)
1. 配置所有计算机自动信任根证书颁发机构证书
在任意一台DC上进入组策略管理,推荐在“Default Domain Policy”进行配置,组策略路径如下(例图),进入之后,右键导入,将刚刚的server.crt导入进去就行了。
2. 终端同步组策略
gpupdate /force
3. 完成
这个时候,用户打开装载了这个证书的网站,只要域名和证书里的域名一致,Chrome就会显示安全的证书了
如果还是提示不安全:
①使用无痕浏览模式,或清理浏览器缓存重新进入网站
②可以通过浏览器F12 - 安全(Security)来查看不安全的原因
三、(附)自行测试证书安全
如果只是在测试环境确定一下这种方式是否可行,可以用一个简单的python程序来模拟网站,装载证书,然后在C:\windows\system32\drivers\etc\host这里,改一下host,把目标域名指向127.0.0.1,运行这个python程序,然后直接在浏览器直接打开https://目标域名:4443,就能访问本机这个demo,来测试证书是否可用。
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
port = 4443
httpd = HTTPServer(('127.0.0.1', port), SimpleHTTPRequestHandler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='server.crt', keyfile='server.key') # 正确加载证书
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print(f"Serving on https://localhost:{port}")
httpd.serve_forever()