# 生成密钥

> 原文： [https://docs.oracle.com/javase/tutorial/security/toolsign/step3.html](https://docs.oracle.com/javase/tutorial/security/toolsign/step3.html)

如果代码签名者还没有合适的私钥来签名代码，则必须首先生成密钥，以及代码接收者的运行时系统可以使用的相应公钥来验证签名。

由于本课程假定您还没有这样的密钥，因此您将创建一个名为`examplestore`的密钥库，并使用新生成的公钥/私钥对创建一个条目（使用证书中的公钥）。

在命令窗口中键入以下命令以创建名为`examplestore`的密钥库并生成密钥：

```
keytool -genkey -alias signFiles -keystore examplestore

```

系统将提示您输入密钥和密钥库的密码。

## keytool 命令的子部分

让我们看看每个`keytool`子部分的含义。

*   生成密钥的命令是 _-genkey_ 。
*   _-alias signFiles_ 子部分指示将来用于引用包含将生成的密钥的密钥库条目的别名。
*   _-keystore examplestore_ 子部分指示您正在创建或已在使用的密钥库的名称（以及可选的路径）。
*   _ 存储传递 _ 值，提示您指定密钥库密码。
*   提示您输入的 _keypass_ 值指定要生成的私钥的密码。您始终需要此密码才能访问包含该密钥的密钥库条目。该条目不必拥有自己的密码。当系统提示您输入密钥密码时，您可以选择让它与密钥库密码相同。

**注意：**出于安全原因，您不应在命令行上设置密钥或密钥库密码，因为这样可以更容易地拦截它们。

## 杰出名称信息

如果使用前面的`keystore`命令，将提示您输入专有名称信息。以下是提示;粗体表示您应该键入的内容。

```
What is your first and last name?
  [Unknown]:  Susan Jones 
What is the name of your organizational unit?
  [Unknown]:  Purchasing 
What is the name of your organization?
  [Unknown]:  ExampleCompany 
What is the name of your City or Locality?
  [Unknown]:  Cupertino 
What is the name of your State or Province?
  [Unknown]:  CA 
What is the two-letter country code for this unit?
  [Unknown]:  US 
Is <CN=Susan Jones, OU=Purchasing, O=ExampleCompany,
    L=Cupertino, ST=CA, C=US> correct?
  [no]:  y 

```

## 命令结果

`keytool`命令在执行命令的同一目录中创建名为`examplestore`的密钥库（如果它尚不存在）。该命令为其实体名称为 Susan Jones 的公用名称和 Purchasing 的组织单位的实体生成公钥/私钥对。

该命令创建一个包含公钥和可分辨名称信息的自签名证书。 （您提供的专有名称将用作证书中的“主题”字段。）此证书有效期为 90 天，如果您未指定 _- 有效期 _ 选项，则为默认有效期。证书与别名`signFiles`引用的密钥库条目中的私钥相关联。

自签名证书对于开发和测试应用程序很有用。但是，会警告用户使用不受信任的证书对应用程序进行签名，并询问他们是否要运行该应用程序。要使用户更有信心运行应用程序，请使用由认可的证书颁发机构颁发的证书。

**注意：**如果接受选项默认值或希望提示您输入各种值，则命令可能会更短。无论何时执行`keytool`命令，默认值都用于具有默认值的未指定选项，并提示您输入任何所需值。对于`genkey`命令，具有默认值的选项包括 _ 别名 _（默认为`mykey`），_ 有效期 _（90 天）和 _ 密钥库 _（您的主目录中名为`.keystore`的文件。所需值包括 _dname_ ， _storepass_ 和 _keypass_ 。