OpenSSL 生成 RootCA (根證書)並自簽署證書(支援 IP 地址)

Aoba_xu發表於2023-10-10

背景

某機房內部訪問需要配置 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"
        }
      }
    }
  }
}

相關文章