返回

C# 代码实现 Putty 格式 PPK 文件创建(含加密)

开发工具

2022 国家级护网行动即将开启,根据阿里云给出的安全建议,需要将登陆 Linux 的方式改为密钥对方式。我这里使用的远程工具是自己开发的,能够同时管理 Windows 和 Linux,但是以前不支持密钥对...

为什么要使用密钥对方式登录 Linux

传统的登录方式是使用用户名和密码,但是这种方式存在一定的安全风险。如果用户名和密码被泄露,则攻击者就可以轻松登录系统并获取敏感信息。密钥对方式是一种更安全的方式来登录 Linux 系统。它使用一对公钥和私钥来加密和解密数据。公钥存储在服务器上,而私钥存储在客户端。当客户端连接到服务器时,服务器会使用公钥加密数据,客户端使用私钥解密数据。这样,即使攻击者截获了数据,他们也无法解密数据,从而保证了数据的安全性。

如何使用 C# 代码创建 Putty 格式的 PPK 文件

  1. 生成密钥对

首先,我们需要使用 C# 代码生成密钥对。可以使用 System.Security.Cryptography.Rsa 类来生成密钥对。代码如下:

using System.Security.Cryptography;

// 生成 RSA 密钥对
RSA rsa = RSA.Create();

// 导出公钥
byte[] publicKey = rsa.ExportSubjectPublicKeyInfo();

// 导出私钥
byte[] privateKey = rsa.ExportPkcs8PrivateKey();
  1. 将公钥转换为 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-----", "");
  1. 将私钥转换为 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-----");
  1. 加密私钥

为了提高安全性,可以对私钥进行加密。可以使用 System.Security.Cryptography.Aes 类来加密私钥。代码如下:

using System.Security.Cryptography;

// 加密私钥
byte[] encryptedPrivateKey = Aes.Create().Encrypt(privateKey);
  1. 将加密后的私钥转换为 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-----");
  1. 保存 Putty 格式的公钥和私钥

将生成的 Putty 格式的公钥和私钥保存到文件中。

如何使用 Putty 工具使用密钥对方式登录 Linux

  1. 将公钥复制到服务器

将生成的 Putty 格式的公钥复制到 Linux 服务器的 ~/.ssh/authorized_keys 文件中。

  1. 使用 Putty 工具连接到服务器

使用 Putty 工具连接到 Linux 服务器时,选择 SSH 协议,在 Host Name 字段中输入服务器的 IP 地址或域名,在 Port 字段中输入服务器的 SSH 端口号,然后单击 Open 按钮。

  1. 输入私钥密码

如果私钥是加密的,则需要在弹出的对话框中输入私钥密码。

  1. 登录服务器

输入私钥密码后,即可登录 Linux 服务器。