• OpenSSL 生成 RootCA (根证书)并自签署证书(支持 IP 地址)


    背景

    某机房内部访问需要配置 HTTPS,网上找的一些证书教程都不是特别好,有些直接生成证书,没有根 CA 的证书导致信任不了 Ubuntu 机器,有些教程只有域名生成,没有 IP 生成,有些甚至报错。故发一个笔者在 Ubuntu 22.04 机器上测试正确可用的流程,这里使用 10.12.0.2 作为例子生成一个证书。

    生成

    1. 生成根 CA 的私钥和证书

      # 生成根 CA 的私钥
      openssl genrsa -out rootCA.key 2048
      
      # 使用私钥生成根 CA 的证书
      openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
      
    2. 10.12.0.2 生成私钥和证书请求文件(CSR)

      # 生成 10.12.0.2 的私钥
      openssl genrsa -out 10.12.0.2.key 2048
      
      # 使用私钥生成证书请求文件
      openssl req -new -key 10.12.0.2.key -out 10.12.0.2.csr
      
    3. 创建证书扩展文件

      为了确保为 10.12.0.2 签名的证书能够用作服务器身份验证,需要为它创建一个扩展文件。创建一个名为 v3.ext 的文件,并添加以下内容:

      authorityKeyIdentifier=keyid,issuer
      basicConstraints=CA:FALSE
      keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
      subjectAltName = @alt_names
      
      [alt_names]
      # 这里 IP 替换成 DNS 就可以签名域名了
      IP.1 = 10.12.0.2
      
    4. 使用根 CA 的证书为 10.12.0.2 签名证书

      openssl x509 -req -in 10.12.0.2.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out 10.12.0.2.crt -days 500 -sha256 -extfile v3.ext
      

    此时文件夹内应该有以下文件:

    • rootCA.key - 根 CA 的私钥。
    • rootCA.crt - 根 CA 的证书。
    • 10.12.0.2.key - 10.12.0.2 的私钥。
    • 10.12.0.2.csr - 10.12.0.2 的证书请求文件。
    • 10.12.0.2.crt - 由根 CA 签名的 10.12.0.2 的证书。

    信任

    Ubuntu

    sudo cp rootCA.crt /usr/local/share/ca-certificates/
    sudo update-ca-certificates
    

    CentOS

    sudo cp rootCA.crt /etc/pki/ca-trust/source/anchors/
    sudo update-ca-trust
    

    Windows

    右键文件,选择安装证书,选择本地计算机,指定安装到受信任的根证书颁发机构,即可

    使用

    这里拿 ASP.NET CORE 无反代部署举例,复制 10.12.0.2.key10.12.0.2.crt 文件到应用发布目录,之后在 appsettings.json 里加入或修改如下内容,并重启服务即可。

    {
      // 上面是其他内容
      "Kestrel": {
        "Endpoints": {
          "Https": {
            "Url": "https://*",
            "Certificate": {
              "Path": "./10.12.0.2.crt",
              "KeyPath": "./10.12.0.2.key"
            }
          }
        }
      }
    }
    
  • 相关阅读:
    利用非递归遍历统计二叉树的结点数
    C# 中,使用 LINQ 示例 备忘
    java类的学习
    Android子线程可以更新UI
    flink1.13报错:The file STDOUT does not exist on the TaskExecutor
    【一】Mac 本地部署大模型
    紫光同创FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供2套工程源码和技术支持
    纯CSS动态渐变文本特效
    ADRC Ardupilot代码分析
    .NET周刊【7月第1期 2024-07-07】
  • 原文地址:https://www.cnblogs.com/aobaxu/p/17754721.html