介尘部落

文学|音乐|休闲娱乐|计算机技术|地球科学|社会学——知识成就命运


Azure DevOps SSH 配置以及多个SSH密钥配置方法

SSH 关键身份验证的工作原理

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

设置 SSH 密钥身份验证

第 1 步:创建 SSH 密钥

如果您已经在系统上创建了SSH密钥,请跳过此步骤,浏览配置SSH密钥。

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

  • id_rsa
  • id_rsa.pub

如果存在这些文件,则您已经创建了SSH密钥。您可以重新使用以下命令覆盖密钥,或跳过此步骤,转到配置 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 2048]----+
|+.   +yX*o .     |
|... ..E+*=o      |
|  ..o.=E=.o      |
|   . * =.o .     |
|    . S o o..    |
|       + .oo     |
|        S+.  .   |
|        ..+.+    |
|          o*..   |
+----[SHA256]-----+

使用git的bash命令提示符控制台就可以创建您的SSH密钥。ssh-keygenbash 命令将创建一个 2048 位 RSA 密钥,用于 SSH。

当提示时Enter passphrase时,您可以为您的私钥提供密码短语-此密码短语为您的私钥提供了另一层安全性。如果您给出了一个密码短语,请务必配置 SSH 代理来缓存您的密码短语,这样您不必每次连接时都输入密码。

ssh-keygenbash命令生成 SSH 身份验证所需的两个密钥:您的私钥(id_rsa)和公钥(id_rsa.pub),这是默认密钥文件名称。重要的是永远不要分享你的私人钥匙的内容。如果私钥被泄露,攻击者可以用它来欺骗服务器认为连接来自您。

在提示Enter file in which to save the key时可以指定密钥文件的名称。新的密钥文件将不会覆盖已有的默认名称的密钥文件。

第 2 步:将公共密钥添加到 Azure DevOps 服务/TFS或Github网站

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

  1. 通过浏览门户网站并在用户界面右上角选择头像来打开您的安全设置。在显示的菜单中选择SSH 公共密钥Screenshot that shows the SSH public keys menu item and the user avatar selected in Azure DevOps Services.
  2. 选择+新密钥Accessing Security Configuration in Azure DevOps Services
  3. 复制您生成到公共密钥数据领域的公共密钥(例如id_rsa.pub)的内容。 重要避免在关键数据字段中添加白空间或新行,因为它们可能导致 Azure DevOps 服务使用无效的公钥。粘贴在密钥中时,通常在末尾添加新行。如果发生这种情况,请务必删除此新行。Configuring Public Key in Azure DevOps Services
  4. 添加一个有用的描述(此描述将显示在SSH公共密钥页面为您的个人资料),以便您可以记住它以后。选择保存以存储公共密钥。保存后,您无法更改密钥。您可以删除密钥或为另一个密钥创建新条目。您可以添加到用户配置文件的密钥数没有限制。另请注意,存储在 Azure DevOps 中的 SSH 密钥将在五年后过期。如果您的密钥过期,您可以上传新密钥或同一密钥,以便继续通过 SSH 访问 Azure DevOps。

第 3 步:测试SSH公钥配置是否生效

通过运行以下命令来测试连接,.如果一切正常,将显示如下。如果没有,请检查重试。

ssh -T git@ssh.dev.azure.comremote: Shell access is not supported.

使用SSH克隆和推送代码库

用 SSH 克隆 Git 存储库

  1. 从门户网站复制SSH克隆网址。在此示例中,SSL 克隆 URL 用于名为fabrikam-fiber的项目。Azure Repos SSH Clone URL
  2. 从命令提示中运行。git clone
$ 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.

使用SSH推送Git代码库

先创建远程库后推送本地代码

这种方式需要先在github或Azure上预先创建代码库,然后通过git push命令推送到远程库。方案主要有2个。

1.先克隆远端的项目库到本地,这样本地库和远程库可以自动建立关联。将本地代码拷贝到新克隆的代码文件夹下。然后使用git add/push命令就可以推送成功了。过程如下:

第一步:克隆代码库
$ git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
第二步:加入新代码
$ git add .
第三步:提交代码
$ git commit -m '说明'
第四步:推送
$ git push

2.第二种情况就是针对本地已存在的代码库而言。

第一步:新建远程库
第二部:对本地代码关联远程库并定义仓库源名称 
git remote add origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
第三步:推送本地代码并指定仓库源名称
git push -u origin master #首次推送
git push origin master
这样就完成了本地库的推送

还是以上示例库举例

git remote add origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
git push -u origin --all

直接推送本地代码库到远程

这种情况无需手动创建远程仓库,即可直接推送代码并创建远程仓库。

可以通过visual studio初始化git库后直接推送到github。可以自由设置远程仓库名称以及是否私有等。

暂时没有找到如何支持Azure devops的方法。

在本机配置多个可用SSH密钥

可以通过 $ ssh-keygen -C "jamal@fabrikam.com" 命令,以指定密钥文件名称的方式生成多个密钥文件。

还可以通过 ssh-add 命令添加已有的密钥文件。

$ ssh-add /home/jamal/.ssh/id_jamal.rsa

如果添加不成功,请试试这个命令后再执行添加。

eval `ssh-agent`

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

但是,由于与 SSH 协议相关的技术原因以及我们的 Git SSH 网址的结构,这与 Azure DevOps 不起作用。Azure DevOps 将盲目地接受客户端在认证过程中提供的第一个密钥。如果该密钥对于请求的回购无效,则请求将因以下错误而失败:

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

对于 Azure DevOps,您需要配置 SSH 才能明确使用特定的关键文件。编辑以下ssh文件夹下的config文件:~/.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  
  PubkeyAcceptedKeyTypes=ssh-rsa

# 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

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

经过尝试后了解,这里的Host表示服务器地址别名,HostName表示真正的服务器地址。host信息来自于你的仓库地址。正常情况下最好设置Host与HostName相同。避免试错。

阅读全文
公众号-介尘阅读时光
赞赏支持

0 Responses to “Azure DevOps SSH 配置以及多个SSH密钥配置方法”

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)