如何获取使用PowerShell创建的新Azure Linux VM的ssh主机密钥?

时间:2015-08-31 04:55:35

标签: azure ssh azure-vm-role

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

5 个答案:

答案 0 :(得分:5)

旧问题,但对于新手来说,现在可以通过在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文件的示例,请参阅this gist

答案 1 :(得分:2)

RSA,DSA,ECDSA和ED25519密钥在首次启动时生成,并在启动诊断日志中提供。

Key generation Key listing

如果您在第一次启动时没有捕获它,我认为它不会列在门户网站的任何其他位置。只有一个可行的安全选项,我可以考虑为已经部署的VM恢复指纹。

  1. 创建新VM。
  2. 附加需要指纹的VM的VHD。
  3. 使用启动诊断中的指纹验证您与新VM的连接。
  4. Check the fingerprint获取另一个磁盘上生成的/etc/ssh/ssh_host_rsa_key.pub文件。

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

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

    的PowerShell

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

    Get-AzureRmVMBootDiagnosticsData -ResourceGroupName ExampleGroup -Name TestLab -Linux

    与Putty

    连接

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

    幸运的是,Azure还在引导诊断日志中列出了完整的公钥,并在第二个image中显示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的说明,请参阅this StackOverflow question上的答案。

答案 2 :(得分:2)

您可以使用Azure门户的 have filed a bug in the corefx repo to get clarity

  • 在“虚拟机”页面上,转至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的答案中。


另请参阅我对"Run Command" feature的完整指南。

答案 3 :(得分:-1)

Windows VM示例

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 VM示例

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参数。 - 证书可以在Windows上处理这两种类型。

答案 4 :(得分:-2)

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

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