sci*_*ino 4 c# ssh azure ssh.net
我正在使用 Renci.SshNet 库,并让它使用用户名和私钥。当从文件或文件流读取私钥时,我可以很好地打开私钥,但在内存流期间它会失败。
这有效:
var pk = new PrivateKeyFile(@"C:\myfile.ppk");
Run Code Online (Sandbox Code Playgroud)
这有效:
var f = new FileStream(@"C:\myfile.ppk", FileMode.Open, FileAccess.Read);
var pk = new PrivateKeyFile(f);
Run Code Online (Sandbox Code Playgroud)
这些失败并显示“私钥无效”。
var s = new MemoryStream(Encoding.UTF8.GetBytes(variablename));
//No carriage returns
var s = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY----- <snip>"));
//Include carriage returns
var s = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY----- <snip>"));
Run Code Online (Sandbox Code Playgroud)
我什至尝试了在 SO 上找到的流位置:
private Stream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
Run Code Online (Sandbox Code Playgroud)
我一开始以为 Renci 库有一个 bug Stream,但显然文件流可以工作。我计划将字符串格式的密钥托管在天蓝色存储表中,但我对其他想法持开放态度。
根据您的描述,我使用PuTTYgen通过SSH生成了我的私钥文件,并参考本教程将我的密钥转换为OpenSSH格式。根据您提供的有关使用的代码MemoryStream,我可以使其按预期工作,您可以参考它:
var f = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----");
var pk = new PrivateKeyFile(f, "{password}");
Run Code Online (Sandbox Code Playgroud)
注意:我假设传递给您的私钥的字符串内容的Encoding.UTF8.GetBytes格式不正确。要隔离此原因,您可以尝试将加载的内容保存MemoryStream到文件中,如下代码并将其与C:\myfile.ppk.
memoryStream.CopyTo(fileStream);
Run Code Online (Sandbox Code Playgroud)
我计划将字符串格式的密钥托管在天蓝色存储表中,但我对其他想法持开放态度
据我所知,对于 Azure Web App 上托管的 Web 应用程序,您可以利用应用程序设置来存储键值对,这些键值对可以在运行时自动加载并覆盖 web.config 文件中的现有应用程序设置。
此外,您还可以利用Azure Blob 存储来私密存储您的私钥文件并按如下方式检索它:
using(var ms=new MemoryStream())
{
cloudBlockBlob.DownloadToStream(ms);
var pk = new PrivateKeyFile(ms, "{password}");
}
Run Code Online (Sandbox Code Playgroud)
注意:您可以按照本教程中的“加密 blob 数据”部分在客户端和服务器端加密 blob 数据。
此外,您可以利用Azure Key Vault来存储您的私钥。更多详细信息,您可以参考此官方文档来开始使用Azure Key Vault。
| 归档时间: |
|
| 查看次数: |
7349 次 |
| 最近记录: |