C# 代码实现 Putty 格式 PPK 文件创建(含加密)
2023-11-05 20:10:48
2022 国家级护网行动即将开启,根据阿里云给出的安全建议,需要将登陆 Linux 的方式改为密钥对方式。我这里使用的远程工具是自己开发的,能够同时管理 Windows 和 Linux,但是以前不支持密钥对...
为什么要使用密钥对方式登录 Linux
传统的登录方式是使用用户名和密码,但是这种方式存在一定的安全风险。如果用户名和密码被泄露,则攻击者就可以轻松登录系统并获取敏感信息。密钥对方式是一种更安全的方式来登录 Linux 系统。它使用一对公钥和私钥来加密和解密数据。公钥存储在服务器上,而私钥存储在客户端。当客户端连接到服务器时,服务器会使用公钥加密数据,客户端使用私钥解密数据。这样,即使攻击者截获了数据,他们也无法解密数据,从而保证了数据的安全性。
如何使用 C# 代码创建 Putty 格式的 PPK 文件
- 生成密钥对
首先,我们需要使用 C# 代码生成密钥对。可以使用 System.Security.Cryptography.Rsa 类来生成密钥对。代码如下:
using System.Security.Cryptography;
// 生成 RSA 密钥对
RSA rsa = RSA.Create();
// 导出公钥
byte[] publicKey = rsa.ExportSubjectPublicKeyInfo();
// 导出私钥
byte[] privateKey = rsa.ExportPkcs8PrivateKey();
- 将公钥转换为 Putty 格式
生成的公钥是 DER 格式的,需要将其转换为 Putty 格式才能使用。可以使用 Puttygen 工具来转换公钥格式。也可以使用 C# 代码来转换公钥格式,代码如下:
using System.Text;
// 将 DER 格式的公钥转换为 Putty 格式
string puttyPublicKey = Encoding.ASCII.GetString(publicKey);
puttyPublicKey = puttyPublicKey.Replace("-----BEGIN PUBLIC KEY-----", "ssh-rsa");
puttyPublicKey = puttyPublicKey.Replace("-----END PUBLIC KEY-----", "");
- 将私钥转换为 Putty 格式
生成的私钥是 PKCS8 格式的,需要将其转换为 Putty 格式才能使用。可以使用 Puttygen 工具来转换私钥格式。也可以使用 C# 代码来转换私钥格式,代码如下:
using System.Text;
// 将 PKCS8 格式的私钥转换为 Putty 格式
string puttyPrivateKey = Encoding.ASCII.GetString(privateKey);
puttyPrivateKey = puttyPrivateKey.Replace("-----BEGIN PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----");
puttyPrivateKey = puttyPrivateKey.Replace("-----END PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----");
- 加密私钥
为了提高安全性,可以对私钥进行加密。可以使用 System.Security.Cryptography.Aes 类来加密私钥。代码如下:
using System.Security.Cryptography;
// 加密私钥
byte[] encryptedPrivateKey = Aes.Create().Encrypt(privateKey);
- 将加密后的私钥转换为 Putty 格式
加密后的私钥是二进制格式的,需要将其转换为 Putty 格式才能使用。可以使用 Puttygen 工具来转换加密后的私钥格式。也可以使用 C# 代码来转换加密后的私钥格式,代码如下:
using System.Text;
// 将加密后的私钥转换为 Putty 格式
string puttyEncryptedPrivateKey = Encoding.ASCII.GetString(encryptedPrivateKey);
puttyEncryptedPrivateKey = puttyEncryptedPrivateKey.Replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----");
puttyEncryptedPrivateKey = puttyEncryptedPrivateKey.Replace("-----END ENCRYPTED PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----");
- 保存 Putty 格式的公钥和私钥
将生成的 Putty 格式的公钥和私钥保存到文件中。
如何使用 Putty 工具使用密钥对方式登录 Linux
- 将公钥复制到服务器
将生成的 Putty 格式的公钥复制到 Linux 服务器的 ~/.ssh/authorized_keys 文件中。
- 使用 Putty 工具连接到服务器
使用 Putty 工具连接到 Linux 服务器时,选择 SSH 协议,在 Host Name 字段中输入服务器的 IP 地址或域名,在 Port 字段中输入服务器的 SSH 端口号,然后单击 Open 按钮。
- 输入私钥密码
如果私钥是加密的,则需要在弹出的对话框中输入私钥密码。
- 登录服务器
输入私钥密码后,即可登录 Linux 服务器。