在 C# 中使用带有 SSH.NET 的字符串中的 "OPENSSH" 私钥文件失败并显示 "invalid private key file"
Using "OPENSSH" private key file in string with SSH.NET in C# fails with "invalid private key file"
我没有使用 SFTP 或 OpenSSH 的经验。我正在尝试连接到客户端的 SFTP 以上传文件。
我正在使用 SSH.NET 库 – https://github.com/sshnet/SSH.NET
在我的 C# 代码中,我在字符串变量中有私钥:
var key = @"-----BEGIN OPENSSH PRIVATE KEY-----
// snipped
-----END OPENSSH PRIVATE KEY-----
";
MemoryStream keyStream = new MemoryStream(Encoding.UTF32.GetBytes(key));
Renci.SshNet.ConnectionInfo conn = new Renci.SshNet.ConnectionInfo(
host,
port,
username,
new AuthenticationMethod[]
{
new PrivateKeyAuthenticationMethod(username, new PrivateKeyFile[]
{
new PrivateKeyFile(keyStream, ""),
}),
});
但是我得到一个错误:
invalid private key file.
我的问题是,我看到其他密钥以 BEGIN RSA
开头,但我的密钥以 BEGIN OPENSSH
开头 – 这是问题所在吗?
您的代码有两个问题:
PrivateKeyFile
class使用StreamReader
读取密钥,默认为UTF8
。不是 UTF16
。这就是为什么读取失败并显示 vague
的原因
invalid private key file.
如果您将 Encoding.UTF32
更正为 Encoding.UTF8
,它仍然会失败。正如您正确猜测的那样 SSH.NET 不支持 OPENSSH
格式。
最新的SSH.NET 2020.0.1仅支持ssh-ed25519
键的OPENSSH
格式。它会说:
openssh key type: ssh-rsa is not supported
旧版本根本不支持这种格式,他们会说:
Key 'OPENSSH' is not supported
这些 OPENSSH
密钥是由最新版本的 OpenSSH(7.8 和更新版本)生成的。
您可以使用ssh-keygen
将密钥转换为classic OpenSSH格式:
ssh-keygen -p -f file -m pem -P passphrase -N passphrase
(如果密钥未使用密码加密,请使用 ""
而不是 passphrase
)
对于 Windows 用户:请注意 ssh-keygen.exe
现在已内置于 Windows 10 中。对于旧版本的 Windows 可以是 downloaded from Microsoft Win32-OpenSSH project .
在 Windows 上,您还可以使用 PuTTYgen(来自 PuTTY package):
- 启动 PuTTYgen
- 加载密钥
- 转到 转换 > 导出 OpenSSH 密钥。
对于 RSA 密钥,它将使用 classic 格式。
如果您使用 ssh-keygen
创建新密钥,只需添加 -m PEM
即可生成 classic 格式的新密钥:
ssh-keygen -m PEM
这个有效:
var key = @"-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAjQtUVe5ewYro8utRXqftODAg9zpqkP3+kmpVoIIXe27ga3jy
rUzJtCItx1jqjdZypcPrxB+8j2nUJj108Bw5y088OquGz/GhBk0uTN+/kQ7K4vnE
y7X4VuKDOloAAXRcyUZ621RWzM/Xp5M/lU6kuR+TtlMd1lpWmeKSNXhfP4gYaPMT
p/4+u247ng+HIwW9CLl5PGIO/AXImt/XyVMKMqw8IgGRKaYBBL2R9wLPBAYVzgHe
svfSDYdeNyh3XG+gbLgq2lmCYcq3wF//Ms3G/cTIm1ipeaeL89bTR9fYhLwQFdlp
UPy8wii/7jlfY/V+8EHQENNGZc3w0wPzP7EdkwIBJQKCAQBIbZoCnQA534xhEQ4b
2bEqsO5VcQZKdJd7nmNSbFE/YnM+G4OJbJ7tzFyyecSOBlaMeV1ktlnox6RK/Pbc
KiuEE+5+/iKiIiJBgZRQ/UayRd3OgEJ2cjNq4wUd9t1oh9yetX1b3zN97jB4pY9a
glSWailB81SC1HGo986KKQ5RDcA9cNa19uBEkUcTdcaph8wLcUDkT2PsavJt1wUF
0d8E3mKejDFMJJBt+642PdnrSK2N+3TtkEx2DxMAoQ5gPfaDWeN4QwbxDeNllfFM
BHj7ezL2N+U037fp/jAMyWVDaqN2leAakXkqQ73pdnvIsYHlxIvNTq0rFD64ELkT
ABq9AoGBAPG63tfV7Bzkd/iX5uIrjJY1UtbxhWMaoaF6tEJ+wZyEpcVEYWcFu0v2
20aFsdFWYFTe2vqkVcJpm3QjUJqBg6D7LWUBmy46VFlXhpvkp9g7I4xeRLT9xWVY
iwCgofyKw3Wa+aZWyBxt3DR2e+WKU5y4/dqAoprgGy3ChgSjM4DLAoGBAJVe2i3o
+3qUzeEIrxSf3H6HOT7fGaXsk+M8zDqrBjSki0sHMNedHMQ3tM/EUc6SnvWyPTZA
AlJSOllIg0eYxCzdiuJ1SUai4g9fp+u6HTkOzETJY7zfBhFM45AHkrh2r6z/u+Yk
yH57QeO+k2BgSDYZgdfX9cYW3C365BpqBCVZAoGBAOSp2bdpfnwyEJ8MO0SlvFa8
0dI+aWuVu30TNOT0cfTsLht4CRxDsSwus79AMpWW5YC3IitdLod4p865n0YLz4px
D0Pe7L0Gvn4Gr8PmIjs+3HAGJVFDFKv5z5jPTR9S1JHXyY+ChfFhALwBYHFZVgL0
LmboYnbT/gixFv13yO9zAoGAcQmCg5uN4DlB2rp2p9LsDLlbwOAvFcfJ3GVcSBK4
lopbkrlVZOWZOosFXvVuVyLZKKKPL/kWg3x/Ls8XPRmpNrV9285g9y8nnO5xPMQx
ylBjOvlEju32wPvqetVMb+sdKPjhOIqJ4yzX6p4OqcxSUnQq6IfA6O60ddKex+GG
mM0CgYAqm3oISjWhyq+4iN4C2eQXtAdAjkA7c0ZaHRFFapOI+ZqPXEi+oyhuPj4Z
ZeUcZkS9cYKkgRGDG33p1ZiR+iY7I6Qv8Seyu/oh75/lL0imiq7yKTmizL2WIow7
lT1yYNZJI/YNEdWPKOZl6kYsHliW8TaUk0yvDC/LPADabjvjzg==
-----END RSA PRIVATE KEY-----
";
MemoryStream keyStream = new MemoryStream(Encoding.UTF8.GetBytes(key));
new PrivateKeyFile(keyStream);
相关问题:。
我没有使用 SFTP 或 OpenSSH 的经验。我正在尝试连接到客户端的 SFTP 以上传文件。
我正在使用 SSH.NET 库 – https://github.com/sshnet/SSH.NET
在我的 C# 代码中,我在字符串变量中有私钥:
var key = @"-----BEGIN OPENSSH PRIVATE KEY-----
// snipped
-----END OPENSSH PRIVATE KEY-----
";
MemoryStream keyStream = new MemoryStream(Encoding.UTF32.GetBytes(key));
Renci.SshNet.ConnectionInfo conn = new Renci.SshNet.ConnectionInfo(
host,
port,
username,
new AuthenticationMethod[]
{
new PrivateKeyAuthenticationMethod(username, new PrivateKeyFile[]
{
new PrivateKeyFile(keyStream, ""),
}),
});
但是我得到一个错误:
invalid private key file.
我的问题是,我看到其他密钥以 BEGIN RSA
开头,但我的密钥以 BEGIN OPENSSH
开头 – 这是问题所在吗?
您的代码有两个问题:
的原因PrivateKeyFile
class使用StreamReader
读取密钥,默认为UTF8
。不是UTF16
。这就是为什么读取失败并显示 vagueinvalid private key file.
如果您将
Encoding.UTF32
更正为Encoding.UTF8
,它仍然会失败。正如您正确猜测的那样 SSH.NET 不支持OPENSSH
格式。最新的SSH.NET 2020.0.1仅支持
ssh-ed25519
键的OPENSSH
格式。它会说:openssh key type: ssh-rsa is not supported
旧版本根本不支持这种格式,他们会说:
Key 'OPENSSH' is not supported
这些
OPENSSH
密钥是由最新版本的 OpenSSH(7.8 和更新版本)生成的。您可以使用
ssh-keygen
将密钥转换为classic OpenSSH格式:ssh-keygen -p -f file -m pem -P passphrase -N passphrase
(如果密钥未使用密码加密,请使用
""
而不是passphrase
)对于 Windows 用户:请注意
ssh-keygen.exe
现在已内置于 Windows 10 中。对于旧版本的 Windows 可以是 downloaded from Microsoft Win32-OpenSSH project .
在 Windows 上,您还可以使用 PuTTYgen(来自 PuTTY package):
- 启动 PuTTYgen
- 加载密钥
- 转到 转换 > 导出 OpenSSH 密钥。
对于 RSA 密钥,它将使用 classic 格式。
如果您使用
ssh-keygen
创建新密钥,只需添加-m PEM
即可生成 classic 格式的新密钥:ssh-keygen -m PEM
这个有效:
var key = @"-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAjQtUVe5ewYro8utRXqftODAg9zpqkP3+kmpVoIIXe27ga3jy
rUzJtCItx1jqjdZypcPrxB+8j2nUJj108Bw5y088OquGz/GhBk0uTN+/kQ7K4vnE
y7X4VuKDOloAAXRcyUZ621RWzM/Xp5M/lU6kuR+TtlMd1lpWmeKSNXhfP4gYaPMT
p/4+u247ng+HIwW9CLl5PGIO/AXImt/XyVMKMqw8IgGRKaYBBL2R9wLPBAYVzgHe
svfSDYdeNyh3XG+gbLgq2lmCYcq3wF//Ms3G/cTIm1ipeaeL89bTR9fYhLwQFdlp
UPy8wii/7jlfY/V+8EHQENNGZc3w0wPzP7EdkwIBJQKCAQBIbZoCnQA534xhEQ4b
2bEqsO5VcQZKdJd7nmNSbFE/YnM+G4OJbJ7tzFyyecSOBlaMeV1ktlnox6RK/Pbc
KiuEE+5+/iKiIiJBgZRQ/UayRd3OgEJ2cjNq4wUd9t1oh9yetX1b3zN97jB4pY9a
glSWailB81SC1HGo986KKQ5RDcA9cNa19uBEkUcTdcaph8wLcUDkT2PsavJt1wUF
0d8E3mKejDFMJJBt+642PdnrSK2N+3TtkEx2DxMAoQ5gPfaDWeN4QwbxDeNllfFM
BHj7ezL2N+U037fp/jAMyWVDaqN2leAakXkqQ73pdnvIsYHlxIvNTq0rFD64ELkT
ABq9AoGBAPG63tfV7Bzkd/iX5uIrjJY1UtbxhWMaoaF6tEJ+wZyEpcVEYWcFu0v2
20aFsdFWYFTe2vqkVcJpm3QjUJqBg6D7LWUBmy46VFlXhpvkp9g7I4xeRLT9xWVY
iwCgofyKw3Wa+aZWyBxt3DR2e+WKU5y4/dqAoprgGy3ChgSjM4DLAoGBAJVe2i3o
+3qUzeEIrxSf3H6HOT7fGaXsk+M8zDqrBjSki0sHMNedHMQ3tM/EUc6SnvWyPTZA
AlJSOllIg0eYxCzdiuJ1SUai4g9fp+u6HTkOzETJY7zfBhFM45AHkrh2r6z/u+Yk
yH57QeO+k2BgSDYZgdfX9cYW3C365BpqBCVZAoGBAOSp2bdpfnwyEJ8MO0SlvFa8
0dI+aWuVu30TNOT0cfTsLht4CRxDsSwus79AMpWW5YC3IitdLod4p865n0YLz4px
D0Pe7L0Gvn4Gr8PmIjs+3HAGJVFDFKv5z5jPTR9S1JHXyY+ChfFhALwBYHFZVgL0
LmboYnbT/gixFv13yO9zAoGAcQmCg5uN4DlB2rp2p9LsDLlbwOAvFcfJ3GVcSBK4
lopbkrlVZOWZOosFXvVuVyLZKKKPL/kWg3x/Ls8XPRmpNrV9285g9y8nnO5xPMQx
ylBjOvlEju32wPvqetVMb+sdKPjhOIqJ4yzX6p4OqcxSUnQq6IfA6O60ddKex+GG
mM0CgYAqm3oISjWhyq+4iN4C2eQXtAdAjkA7c0ZaHRFFapOI+ZqPXEi+oyhuPj4Z
ZeUcZkS9cYKkgRGDG33p1ZiR+iY7I6Qv8Seyu/oh75/lL0imiq7yKTmizL2WIow7
lT1yYNZJI/YNEdWPKOZl6kYsHliW8TaUk0yvDC/LPADabjvjzg==
-----END RSA PRIVATE KEY-----
";
MemoryStream keyStream = new MemoryStream(Encoding.UTF8.GetBytes(key));
new PrivateKeyFile(keyStream);
相关问题: