使用mkcert生成的根证书,只和本机有关,其他主机安装以后,也只会识别本机生成的证书。其他主机使用mkcert -install以后生成的rootCA根证书,不会识别本机的证书,且其他主机生成的证书,也不会被安装了本机 rootCA 的主机识别。

这里可以直接使用windows版本的 mkcert-v1.4.4-windows-amd64.exe ,改名为mkcert.exe,不改也行。

执行命令安装RootCA,提示框选‘是’确认安装即可

.\mkcert.exe -install

查看RootCA安装位置

.\mkcert.exe -CAROOT

我这里显示的是 C:\Users\admin\AppData\Local\mkcert,打开路径,有两个文件

  • rootCA.pem (公钥,可以改成 .crt 后缀,用于系统信任根证书)
  • rootCA-key.pem (私钥,可以用于添加防火墙信任)
  • 这里将 rootCA.pem 复制一份,备份更名为 rootCA.crt

    为IP生成证书,后面可以跟多个IP或者域名,空格隔开即可,会在mkcert.exe同级目录生成 x.pem和x-key.pem ,有几个域名就会有几组这个文件

    .\mkcert.exe 192.168.110.192
    #也可以跟多组,这样一个证书文件可以达到配置识别多个IP或者域名的效果
    #如 .\mkcert.exe 192.168.110.192 123.123.x.x shengzilong.com
    

    我这里生成了两个文件

  • 192.168.110.192.pem
  • 192.168.110.192-key.pem
  • 到这一步已经可以直接放在nginx中当做ssl使用,如下配置即可

    listen 8888 ssl;
    ssl_certificate      /opt/192.168.110.192.pem;
    ssl_certificate_key  /opt/192.168.110.192-key.pem;
    

    根证书安装包制作

    要使前端浏览器信任证书,就要用户主动安装之前的 rootCA.crt ,因此需要做一个安装包

    证书导入代码编译

  • 编译一个基于 .NetFramework4.5 的 console 即可.也可以根据需要使用 clickonce 发布为自动下载依赖包的运行包,或者直接使用最小编译。这里生成了一个名为 InstallCert.exe 的可执行文件。
    using System.Security.Cryptography.X509Certificates;
    /**安装CA的根证书到受信任根证书颁发机构**/
    //根证书文件路径,这里直接配置为程序运行目录下,也可以指定其他目录,但是需要配置InnoSetup安装时释放文件到对应目录
    var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "rootCA.crt");
    var certificate = new X509Certificate2(filepath);
    var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadWrite);
    store.Remove(certificate);
    store.Add(certificate);
    store.Close();
    
  • console编译时要添加一个权限申请,可以在项目上右键属性,选择安全性->启用ClickOnce,保存后取消选择再保存
  • 此时生成了一个 app.manifest 文件,将权限申请改为 requireAdministrator 。

    使用 InnoSetup 制作安装包

  • 下载 InnoSetup
  • 安装后打开 InnoSetup ,点击 file->new 打开创建向导,填写一些基本属性
  • 这里取消所有选项,使用默认应用文件夹释放文件。如果证书导入代码console里不是使用程序运行目录,则这一步需要指定相应的文件释放目录。
  • 可执行文件选择之前生成的exe,其他应用文件添加之前生成的 rootCA.crt 证书。同时这里勾选允许用户在安装后直接运行应用。
  • 这一步默认
  • 这一步取消所有选项,不需要多次安装或者添加到开始菜单
  • 这一步如果有授权文件或者要在安装前后展示的内容可以添加,这里留空。
  • 这一步就是选择为所有用户安装还是为当前账户安装,也可以由用户选择。因为这里只用到打包执行的功能,因此选任何一个都行。这里选择了为所有用户安装。
  • 语言这块默认即可
  • 这里选择编译后的安装包的输出文件夹,随意选择本机一个目录即可,安装包命名也随意即可
  • 最后一步提示是否直接编译,第一次编译的话这里选择否,因为要配置管理员权限运行
  • 选择否以后,会打开刚才生成的打包文件,这里主要关注权限申请,将图示内容修改一下
  • 取消注释修改为admin
  • 保存一下当前的打包文件
  • 打开 InnoSetup 的安装目录,找到 SetupLdr.e32 文件
  • 使用 ResourceHacker 打开,如图找到 Manifest 中权限申请部分
  • 将 asInvoker 修改为 requireAdministrator
  • 点击三角箭头编译,点击保存按钮保存
  • 原始的e32文件将会被备份
  • 现在再次打开InnoSetup,可以选择使用管理员权限打开,选择刚才保存的打包文件
  • 点击编译按钮
  • 输出栏输出编译成功提示信息
  • 在之前选择的安装文件输出目录下,可以看到安装文件生成了
  • 运行生成的安装文件
  • 确认直接运行,会有一个小黑框一闪而过,就是执行了证书安装程序。
  • 现在打开证书管理器确认一下
  • 在受信任的根证书颁发机构中,已经添加了mkcert生成的根证书了
  • 而现在再打开nginx中配置了mkcert证书的界面,浏览器也提示连接安全小绿锁了。
  •