前期准备
Win + R 输入 cmd 打开命令行
如果在 “我的电脑” 里的 “环境变量” 中已经设置了 %JAVA_HOME%\bin 的路径,则直接输指令即可;否则需要cd到JDK的bin目录再输入相应指令
使用keytool生成密钥文件
keytool -genkey -alias 【别名】-keyalg 【加密算法】-keystore 【密钥文件名/密钥完整路径】
上面是生成密钥所须的最少参数。-genkey
是-genkeypair
的简写,可以使用keytool -genkey --help
查看各个参数的帮助文档
这里示范一下:在D盘的workspace目录下生成密钥文件( jks 是 Java Key Store的缩写,用来存放私钥和证书 )keytool -genkey -alias TestAlias -keyalg RSA -keystore test.jks
。首先要输入密钥库口令,还要确认。然后会提示你输入各种信息,最后让你确认(输入Y
),如果直接回车会认为是false,让你重输。
使用keytool查看密钥
使用 keytool -list
命令可以查看密钥信息
keytool -list -keystore 【密钥文件名/密钥完整路径】
可以查看上面密钥的信息
- 密钥库类型:PKCS12(一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥、私钥、证书等)
- 密钥库提供方:SUN
- 密钥别名
- 创建密钥的日期
- 指纹证书(SHA-256)
可以直接附带 -storepass 参数指定密钥,从而避免再次输入
提取公私钥
JKS(Java Key Store)就是利用Java Keytool 工具生成的Keystore文件,JKS文件由公钥和密钥构成,其中的公钥就是我们所说的证书,即cer为后缀的文件,而私钥就是密钥,即以key为后缀的文件。
提取公钥
keytool -export -alias 【密钥别名】-file 【导出路径】-keystore 【密钥文件路径】-storepass 【密码】
- export 表示导出密钥
- file 指定文件,如果没有该参数则打印到控制台上,可以看到是一堆加密后的乱码
keytool -export -alias TestAlias -file test.crt -keystore test.keystore -storepass 123456
生成的证书用记事本直接打开是一堆乱码,但可以通过 keytool 查看证书信息 keytool -printcert -file 【证书路径】
提取私钥
私钥无法通过keytool来提取,只能通过java的KeyStore类的getEntry()或getKey()来获取私钥
/**
* 从密钥文件中提取私钥
*
* @param keyStorePath 密钥文件路径
* @param alias 密钥别名
* @param password 密码
* @return 私钥
*/
public static PrivateKey getPrivateKey(String keyStorePath, String alias, String password) {
String keyStoreType = "jks";
char[] pwd = password.toCharArray();
try {
FileInputStream fis = new FileInputStream(keyStorePath);
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(fis, password.toCharArray());
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection(pwd));
return pkEntry.getPrivateKey();
} catch (IOException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (UnrecoverableEntryException e) {
e.printStackTrace();
}
return null;
}
使用jarsigner签名
jarsigner -verbose -keystore 【密钥文件】-signedjar 【签名后的apk名称】【待签名的apk】【keystore中的别名】
注意:最后一个参数是keystore中的别名,不是文件名,如果写成文件名就好提示 “jarsigner 找不到 xxx 的证书链。xx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目”的错误
这里是做OPPO推送厂商通道的时候,需要对OPPO提供的APK进行签名的例子 jarsigner -verbose -keystore sanfukey.jks -signedjar OppoSignVerify_signed.apk OppoSignVerify.apk 福建省三福百货有限公司