openssh密钥转rsa密钥)
引言
在使用c#代码连接服务器时,服务器设置的使用openSSH密钥证书,在打开密钥文件报错”openssh key type: ssh-rsa is not supported “,于是先查找了如何打开openssh密钥文件,很多答案说Renci.SshNet, Version=2020.0.2.0,版本的就支持,但真实情况是这个版本的也不支持。
于是就尝试将openssh key 转为rsa key,也就是将-----BEGIN OPENSSH PRIVATE KEY----- 开头的格式的密钥转换成-----BEGIN RSA PRIVATE KEY----- 格式,这里就记录一下转换过程,以及遇到的问题 。
转换过程
第一步:下载安装putty (putty下载)
第二步:打开PUTTYgen,见下图,通过Conversations-》Import Key导入原openssh 密钥
第三步:通过Conversations-》Export OPENSSH KEY 导出成RSA格式,界面参数全部默认就行
这样就把-----BEGIN OPENSSH PRIVATE KEY----- 格式的密钥转换成-----BEGIN RSA PRIVATE KEY----- 格式 的密钥了
转换代码
这里再附上C#使用sftp方式上传数据代码
public void SFTPUpload(string privateKeyPath)
{
try
{
string serverIp="1.1.1.1";//举例
string serverPort="22";
string serverUsername="root";
string localfilepath="F:\testdata\www.db";
string ObjectFilePath="opt/data/www.db";
// 创建 ConnectionInfo
var keyFiles = new[] { new PrivateKeyFile(privateKeyPath) };
var keyAuthMethod =new PrivateKeyAuthenticationMethod(serverUsername, keyFiles);
var connectionInfo = new ConnectionInfo(serverIp , serverUsername, keyAuthMethod);
sftp = new SftpClient(connectionInfo);
sftp.ConnectionInfo.Encoding = Encoding.UTF8;
sftp.ConnectionInfo.MaxSessions = 2000;
sftp.Connect();
if (isConnect)
{
TransferFileModel fileitem = fileModels[0];
// 获取用户主目录
// string userHomeDir = sftpHelper.sftp.WorkingDirectory;
// 返回到上一级目录
// sftpHelper.sftp.ChangeDirectory("..");
string dir = System.IO.Path.GetDirectoryName(ObjectFilePath);
if (!sftp.Exists(dir))
{
sftp.CreateDirectory(dir);
}
bool fileExist = sftp.Exists(ObjectFilePath);
if(fileExist)
{
sftpHelper.Disconnect();
MessageBox.Show("目标路径已存在该文件:" + System.IO.Path.GetFileName(ObjectFilePath+",请核实处理后再上传!"));
}
else
{
using (var fileStream = new FileStream(localfilepath, FileMode.Open))
{
await sftp.UploadAsync(fileStream, ObjectFilePath, true, UpdateProgresBar);
MyCurrentSize = MyCurrentSumSize;
}
sftp.Disconnect();
}
}
}
catch (Exception ex)
{
}
}