21

如果我使用 PowerShell 创建 Azure Linux VM,如何获取其新的 ssh 主机密钥,以便可以将其安装在本地 ssh/putty 中?最好的解决方案也是 PowerShell 代码。

4

6 回答 6

7

老问题,但对于新手来说,现在可以通过在 Azure CLI 中使用 run-command 来替代。PowerShell 也可能有一个等价物,但我没有对此进行调查。

az vm run-command invoke --name <your-vm-name> --command-id RunShellScript --scripts "cat /etc/ssh/ssh_host_ecdsa_key.pub"

将输出一个 json 文档,您可以从中提取公钥。请注意,尽管此过程非常慢(每个主机约 30 秒),但您只需要运行一次。有关如何使用 Ansible 更新 known_hosts 文件的示例,请参阅此要点。

于 2018-02-19T21:20:43.767 回答
7

您可以使用 Azure 门户的 “运行命令”功能

  • 在您的虚拟机页面中,转到VM 菜单的“操作”部分中的“运行命令” 。
  • 选择“RunShellScript”命令。
  • 粘贴以下命令:

    for f in /etc/ssh/ssh_host_*_key; do ssh-keygen -l -f "$f"; done
    
  • 您将获得如下输出:

    Enable succeeded: 
    [stdout]
    256 SHA256:bKKCom8yh5gOuBNWaHHJ3rrnRXmCOAyPN/WximYEPAU /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
    256 SHA256:IYeDl+gseYk46Acg4g2mcXGvCr7Z8FqOd+pCJz/KLHg /etc/ssh/ssh_host_ed25519_key.pub (ED25519)
    2048 SHA256:rA0lIXvHqFq7VHKQCqHwjsj28kw+tO0g/X4KnPpEjMk root@myazurevm (RSA)
    
    [stderr] 
    

    (密钥类型集会因您的 VM 映像而异)


该功能也可以通过 Azure CLI 使用,如上面的链接和@mwik 的回答中所示。


另请查看我的使用 SFTP 安全连接到 Microsoft Azure 服务的完整指南。

于 2019-04-25T09:48:21.280 回答
2

RSA、DSA、ECDSA 和 ED25519 密钥在首次引导时生成,可在引导诊断日志中使用。

密钥生成 关键清单

如果您在第一次启动时没有抓住它,我认为它不会在门户中的其他任何地方列出。我认为只有一种可行的、安全的选项可以恢复已部署虚拟机的指纹。

  1. 创建一个新的虚拟机。

  2. 附加需要指纹的 VM 的 VHD。

  3. 使用引导诊断中的指纹验证您与新 VM 的连接。

  4. /etc/ssh/ssh_host_rsa_key.pub检查另一个磁盘上生成文件的指纹。

    ssh-keygen -lf /{path}/ssh_host_rsa_key.pub

-E md5如果您需要十六进制编码的 MD5 哈希,您可能需要添加开关。

电源外壳

要通过 PowerShell 获取启动诊断数据:

Get-AzureRmVMBootDiagnosticsData -ResourceGroupName ExampleGroup -Name TestLab -Linux

与腻子连接

Azure 将主机密钥指纹计算为公钥的SHA-256哈希的Base64 编码字符串。当您尝试使用Putty进行连接时,它会将指纹显示为公钥的MD5哈希的十六进制编码字符串。

幸运的是,Azure 还在启动诊断日志中列出了完整的公钥,它BEGIN SSH HOST KEY KEYS在第二个图像中显示。有了它,我们可以手动计算 Putty 提供的指纹。

C#

static string ComputeMD5FingerprintFromBase64(string encoded)
{
  // Convert Base64 string to byte array.
  byte[] pub = Convert.FromBase64String(encoded);

  // Compute MD5 hash.
  HashAlgorithm md5 = MD5.Create();
  byte[] hash = md5.ComputeHash(pub);

  return BitConverter.ToString(hash).Replace('-', ':');
}

视窗

有关使用 RDP 安全连接到 Windows VM 的说明,请参阅我对此 StackOverflow 问题的回答。

于 2016-09-13T07:42:57.803 回答
-1

也许正是您正在寻找的。我现在会在我的帐户上与您一起尝试。

基本上看起来你需要.pem在创建时附加一个。在此处输入图像描述

这应该会产生您的证书指纹。
在此处输入图像描述

于 2015-09-09T22:37:14.160 回答
-1

Windows 虚拟机示例

Select-AzureSubscription mysub $service = 'yourservicename1' $location = 'West US' New-AzureService -ServiceName $service -Location $location Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service $cert1 = New-AzureCertificateSetting -Thumbprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -StoreName 'My' New-AzureVMConfig -ImageName 'MSFT__Windows-Server-2012-Datacenter-201208.01-en.us-30GB.vhd' -InstanceSize 'Small' -Name 'win2012cert' | Add-AzureProvisioningConfig -Windows -Password 'somepass@1' -Certificates $cert1 | New-AzureVM -ServiceName $service

Linux 虚拟机示例

Select-AzureSubscription mysub $service = 'yourservicename1' $location = 'West US' New-AzureService -ServiceName $service -Location $location Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service $sshkey = New-AzureSSHKey -PublicKey -Fingerprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -Path '/home/admin/.ssh/authorized_keys' New-AzureVMConfig -ImageName 'CANONICAL__Canonical-Ubuntu-12-04-amd64-server-20120528.1.3-en-us-30GB.vhd' -InstanceSize 'Small' -Name 'linuxwithcert' | Add-AzureProvisioningConfig -Linux -LinuxUser 'mwasham' -Password 'somepass@1' -SSHPublicKeys $sshKey | New-AzureVM -ServiceName $service

注意: -Certificates 和 -SSHPublicKeys 参数是数组,因此它们可以接受多个证书。-SSHPublicKeys $sshKey1,$sshKey2

对于 Linux,还有 -SSHKeyPairs 参数用于传递密钥对而不仅仅是公钥。-Certificates 可以在 Windows 上处理这两种类型。

于 2015-10-07T10:10:13.037 回答
-2

在他们的帮助文档中,有一个页面讨论了如何重置密码或 ssh 密钥:

https://docs.microsoft.com/en-us/azure/virtual-machines/linux/troubleshoot-ssh-connection

于 2017-06-11T17:03:59.770 回答