相关文章推荐
逃课的毛豆  ·  关于 Split - PowerShell ...·  1 年前    · 
暗恋学妹的鸵鸟  ·  git tag ...·  2 年前    · 
温暖的上铺  ·  Bazel通用定义 - 简书·  2 年前    · 
Azure DevOps Server 2022 - Azure DevOps Server 2019

本主題說明如何使用自我簽署憑證來執行自我裝載代理程式。

使用 SSL 伺服器證書

Enter server URL > https://corp.tfs.com/tfs
Enter authentication type (press enter for Integrated) >
Connecting to server ...
An error occurred while sending the request.

代理程式診斷記錄顯示:

[2017-11-06 20:55:33Z ERR  AgentServer] System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: A security error occurred

此安全性錯誤可能表示您在 Azure Devops Server 主電腦上所使用的伺服器證書不受組建電腦信任。 請務必將自我簽署 ssl 伺服器證書安裝到 OS 證書存儲。

Windows: Windows certificate store
Linux: OpenSSL certificate store
macOS: OpenSSL certificate store for agent version 2.124.0 or below
       Keychain for agent version 2.125.0 or above

您可以執行幾個命令,輕鬆地驗證憑證是否已正確安裝。 只要 SSL 握手正確完成,您應該沒有問題,儘管您得到的請求回傳 401 錯誤。

Windows: PowerShell Invoke-WebRequest -Uri https://corp.tfs.com/tfs -UseDefaultCredentials 
Linux: curl -v https://corp.tfs.com/tfs 
macOS: curl -v https://corp.tfs.com/tfs (agent version 2.124.0 or below, curl needs to be built for OpenSSL)
       curl -v https://corp.tfs.com/tfs (agent version 2.125.0 or above, curl needs to be built for Secure Transport)

如果因各種原因而無法成功將憑證安裝到計算機的證書存儲,例如:您沒有許可權,或是在自定義的Linux電腦上。 代理程式 2.125.0 版或更新版本能夠忽略 SSL 伺服器證書驗證錯誤。

忽略 SSL 伺服器證書驗證錯誤並不安全,不建議這麼做,強烈建議您將憑證安裝到計算機證書存儲。

在代理程式設定期間傳遞 --sslskipcertvalidation

./config.cmd/sh --sslskipcertvalidation

若要在 --sslskipcertvalidation Linux 和 macOS 上使用參數,您的 Linux 或 macOS 機器上的 libcurl 函式庫必須使用 OpenSSL 來建置。

Git 取得來源因 SSL 憑證問題而失敗(僅限 Windows 代理程式)

