如何在 Linux 正確建立自簽憑證並讓 ASP.NET Core 網站可以順利進行連線 | The Will Will Web

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何在 Linux 正確建立自簽憑證並讓 ASP.NET Core 網站可以順利進行連線

我最近漸漸的嘗試將各種前後端開發環境搬遷到 Linux 環境下,無論是在 WSL 或是原生的 Linux 的效能表現都比 Windows 來的出色。然而在微服務架構下,服務與服務間的通訊經常需要使用 TLS/SSL 憑證進行加密連線,但是自簽憑證在 Linux 底下預設是不受信任的,必須特別處理才能解決服務間的安全連線的信任問題。這篇文章我將說明這個過程與解決方法。

產生自簽憑證並註冊到 Linux 作業系統

  1. 安裝 mkcert 工具

    我現在自簽憑證不太用 OpenSSL 了,因為 mkcert 實在太香、太好用了!👍

    mkdir -p ~/.local/bin
    curl -sSL https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 -o ~/.local/bin/mkcert
    chmod 755 ~/.local/bin/mkcert
    
    . ~/.profile
    
  2. 將 mkcert 產生的 Root CA 憑證加入到 system trust store

    mkcert -install
    

    這個命令會自動 sudo 並執行更新系統信任的憑證儲存區(system trust store),這個 mkcert -install 命令等同於以下兩行指令:

    sudo cp ~/.local/share/mkcert/rootCA.pem /usr/local/share/ca-certificates/
    sudo update-ca-certificates
    

產生 TLS 憑證並設定 ASP.NET Core 的 Kestrel 使用指定憑證

  1. 建立 ASP.NET Core Web API 專案

    mkdir myapi; cd myapi; dotnet new webapi --exclude-launch-settings
    dotnet run
    

    使用 cURL 連接 HTTPS 端點

    curl https://localhost:5001/weatherforecast
    

    此時會直接顯示以下錯誤,這是因為 .NET CLI 產生的自簽憑證沒有受信任的關係:

    curl: (60) SSL certificate problem: unable to get local issuer certificate
    More details here: https://curl.haxx.se/docs/sslcerts.html
    
    curl failed to verify the legitimacy of the server and therefore could not
    establish a secure connection to it. To learn more about this situation and
    how to fix it, please visit the web page mentioned above.
    
  2. 使用 mkcert 產生 PKCS#12 憑證: localhost.pfx

    以下設定 localhost127.0.0.1 為 TLS/SSL 憑證的 SAN (Subject Alternative Name),並儲存成 localhost.pfx 檔案!

    mkcert -pkcs12 -p12-file localhost.pfx localhost 127.0.0.1
    

    使用 mkcert 建立的 PKCS#12 憑證密碼寫死為 changeit 而且不能指定其他密碼!

  3. 調整 ASP.NET Core 的 appsettings.json 設定檔

    {
      "Kestrel": {
        "Certificates": {
          "Default": {
            "Path": "localhost.pfx",
            "Password": "changeit"
          }
        }
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  4. 啟動 ASP.NET Core 的 Kestrel 開發伺服器

    dotnet run
    
  5. 使用 cURL 測試網站連線

    curl https://localhost:5001/weatherforecast
    

    此時應該就不會再出現任何錯誤了! 👍

相關連結