如果我使用PowerShell创建Azure Linux VM,我如何获取其新的ssh主机密钥,以便我可以将其安装在我的本地ssh / putty中?优选地,该解决方案也是PowerShell代码。
答案 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密钥在首次启动时生成,并在启动诊断日志中提供。
如果您在第一次启动时没有捕获它,我认为它不会列在门户网站的任何其他位置。只有一个可行的安全选项,我可以考虑为已经部署的VM恢复指纹。
Check the fingerprint获取另一个磁盘上生成的/etc/ssh/ssh_host_rsa_key.pub
文件。
ssh-keygen -lf /{path}/ssh_host_rsa_key.pub
如果需要十六进制编码的MD5哈希,则可能需要添加-E md5
开关。
通过PowerShell获取启动诊断数据:
Get-AzureRmVMBootDiagnosticsData -ResourceGroupName ExampleGroup -Name TestLab -Linux
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。
粘贴以下命令:
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)
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
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