我們會將命令列 Git 隨附於 Windows 代理程式的一部分。 我們會針對所有 Git 相關作業使用此 Git 複本。 當您有內部部署 Azure DevOps Server 機器的自我簽署 SSL 憑證時,請務必設定我們隨附的 Git,以允許該自我簽署 SSL 憑證。 有兩種方法可以解決問題。

  • 藉由代理程式以使用者身分執行,在全域層級中設定下列 Git 組態。

    git config --global http."https://tfs.com/".sslCAInfo certificate.pem
    

    在 Windows 上設定系統層級 Git 組態並不可靠。 系統會使用我們封裝的 Git 複本來儲存系統 .gitconfig 檔案,每當代理程序升級至新版本時,就會加以取代。

  • 啟用 git 以便在配置過程中使用 SChannel,配合 2.129.0 或更高版本的代理。代理配置期間傳遞 --gituseschannel

    ./config.cmd --gituseschannel
    

    Git SChannel 對自我簽署憑證有更嚴格的要求。 IIS 或 PowerShell 命令所產生的自我簽署憑證可能無法使用 SChannel

    使用 SSL 用戶端憑證

    IIS 具有 SSL 設定,需要 Azure DevOps Server 的所有連入要求,除了一般認證之外,還必須提供用戶端憑證。

    啟用 IIS SSL 設定時,您必須使用版本 2.125.0 或更新版本,並遵循這些額外的步驟,以配置組建計算機以連接您的 Azure DevOps Server。

  • 準備所有必要的憑證資訊

  • CA 憑證 .pem 的格式 (此檔案應包含 CA 憑證的公鑰和簽章,您需要將根 CA 憑證和所有中繼 CA 憑證放入一個 .pem 檔案中)
  • 格式的 .pem 用戶端憑證 (此檔案應包含用戶端憑證的公鑰和簽章)
  • 格式的 .pem 用戶端憑證私鑰 (此檔案應只包含用戶端憑證的私鑰)
  • 格式的 .pfx 用戶端憑證封存套件 (此檔案應包含用戶端憑證的簽章、公鑰和私鑰)
  • 使用 SAME 密碼來保護用戶端憑證私鑰和用戶端憑證封存套件,因為它們都有客戶端憑證的私鑰
  • 將 CA 憑證安裝到電腦證書存儲

  • Linux:OpenSSL 證書存儲
  • macOS:系統或使用者密鑰鏈
  • Windows:Windows 證書存儲
  • 傳遞 --sslcacert--sslclientcert--sslclientcertkey。 設定代理程式期間的 --sslclientcertarchive--sslclientcertpassword

    .\config.cmd/sh --sslcacert ca.pem --sslclientcert clientcert.pem --sslclientcertkey clientcert-key-pass.pem --sslclientcertarchive clientcert-archive.pfx --sslclientcertpassword "mypassword"
    

    您的客戶端憑證私鑰密碼會安全地儲存在每個平臺上。

    Linux: Encrypted with a symmetric key based on the machine ID
    macOS: macOS Keychain
    Windows: Windows Credential Store
    

    驗證根證書授權機構的信任

    建置代理程式會使用基於 Mozilla 受信任根證書的證書存儲的 Node.js。 請務必確保任何用於安全通訊的根證書皆受到 Node.js CA 存放區的信任,這有助於避免在更新 Azure DevOps Server 上的憑證後出現以下錯誤:

  • 無法取得本機簽發者憑證
  • 自簽章證書在鏈中
  • 無法驗證第一個憑證
  • tls.rootCertificates 陣列可用來驗證用於驗證 TLS/SSL 連線的信任的根證書授權機構 "CA"。

    # Sample script to extract Node.js root certificates using Node.js.  
    node -e ' 
    const tls = require("tls"); 
    console.log(tls.rootCertificates.join("\n")); 
    ' > "$ROOT_CERTS_FILE" 
    

    若要設定 Node.js 信任憑證,可使用在 Node v7.3.0 中引入的 NODE_EXTRA_CA_CERTS 環境變數,這允許您指定包含一或多個額外 CA 憑證的檔案,除了預設集合之外,Node.js 也會信任這些憑證。 NODE_EXTRA_CA_CERTS附加至信任存放區。

  • 以 PEM 格式匯出憑證:在您的伺服器或 CA(憑證授權機構)上,以 PEM 編碼檔案的形式匯出根憑證(以及任何中繼憑證)。 此格式是具有 -----BEGIN CERTIFICATE----- 和base64資料的文字檔。 請確定它是Base-64編碼的 PEM,而不是 DER。 (在 Windows 上,。CER 檔案可以是其中一個;您可以重新命名為 .pem 以避免混淆。檔案實際上可以有任何擴展名,但 .pem 或 .crt 是標準的。如果您有多個內部 CA(鏈結),您可以將它們串連成一個檔案 – Node 會讀取該檔案中的所有憑證。
  • 將 PEM 放入已知的路徑,讓組建代理程式上可供使用(例如 C:\certs\CorpRootCA.pem 或 /etc/ssl/certs/CorpRootCA.pem)。
  • 設定OS環境變數NODE_EXTRA_CA_CERTS指向該 PEM 檔案。 例如,在 Windows 上,人們可以使用 PowerShell:
  • [Environment]::SetEnvironmentVariable("NODE_EXTRA_CA_CERTS", "C:\certs\CorpRootCA.pem", "Machine")
    

    深入瞭解 代理程式用戶端憑證支援

  •