还记的之前老猫关于通过Powershell远程管理Azure中虚拟机的博文的脚本中,每个虚拟机访问都需要通过get-credential交互方式取得用于访问的用户凭据,但是这这种方式每次都要进行用户交互,如果反复运行的脚本显然不是个好方式,如何加密保留用户的凭据以便反复使用就是个最佳实践的内容。当然现在国际版Azure中提供的自动化服务功能包含的Asset可以安全保留凭据用于自动化脚本调用,由于目前国内的Azure服务还没有这项功能,因此暂时只能按下不表了,当然如果只能这样本文也就结束了,这里介绍一个方法可以用于在自动化服务到来之前参考使用。


由于这个方法采用通过证书进行加密和解密的过程,因此需要用到在管理客户端的证书私钥进行解密,证书公钥进行加密;如果对自制自签名证书不太了解的话可以参考通过MakeCert工具创建自签名证书的方法;通过这种方式只要管理节点或在Azure的虚拟机中具有相应证书私钥的话都也可以通过这种方式保存的加密文件安全的获得用户凭据。


通过证书公钥加密并且通过Base64格式保留到当前用户环境的Mypassword.txt中,

$cert = Get-ChildItem Cert:\LocalMachine\My\[certificate thumbprint]
$bytes = [Text.Encoding]::UTF8.GetBytes("putyourpasswordhere")
$encrypt = $cert.PublicKey.Key.Encrypt($bytes, $true)
$base64 = [Convert]::ToBase64String($encrypt)
Set-Content $HOME\Myencrptpwd.txt $base64


在相应安装证书私钥节点获得用户凭据用于运行脚本使用:

$cert = Get-ChildItem Cert:\LocalMachine\My\[certificate thumbprint]
$base64 = Get-Content $HOME\Myencrptpwd.txt
$encrypt = [Convert]::FromBase64String($base64)
$bytes = $cert.PrivateKey.Decrypt($encrypt,$true)
$password = [Text.Encoding]::UTF8.GetString($bytes)