创建和显示密钥对 - 适用于 .NET 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建和显示密钥对

此示例向您展示如何使用 适用于 .NET 的 AWS 开发工具包 创建密钥对。应用程序使用新密钥对的名称和PEM文件的名称(扩展名为".pem")。它创建密钥对,将私钥写入PEM文件,然后显示所有可用的密钥对。如果没有提供命令行参数,应用程序只需显示所有可用的密钥对。

以下部分提供了此示例的片段。的 示例的完整代码 之后显示,并且可以按原样构建和运行。

创建密钥对

以下代码段创建密钥对,然后将私钥存储到给定的PEM文件。

示例 在本主题结束时 显示此片段正在使用。

// // Method to create a key pair and save the key material in a PEM file private static async Task CreateKeyPair( IAmazonEC2 ec2Client, string keyPairName, string pemFileName) { // Create the key pair CreateKeyPairResponse response = await ec2Client.CreateKeyPairAsync(new CreateKeyPairRequest{ KeyName = keyPairName }); Console.WriteLine($"\nCreated new key pair: {response.KeyPair.KeyName}"); // Save the private key in a PEM file using (var s = new FileStream(pemFileName, FileMode.Create)) using (var writer = new StreamWriter(s)) { writer.WriteLine(response.KeyPair.KeyMaterial); } }

显示可用的密钥对

以下代码段显示可用密钥对的列表。

示例 在本主题结束时 显示此片段正在使用。

// // Method to show the key pairs that are available private static async Task EnumerateKeyPairs(IAmazonEC2 ec2Client) { DescribeKeyPairsResponse response = await ec2Client.DescribeKeyPairsAsync(); Console.WriteLine("Available key pairs:"); foreach (KeyPairInfo item in response.KeyPairs) Console.WriteLine($" {item.KeyName}"); }

完整代码

本节显示此示例的相关参考和完整代码。

NuGet 程序包:

编程元素:

using System; using System.Threading.Tasks; using System.IO; using Amazon.EC2; using Amazon.EC2.Model; using System.Collections.Generic; namespace EC2CreateKeyPair { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to create and store a key pair class Program { static async Task Main(string[] args) { // Create the EC2 client var ec2Client = new AmazonEC2Client(); // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count == 0) { // In the case of no command-line arguments, // just show help and the existing key pairs PrintHelp(); Console.WriteLine("\nNo arguments specified."); Console.Write( "Do you want to see a list of the existing key pairs? ((y) or n): "); string response = Console.ReadLine(); if((string.IsNullOrEmpty(response)) || (response.ToLower() == "y")) await EnumerateKeyPairs(ec2Client); return; } // Get the application parameters from the parsed arguments string keyPairName = CommandLine.GetParameter(parsedArgs, null, "-k", "--keypair-name"); string pemFileName = CommandLine.GetParameter(parsedArgs, null, "-p", "--pem-filename"); if(string.IsNullOrEmpty(keyPairName)) CommandLine.ErrorExit("\nNo key pair name specified." + "\nRun the command with no arguments to see help."); if(string.IsNullOrEmpty(pemFileName) || !pemFileName.EndsWith(".pem")) CommandLine.ErrorExit("\nThe PEM filename is missing or incorrect." + "\nRun the command with no arguments to see help."); // Create the key pair await CreateKeyPair(ec2Client, keyPairName, pemFileName); await EnumerateKeyPairs(ec2Client); } // // Method to create a key pair and save the key material in a PEM file private static async Task CreateKeyPair( IAmazonEC2 ec2Client, string keyPairName, string pemFileName) { // Create the key pair CreateKeyPairResponse response = await ec2Client.CreateKeyPairAsync(new CreateKeyPairRequest{ KeyName = keyPairName }); Console.WriteLine($"\nCreated new key pair: {response.KeyPair.KeyName}"); // Save the private key in a PEM file using (var s = new FileStream(pemFileName, FileMode.Create)) using (var writer = new StreamWriter(s)) { writer.WriteLine(response.KeyPair.KeyMaterial); } } // // Method to show the key pairs that are available private static async Task EnumerateKeyPairs(IAmazonEC2 ec2Client) { DescribeKeyPairsResponse response = await ec2Client.DescribeKeyPairsAsync(); Console.WriteLine("Available key pairs:"); foreach (KeyPairInfo item in response.KeyPairs) Console.WriteLine($" {item.KeyName}"); } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: EC2CreateKeyPair -k <keypair-name> -p <pem-filename>" + "\n -k, --keypair-name: The name you want to assign to the key pair." + "\n -p, --pem-filename: The name of the PEM file to create, with a \".pem\" extension."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class that represents a command line on the console or terminal. // (This is the same for all examples. When you have seen it once, you can ignore it.) static class CommandLine { // Method to parse a command line of the form: "--param value" or "-p value". // If "param" is found without a matching "value", Dictionary.Value is an empty string. // If "value" is found without a matching "param", Dictionary.Key is "--NoKeyN" // where "N" represents sequential numbers. public static Dictionary<string,string> Parse(string[] args) { var parsedArgs = new Dictionary<string,string>(); int i = 0, n = 0; while(i < args.Length) { // If the first argument in this iteration starts with a dash it's an option. if(args[i].StartsWith("-")) { var key = args[i++]; var value = string.Empty; // Is there a value that goes with this option? if((i < args.Length) && (!args[i].StartsWith("-"))) value = args[i++]; parsedArgs.Add(key, value); } // If the first argument in this iteration doesn't start with a dash, it's a value else { parsedArgs.Add("--NoKey" + n.ToString(), args[i++]); n++; } } return parsedArgs; } // // Method to get a parameter from the parsed command-line arguments public static string GetParameter( Dictionary<string,string> parsedArgs, string def, params string[] keys) { string retval = null; foreach(var key in keys) if(parsedArgs.TryGetValue(key, out retval)) break; return retval ?? def; } // // Exit with an error. public static void ErrorExit(string msg, int code=1) { Console.WriteLine("\nError"); Console.WriteLine(msg); Environment.Exit(code); } } }

其他注意事项

  • 创建密钥对时,必须保存返回的私钥,因为以后无法检索私钥。