理解密钥库、证书和别名

100

密钥库是实际证书吗?还是别名是证书?

如果我使用不同的别名签署我的应用程序,会影响到市场上的更新吗?还是我需要使用不同的密钥库来搞砸事情?别名的信息在哪里可以查看?

1个回答

130
Keytool 生成的密钥库文件存储了私钥和公钥对。密钥库中每个条目或条目对应于一个唯一的别名。简而言之:

密钥库条目 = 私钥 + 公钥对 = 根据别名识别

密钥库通过各自的密码保护每个私钥,并使用(可能不同的)密码保护整个密钥库的完整性。
例如,当您使用Eclipse Android工具的“Export Signed Application Package”选项签署Android应用程序时,首先需要选择密钥库,然后需要从该密钥库中选择单个别名/条目/对。在提供密钥库和所选别名的密码后,该应用程序将被签署,并且该别名的公钥(证书)将嵌入APK中。
现在回答您的问题,只有使用与别名 'foo' 签署的应用程序再次签署更新时才能发布应用程序的更新。如果丢失存储您的别名的密钥库,则无法发布应用程序的更新版本。
但是,有一种方法可以使用 keytool -keyclone 克隆密钥库中的现有别名来使用新别名签署应用程序:
创建一个新的密钥库条目,该条目具有与原始条目相同的私钥和证书链。
原始条目由别名标识(如果未提供,则默认为“mykey”)。新(目标)条目由dest_alias标识。如果在命令行上没有提供目标别名,则会提示用户输入。
如果私钥密码与密钥库密码不同,则只有在提供了有效的keypass时才会克隆条目。这是用于保护与别名关联的私钥的密码。如果在命令行上没有提供密钥密码,并且私钥密码与密钥库密码不同,则会提示用户输入。如果需要,可以使用不同的密码来保护克隆条目中的私钥。如果在命令行上没有提供-new选项,则会提示用户输入新条目的密码(并且可以选择将其设置为与克隆条目的私钥相同的密码)。
更多信息:

http://download.oracle.com/javase/1.5.0/docs/tooldocs/solaris/keytool.html

http://developer.android.com/guide/publishing/app-signing.html


3
开发者网站建议为所有应用程序使用相同的证书。那么这是否意味着只要我使用相同的密钥库,我可以使用任何别名和任何密码,而不会影响更新,因为它只是一个引用?实际的密钥库才是重要的部分? - Roger
2
我重写了我的答案以使其更准确。简而言之,您必须确实使用相同的别名来签署应用程序的所有更新。 - Julio Gorgé
2
@Julio 那么最佳实践是使用相同的别名来发布您想要发布的所有不同应用程序,就像开发网站建议的那样吗?我认为没有必要为所有应用程序创建单独的别名。 - Tony Chan
@JulioGorgé,您是指相同的别名还是相同的密钥。别名只是一个名称,我可以重命名别名。只要应用程序中的密钥(具体来说是公钥)匹配,您就可以发布更新。 - Dheeraj Bhaskar
我需要使用相同的别名签署所有应用程序吗?每次签署时,我是否需要为所有应用程序使用相同的别名(使用相同的密码)?如果我使用相同的别名签署新应用程序,那么该新应用程序的公钥和私钥是否会不同? - Tanvir
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接