【发布时间】:2021-06-18 12:24:52
【问题描述】:
我正在使用 PgpCore 和 SSH.NET 加密流并通过 sftp 使用加密流在远程服务器上创建文件。
我有以下尝试,但是,虽然我可以成功列出远程目录中的文件,但我无法写入远程文件。我在pgp.EncryptStream 行收到错误no such file。
using (var client = new SftpClient(server, 22, username, password))
{
client.Connect();
Console.WriteLine("Connected to client.");
var inputStream = new MemoryStream();
var fileContents = Encoding.UTF8.GetBytes(sb.ToString());
inputStream.Write(fileContents, 0, fileContents.Length);
inputStream.Position = 0;
var outputStream = new MemoryStream();
var files = client.ListDirectory("/upload/");
foreach (var file in files)
{
string remoteFileName = file.Name;
Console.WriteLine(remoteFileName);
}
foreach (var file in files)
{
string remoteFileName = file.FullName;
Console.WriteLine(remoteFileName);
}
using (PGP pgp = new PGP())
{
Console.WriteLine("Doing PGP...");
using (Stream outputFileStream = client.Create("/upload/test.txt.pgp"))
using (Stream publicKeyStream = new FileStream(@".\PublicKey.asc", FileMode.Open))
{
Console.WriteLine("Encrypting Stream...");
pgp.EncryptStream(inputStream, outputFileStream, publicKeyStream);
Console.WriteLine("Stream Encrypted.");
//Console.WriteLine("Uploading File.");
//client.UploadFile(outputFileStream, string.Format("/upload/{0}", "test.txt.pgp"));
//Console.WriteLine("Upload Complete.");
}
}
}
关于如何做到这一点的任何想法?
异常堆栈跟踪:
at Renci.SshNet.Sftp.SftpSession.RequestWrite(Byte[] handle, UInt64 serverOffset, Byte[] data, Int32 offset, Int32 length, AutoResetEvent wait, Action`1 writeCompleted)
at Renci.SshNet.Sftp.SftpFileStream.FlushWriteBuffer()
at Renci.SshNet.Sftp.SftpFileStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at Project.Web.Areas.Pims.Controllers.Eod.EodController.EncryptStream(String fileName, StringBuilder sb) in C:\Repos\Solution\Project.Web\Areas\Pims\Controllers\Eod\EodController.cs:line 144
编辑:
对于那些可能觉得它有用的人,我设法使用client.OpenWrite 而不是client.Create 上传了加密文件,如下所示。我还添加了代码以使用我的 pgp 私钥和密码对加密文件进行签名:
工作解决方案:
using (PGP pgp = new PGP())
{
using (Stream outputFileStream = client.OpenWrite("/upload/test.txt.pgp"))
using (Stream publicKeyStream = new FileStream(@".\MSPublicKey.asc", FileMode.Open))
using (Stream privateKeyStream = new FileStream(@".\PrivateKey.asc", FileMode.Open))
{
pgp.EncryptStreamAndSign(inputStream, outputFileStream, publicKeyStream, privateKeyStream, pgpPasspharse, true, true);
}
}
【问题讨论】:
-
@MartinPrikryl 我已编辑以包含异常堆栈跟踪。
-
上传文件夹确实存在,这在我列出目录并循环浏览文件时得到确认。此代码实际上创建了文件
test.txt.pgp,但其中没有数据,pgp.EncryptStream出现错误 -
是的,上传成功。我现在已经设法使用
clinet.OpenWrite上传了加密文件(如上面的编辑所示)。