50

当我尝试像下面这样在罐子中自我签名时。

jarsigner -keystore my keystore myjar.jar myalias

它给出如下警告:

没有提供 -tsa 或 -tsacert 并且这个 jar 没有时间戳。如果没有时间戳,用户可能无法在签名者证书的到期日期 (2014-05-08) 或任何未来的撤销日期之后验证此 jar。

请帮助解决问题。

4

4 回答 4

66

最近的 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)

于 2014-06-12T07:37:04.607 回答
23

此警告告诉您,您的 jar 证书将在 5 月到期。因此,用户将无法在此日期之后执行您的程序。

为了改善这种情况,添加了时间戳功能。这样,您可以告诉用户:“我在这个时间点使用了证书(由时间戳机构 - tsa 提供并验证),当时它仍然有效!” 只要您不更改并退出您的 jar,它仍然会运行,即使在证书过期后也是如此,因为用户在创建时看到证书确实有效。

供参考:http ://docs.oracle.com/javase/7/docs/technotes/guides/security/time-of-signing.html

tl;博士:如果您忽略警告,您的 jar 将不会在 08 年 5 月 14 日之后运行。添加时间戳,只要您不修改任何内容,它仍然会运行。

问候

于 2014-02-25T13:48:54.390 回答
3

我面临着同样的问题。如果没有时间戳,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应该相同。

于 2017-04-17T13:40:20.477 回答
-16

如果使用 JDK Java/Oracle 1.7 u51 进行更新,则会导致此错误。此 JDK 与前一个不同。

您可以在 u51 之前安装以前版本的 JDK(例如 1.7u45),或者安装 JDK 6。

然后,当您重新编译时,您将不会看到错误。

于 2014-02-19T16:10:20.377 回答