相关文章推荐
潇洒的茶叶  ·  eggjs - Egg Vue SSR ...·  1 年前    · 
无邪的丝瓜  ·  AbstractMethodError: ...·  1 年前    · 

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

在 macOS、Linux 或 Windows 上通过 SSH 连接到 Git 存储库,以使用 HTTPS 身份验证安全连接。 在 Windows 上,我们建议使用 Git 凭据管理器 个人访问令牌

SSH URL 已更改,但旧的 SSH URL 将继续生效 。 如果已设置 SSH,则应将远程 URL 更新为新格式:

  • 通过在 Git 客户端中运行来 git remote -v 验证哪些远程程序正在使用 SSH。
  • 访问 Web 上的存储库,然后选择右上角的 “克隆 ”按钮。
  • 选择 SSH 并复制新的 SSH URL。
  • 在 Git 客户端中,运行: git remote set-url <remote name, e.g. origin> <new SSH URL> 或者,在 Visual Studio 中,转到 存储库设置 并编辑远程。
  • 从 Visual Studio 2017 开始,SSH 可用于连接到 Azure DevOps Git 存储库。

    SSH 密钥身份验证的工作原理

    SSH 公钥身份验证适用于生成的加密密钥的非对称对。 公钥 与 Azure DevOps 共享,用于验证初始 ssh 连接。 私钥 在系统上保持安全。

    设置 SSH 密钥身份验证

    以下步骤介绍了在以下平台上配置 SSH 密钥身份验证:

  • Linux
  • 至少运行 Leopard (10.5) 的 macOS
  • 运行 适用于 Windows 的 Git 的 Windows 系统
  • 使用命令行配置 SSH。 bash 是 Linux 和 macOS 上的常用 shell,Git for Windows 安装会在“开始”菜单中向 Git Bash 添加快捷方式。 其他 shell 环境将正常工作,但本文未介绍。

    步骤 1:创建 SSH 密钥

    如果已在系统上创建了 SSH 密钥,请跳过此步骤并 转到配置 SSH 密钥

    此处的命令将允许创建新的默认 SSH 密钥,覆盖现有的默认密钥。 在继续之前,请检查 ~/.ssh 文件夹 (例如 /home/jamal/.ssh 或 C:\Users\jamal\.ssh) 并查找以下文件:

  • id_rsa
  • id_rsa.pub
  • 如果这些文件存在,则已创建 SSH 密钥。 可以使用以下命令覆盖密钥,或跳过此步骤,然后转到 配置 SSH 密钥 以重复使用这些密钥。

    使用 ssh-keygen bash 命令提示符创建 SSH 密钥。 此命令将创建用于 SSH 的 3072 位 RSA 密钥。 当系统提示时,可以为私钥提供通行短语 - 此通行短语为私钥提供另一层安全性。 如果提供通行短语,请确保 将 SSH 代理配置为 缓存通行短语,因此每次连接时无需输入密码。

    $ ssh-keygen -C "jamal@fabrikam.com"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/c/Users/jamal/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /c/Users/jamal/.ssh/id_rsa.
    Your public key has been saved in /c/Users/jamal/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:******************************************* jamal@fabrikam.com
    The key's randomart image is:
    +---[RSA 3072]----+
    |+.   +yX*o .     |
    |... ..E+*=o      |
    |  ..o.=E=.o      |
    |   . * =.o .     |
    |    . S o o..    |
    |       + .oo     |
    |        S+.  .   |
    |        ..+.+    |
    |          o*..   |
    +----[SHA256]-----+
    

    此命令生成 SSH 身份验证所需的两个密钥:私钥 ( id_rsa) 和公钥 ( id_rsa.pub ) 。 请务必从不共享私钥的内容。 如果私钥遭到入侵,攻击者可以使用它欺骗服务器来认为连接来自你。

    步骤 2:将公钥添加到 Azure DevOps Services/TFS

    将上一步中生成的公钥与用户 ID 相关联。

  • 浏览到 Web 门户并选择用户界面右上角的头像,打开安全设置。 在显示的菜单中选择 SSH 公钥

  • 选择“+ 新建密钥”。

  • 例如,复制公钥 (的内容,例如,id_rsa.pub) 生成的 公钥数据 字段。

    避免在密钥数据字段中添加空格或新行,因为它们可能会导致Azure DevOps Services使用无效公钥。 粘贴键时,通常会在末尾添加换行符。 如果发生此换行,请务必删除此换行符。

  • 为密钥提供有用的说明, (此说明将显示在配置文件) 的 SSH 公钥 页上,以便稍后可以记住它。 选择 “保存 ”以存储公钥。 保存后,无法更改密钥。 可以删除密钥或为另一个密钥创建新条目。 对可添加到用户配置文件的密钥数没有限制。 另请注意,存储在 Azure DevOps 中的 SSH 密钥会在五年后过期。 如果密钥过期,可以上传新密钥或相同的密钥,以继续通过 SSH 访问 Azure DevOps。

  • 运行以下命令来测试连接: ssh -T git@ssh.dev.azure.com 如果一切正常工作,你将收到一个回复,指出: remote: Shell access is not supported. 如果没有,请参阅有关 问题和故障排除的部分。

    可以使用此命令 $ cat ~/.ssh/id_rsa.pub 在终端中打印 id_rsa.pub 文件的内容,然后将该文件复制到剪贴板。 如果您的 SSH 公钥文件与示例代码不同,请修改文件名以匹配您当前的设置。 在复制密钥时,请勿添加任何新行或空格。 或者,你可以找到隐藏的 .ssh 文件夹,在喜欢的文本编辑器中打开该文件,并将其复制到剪贴板。

    避免在密钥数据字段中添加空格或新行,因为它们可能会导致Azure DevOps Services使用无效公钥。 粘贴键时,通常会在末尾添加换行符。 如果发生此换行,请务必删除此换行符。

  • 为密钥提供有用的说明, (此说明将显示在配置文件) 的 SSH 公钥 页上,以便稍后可以记住它。 选择 “保存 ”以存储公钥。 保存后,无法更改密钥。 可以删除密钥或为另一个密钥创建新条目。 对可添加到用户配置文件的密钥数没有限制。

  • 运行以下命令来测试连接: ssh -T git@ssh.dev.azure.com 如果一切正常工作,你将收到一个回复,指出: remote: Shell access is not supported. 如果没有,请参阅有关 问题和故障排除的部分。

    SSH 可能会显示服务器的 SSH 指纹,并要求你对其进行验证。 应验证显示的指纹是否与 SSH 公钥 页中的指纹之一匹配。

    SSH 将在连接到未知主机时显示此指纹,以防止中间人攻击。 接受主机的指纹后,SSH 将不再提示你,除非指纹发生更改。

    $ git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    Cloning into 'FabrikamFiber'...
    The authenticity of host 'ssh.dev.azure.com (65.52.8.37)' can't be established.
    RSA key fingerprint is SHA256:********************************************
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'ssh.dev.azure.com,65.52.8.37' (RSA) to the list of known hosts.
    Enter passphrase for key '/c/Users/jamal/.ssh/id_rsa':
    remote: Azure Repos
    remote: Found 127 objects to send. (50 ms)
    Receiving objects: 100% (127/127), 56.67 KiB | 2.58 MiB/s, done.
    Resolving deltas: 100% (15/15), done.
    

    当系统询问是否要继续连接时,请键入 yes。 Git 将克隆存储库,并设置 origin 远程以使用 SSH 进行连接,以便将来使用 Git 命令进行连接。

    为防止问题,Windows 用户应 运行命令 ,让 Git 重复使用其 SSH 密钥通行短语。

    问题和故障排除

    问:运行 git clone后,我收到以下错误。 应采取何种操作?

    Host key verification failed. 
    fatal: Could not read from remote repository.
    

    答: 通过运行以下命令手动记录 SSH 密钥: ssh-keyscan -t rsa ssh.dev.azure.com >> ~/.ssh/known_hosts

    问:如何让 Git 记住 Windows 上密钥的通行短语?

    答: 运行 Git for Windows 中包含的以下命令,在 PowerShell 或 Windows 命令提示符中启动 ssh-agent 进程。 ssh-agent 将缓存通行短语,因此每次连接到存储库时都无需提供密码。

    start-ssh-agent.cmd
    

    如果使用 Bash shell (包括 Git Bash) ,请使用以下命令启动 ssh-agent:

    eval `ssh-agent`
    

    问:我使用 PuTTY 作为 SSH 客户端,并使用 PuTTYgen 生成密钥。 是否可以将这些密钥用于Azure DevOps Services?

    答: 是的。 使用 PuTTYgen 加载私钥,转到 “转换 ”菜单,然后选择“ 导出 OpenSSH 密钥”。 保存私钥文件,然后按照步骤 设置非默认密钥。 直接从 PuTTYgen 窗口复制公钥,并将其粘贴到安全设置中的 “密钥数据 ”字段中。

    问:如何验证上传的公钥是否与本地密钥相同?

    答: 可以使用命令行通过以下命令针对公钥运行, ssh-keygen 验证使用配置文件中显示的公钥上传的公钥 bash 的指纹。 如果不使用默认值,则需要更改路径和公钥文件名。

    ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub
    

    然后,可以将 MD5 签名与配置文件中的签名进行比较。 如果在将密钥添加到Azure DevOps Services时,存在连接问题,或者担心在公钥中错误地粘贴到密钥数据字段中,则此检查非常有用。

    问:如何在当前正在使用 HTTPS 的存储库中使用 SSH?

    答: 需要更新 origin Git 中的远程设备以从 HTTPS 更改为 SSH URL。 获得 SSH 克隆 URL 后,运行以下命令:

    git remote set-url origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    

    现在可以运行连接到 origin的任何 Git 命令。

    问:我在将 Git LFS 与 Azure DevOps Services 配合使用,并拉取 Git LFS 跟踪的文件时收到错误。

    答:Azure DevOps Services目前不支持通过 SSH 使用 LFS。 使用 HTTPS 连接到包含 Git LFS 跟踪文件的存储库。

    问:如何使用非默认密钥位置,即不是 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub?

    答: 若要在与默认值不同的位置使用创建的 ssh-keygen 密钥,请执行以下两项任务:

  • 键必须位于只能读取或编辑的文件夹中。 如果文件夹具有更广泛的权限,则 SSH 将不会使用密钥。
  • 必须让 SSH 知道密钥的位置。 通过命令通过 SSH 识别密钥 ssh-add ,从而提供私钥的完整路径。
  • ssh-add /home/jamal/.ssh/id_jamal.rsa
    

    在 Windows 上,在运行 ssh-add之前,需要从 Git for Windows 中运行以下命令:

    start-ssh-agent.cmd
    

    此命令在 PowerShell 和命令提示符中运行。 如果使用 Git Bash,需要使用的命令是:

    eval `ssh-agent`
    

    可以在 ssh-add Git for Windows 分发版中找到它,并在 Windows 上的任何 shell 环境中运行它。

    在 macOS 和 Linux 上,还必须在运行之前运行ssh-agentssh-add,但这些平台上的命令环境通常负责启动ssh-agent

    问:我有多个 SSH 密钥。 如何实现对不同的 SSH 服务器或存储库使用不同的 SSH 密钥?

    答: 通常,如果为 SSH 客户端配置多个密钥并连接到 SSH 服务器,则客户端可以一次尝试一个密钥,直到服务器接受一个密钥。

    但是,这不适用于 Azure DevOps,因为与 SSH 协议相关的技术原因以及 Git SSH URL 的结构。 Azure DevOps 会盲目接受客户端在身份验证期间提供的第一个密钥。 如果请求的存储库的密钥无效,则请求将失败并出现以下错误:

    remote: Public key authentication failed.
    fatal: Could not read from remote repository.
    

    对于 Azure DevOps,需要将 SSH 配置为显式使用特定的密钥文件。 例如,执行此操作以编辑 ~/.ssh/config 文件 (或 /home/jamal/.sshC:\Users\jamal\.ssh) ,如下所示:

    # The settings in each Host section are applied to any Git SSH remote URL with a
    # matching hostname.
    # Generally:
    # * SSH uses the first matching line for each parameter name, e.g. if there's
    #   multiple values for a parameter across multiple matching Host sections
    # * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
    #   the IdentityFile values we explicitly set.
    # * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
    #   e.g. C:\Users\<username>\.ssh\your_private_key.
    # Most common scenario: to use the same key across all hosted Azure DevOps
    # organizations, add a Host entry like this:
    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/your_private_key
      IdentitiesOnly yes
    # This model will also work if you still use the older SSH URLs with a
    # hostname of vs-ssh.visualstudio.com:
    Host vs-ssh.visualstudio.com
      IdentityFile ~/.ssh/your_private_key
      IdentitiesOnly yes
    # OpenSSL 8.7 has DEPRECATED RSA. IF using OpenSSL version > 8.6 you will need to 
    # add the 'HostkeyAlgorithms' and 'PubkeyAcceptedAlgorithms' entries below. You can 
    # check the version of OpenSSL/OpenSSH you're using by running the command 'ssh -v localhost'    
    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/id_rsa
      HostkeyAlgorithms +ssh-rsa
      PubkeyAcceptedAlgorithms +ssh-rsa   
    # Less common scenario: if you need different keys for different organizations,
    # you'll need to use host aliases to create separate Host sections.
    # This is because all hosted Azure DevOps URLs have the same hostname
    # (ssh.dev.azure.com), so SSH has no way to distinguish them by default.
    # Imagine that we have the following two SSH URLs:
    # * git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
    #   * For this, we want to use `fabrikamkey`, so we'll create `devops_fabrikam` as
    #     a Host alias and tell SSH to use `fabrikamkey`.
    # * git@ssh.dev.azure.com:v3/Contoso/Project2/con_repo
    #   * For this, we want to use `contosokey`, so we'll create `devops_contoso` as
    #     a Host alias and tell SSH to use `contosokey`.
    # To set explicit keys for the two host aliases and to tell SSH to use the correct
    # actual hostname, add the next two Host sections:
    Host devops_fabrikam
      HostName ssh.dev.azure.com
      IdentityFile ~/.ssh/private_key_for_fabrikam
      IdentitiesOnly yes
    Host devops_contoso
      HostName ssh.dev.azure.com
      IdentityFile ~/.ssh/private_key_for_contoso
      IdentitiesOnly yes
    # Then, instead of using the real URLs, tell Git you want to use these URLs:
    # * git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo
    # * git@devops_contoso:v3/Contoso/Project2/con_repo
    # At the end of the file, you can put global defaults for other SSH hosts you
    # may connect to.  Note that "*" also matches any hosts that match the sections
    # above, and remember that SSH uses the first matching line for each parameter name.
    Host *
    
    # The settings in each Host section are applied to any Git SSH remote URL with a
    # matching hostname.
    # Generally:
    # * SSH uses the first matching line for each parameter name, e.g. if there's
    #   multiple values for a parameter across multiple matching Host sections
    # * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
    #   the IdentityFile values we explicitly set.
    # * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
    #   e.g. C:\Users\<username>\.ssh\your_private_key.
    # Say your on-premises Azure DevOps Server instance has SSH URLs like this:
    #   ssh://someHost:22/someCollection/some_project/_git/some_repo
    # Add the following Host section:
    Host someHost
      IdentityFile ~/.ssh/your_private_key
      IdentitiesOnly yes
    # At the end of the file, you can put global defaults for other SSH hosts you
    # may connect to.  Note that "*" also matches any hosts that match the sections
    # above, and remember that SSH uses the first matching line for each parameter name.
    Host *
    

    问:如何实现修复了提及“找不到匹配密钥交换方法”的错误?

    答: Git for Windows 2.25.1 随附了新版本的 OpenSSH,默认情况下删除了一些密钥交换协议。 具体而言,diffie-hellman-group14-sha1对于某些Azure DevOps Server和 TFS 客户,已确定为有问题的。 可以通过将以下内容添加到 SSH 配置 () ~/.ssh/config 来解决此问题:

    Host <your-azure-devops-host>
        KexAlgorithms +diffie-hellman-group14-sha1
    

    替换为 <your-azure-devops-host> Azure DevOps 或 TFS 服务器的主机名,例如 tfs.mycompany.com

    问:我可能会收到关于 SSH 密钥的哪些通知?

    答:每当向 Azure DevOps Services 注册新的 SSH 密钥时,将收到一封电子邮件通知,通知你已将新的 SSH 密钥添加到帐户。

    问:如果我相信除我以外的人正在我的帐户上添加 SSH 密钥,该怎么办?

    答: 如果收到正在注册的 SSH 密钥的通知,但未手动将其上传到服务,则凭据可能已泄露。

    下一步是调查密码是否已泄露。 更改密码始终是防范此攻击途径的好第一步。 如果你是 Azure Active Directory 用户,请与管理员交谈,检查帐户是否来自未知源/位置。

    问:如果我仍然提示输入密码并 GIT_SSH_COMMAND="ssh -v" git fetch 显示 no mutual signature algorithm,该怎么办?

    答: 从 2021 年 ) 1 月起,某些 Linux 分发版(如 Fedora Linux)具有要求比 Azure DevOps (支持的更强 SSH 签名算法的加密策略。 有一个开放 功能请求 来添加此支持。

    可以通过将以下代码添加到 SSH 配置 (~/.ssh/config) 来解决此问题:

    Host ssh.dev.azure.com
      PubkeyAcceptedKeyTypes=ssh-rsa
    

    如果使用Azure DevOps Server,请替换为ssh.dev.azure.com正确的主机名。

  •