当我尝试像下面这样在罐子中自我签名时。
jarsigner -keystore my keystore myjar.jar myalias
它给出如下警告:
没有提供 -tsa 或 -tsacert 并且这个 jar 没有时间戳。如果没有时间戳,用户可能无法在签名者证书的到期日期 (2014-05-08) 或任何未来的撤销日期之后验证此 jar。
请帮助解决问题。
当我尝试像下面这样在罐子中自我签名时。
jarsigner -keystore my keystore myjar.jar myalias
它给出如下警告:
没有提供 -tsa 或 -tsacert 并且这个 jar 没有时间戳。如果没有时间戳,用户可能无法在签名者证书的到期日期 (2014-05-08) 或任何未来的撤销日期之后验证此 jar。
请帮助解决问题。
最近的 Java 7 提供了一个(礼貌?)关于已经存在了十年的东西的警告......
可信时间戳是在 Java 5 (2004) 中引入的。这样做的动机是,当证书过期时,开发人员不会被迫“每年重新签署部署的 JAR 文件”。
→ http://docs.oracle.com/javase/1.5.0/docs/guide/security/time-of-signing.html
基于 URL 的时间戳颁发机构 (TSA) 通常由颁发证书颁发机构 (CA) 提供,以使用 CA 颁发的相同证书。例如,digicert tsa url 可以按如下方式访问:
jarsigner -tsa http://timestamp.digicert.com [.. other options]
→ http://www.digicert.com/code-signing/java-code-signing-guide.htm
带有自签名证书的时间戳可能是一个难以实现的目标,因为 (1) TSA 时间戳需要是可信的公平交易(排除“自时间戳”),并且 (2) 设置了典型的 TSA URL 以使用由同一 CA 组织提供的证书(即 TSA URL 不处理自签名证书)
更新:
尝试为自签名证书添加时间戳的 URL:
-tsa http://sha256timestamp.ws.symantec.com/sha256/timestamp
根据 brad-turek 的评论)对于专用网络,可以考虑使用内部时间戳授权,例如 Thales (nCipher) 时间戳服务器(或历史上的 OpenTSA)
此警告告诉您,您的 jar 证书将在 5 月到期。因此,用户将无法在此日期之后执行您的程序。
为了改善这种情况,添加了时间戳功能。这样,您可以告诉用户:“我在这个时间点使用了证书(由时间戳机构 - tsa 提供并验证),当时它仍然有效!” 只要您不更改并退出您的 jar,它仍然会运行,即使在证书过期后也是如此,因为用户在创建时看到证书确实有效。
供参考:http ://docs.oracle.com/javase/7/docs/technotes/guides/security/time-of-signing.html
tl;博士:如果您忽略警告,您的 jar 将不会在 08 年 5 月 14 日之后运行。添加时间戳,只要您不修改任何内容,它仍然会运行。
问候
我面临着同样的问题。如果没有时间戳,jar 将不会被签名。
当您添加-tsa http://timestamp.digicert.com
时,它不会给出任何警告或错误,但仍然不会对 jar 进行签名。
但后来我添加了以下部分,它对我有用。
-tsacert alias
所以,基本上我的最终命令是
jarsigner -verbose -tsa http://timestamp.digicert.com -tsacert alias -sigalg SHA256withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk alias_name
请记住alias_name
命令中的 in 和 inkeystore
应该相同。
如果使用 JDK Java/Oracle 1.7 u51 进行更新,则会导致此错误。此 JDK 与前一个不同。
您可以在 u51 之前安装以前版本的 JDK(例如 1.7u45),或者安装 JDK 6。
然后,当您重新编译时,您将不会看到错误。