Java代码签名证书怎么把企业身份签进JAR文件
Java代码签名证书用来证明JAR文件由谁发布,并让接收方检查文件有没有被改动。客户要求核对软件供应商、插件平台要求验证发布者,或者企业准备给更新包增加身份检查,这些场景都需要认真安排签名。
如果只是自己开发和测试,不必为了让JAR运行就购买商业证书。普通Java程序没有“一律签名才能启动”的要求。先弄清谁要检查签名、检查哪个文件,再采购和配置,才不会花了钱却没有用在需要的地方。

先确认客户到底要检查什么
客户说“交付的程序要有数字签名”,开发人员应接着确认:是检查JAR本身,还是检查外面的Windows安装包?这两个文件要分别处理。给安装程序签名,不会给里面的每个JAR自动加上独立签名。
直接交付JAR,检查的是JAR签名和签名者证书。发布到组件仓库,要使用仓库指定的制品签名办法,不能把JAR内部签名当成所有仓库都接受的上传凭据。涉及插件平台,则先拿到平台的证书和发布者要求。
还有一点要讲清:JAR已签名,不代表运行它的程序会主动检查。自己开发的更新器需要写入验证逻辑,检查签名、信任的发布者和版本;否则,它仍可能接收一份根本没有签名的更新包。
两个工具记住分工就够了
keytool负责管理和查看密钥、证书,jarsigner负责签署和验证JAR。找不到证书、认不出别名时,先检查密钥库;要给文件签名或检查结果,再使用jarsigner。
签名必须调用私钥。只把一张公开证书导入电脑,不能完成签名。查看密钥条目时,要找能调用私钥的条目,不能把“证书已导入”当成“签名已准备好”。
密钥也不一定保存在PFX或JKS文件里。本地令牌通过设备接口提供签名能力,云产品通过客户端和授权连接云端密钥。两者都不要求你先把私钥导出成文件。网上那些“先生成一个本地密钥库”的旧教程,不宜直接套用到商业产品上。
第一次签JAR就按这五步做
第一步,把文件做完再签。完成编译、混淆、依赖合并和资源替换,确定这就是准备交给客户的JAR。不要签完后又往里面修改配置或替换类文件。
第二步,装好JDK和证书配套组件。硬件方案连接Ukey,安装驱动;云方案登录配套客户端,完成授权。然后配置Java使用的密钥接口。拿早期JDK的参数配置新版本,容易在这一步报错,所以工具版本要先看清楚。
第三步,用keytool列出证书条目,核对企业名称、有效期和私钥别名。机器上有旧证书时,不要默认选择第一个条目,把本次使用的别名记录下来。
第四步,在jarsigner中选中这个别名,签署最终JAR,并添加证书服务提供的时间戳。令牌与云客户端的连接参数使用各自安装指南中的配置,不能互相照抄。密码和PIN通过安全的交互方式输入,不要写进公开脚本。
第五步,对签好的文件执行验证。例如,文件名为app.jar,可运行“jarsigner -verify -verbose -certs -strict app.jar”。这条命令用来查看签名、证书及严重警告;实际使用时换成自己的文件名。
验证结果重点看这四项
先看签名是否有效。若已签内容被改动,验证会发现不一致,应回到最终构建产物重新签署,不要通过删除报错条目来“修好”结果。
再看签名者是不是自己的企业。签名有效却用了测试证书、旧主体或另一家公司的证书,都不能按预期交付。企业名称与客户认可的供应商信息要对得上。
第三看证书链和时间戳。出现证书链无法验证,应检查中间证书及客户JDK的信任库;时间戳失败则重新检查服务配置和网络连接。不要只看到一句“已验证”,就忽略后面的警告。
最后看是否存在需要签署却未签署的条目。签名文件存在,不等于整个交付包的每一项都获得了签名保护。处理完警告后,把这份JAR放到客户实际使用的JDK环境再验证一次,保留输出结果。
如果报错指向被禁用的算法,应更换为当前JDK支持的安全算法并重新签名,而不是通过放宽安全配置掩盖问题。
本地Ukey和云签名怎么选
Java项目准备采用本地令牌签名,可以选择GlobalSign EV代码签名证书。安信SSL证书提供这款产品,价格4000元/年,随产品交付Ukey,支持国内顺丰邮寄。安装时可参考GlobalSign的Java令牌签名说明,通过PKCS#11接口连接JDK与设备。
这款产品的管理方式很直接:设备放在哪、谁能使用、PIN由谁保管,都能落实到人。要提前准备好发布电脑,别等程序打包完,才开始找令牌或安装驱动。
不想收发实体令牌,可以选安信SSL证书的Certum EV代码签名证书,2500元/年,云签名,无需本地Ukey。Certum提供云端使用jarsigner的指导,完成客户端连接和授权后,再从Java工具调用签名能力。
两款年费相差1500元。需要实体设备集中保管,选GlobalSign;希望减少设备调配,选Certum。准备接入自动构建的团队,应在购买前确认无人值守授权方式和套餐调用限制,云签名本身不等于已经包含自动化接口。
文件交出去以后怎样减少返工
签名结束后,保存最终JAR、版本号和验证记录。以后修复一个类文件、替换一张图片,也要重新构建和签名,不能把旧验证截图用于新文件。
换证时要改工具中的别名或证书选择条件。如果客户的软件管理规则固定了旧证书指纹,还应提前通知客户更新规则。正式发布前用新证书签一个测试包,让客户验证通过,再切换正式版本。
Java代码签名证书常见问题
1、免费自签名证书能代替商业代码签名证书吗?
测试可以用,面向客户的企业身份验证不能直接替代。自签名只能证明文件由那把私钥签署,不能自动证明私钥持有人就是某家企业,也不会自动进入客户的信任列表。
2、网站已经买了SSL证书还能拿来签JAR吗?
不能把网站服务器证书直接当成代码签名证书。两者证书用途不同,网站HTTPS和JAR签名要分别配置。
3、签名是不是把Java源码加密了?
不是。签名提供身份和完整性验证,不会阻止反编译,也不能代替混淆、授权管理或漏洞修复。
4、验证JAR需要开发者的Ukey吗?
不需要。Ukey用于调用私钥签名,接收方验证使用公开证书和信任信息,不应索取开发者的令牌、PIN或私钥。
5、证书过期后以前签好的JAR会马上失效吗?
不会仅因签名证书到期就一概失效。有效可信时间戳能帮助验证签名发生在证书有效期内,最终还要通过证书状态和JDK安全策略检查。新版本则必须使用有效凭据重新签署。
相关阅读:Java代码签名证书申请
