【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~

news2024/9/24 11:23:27

Java可执行命令之jarsigner

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 语法
      • 3.1.1 可选参数:jarsigner -keystore < url>
      • 3.1.2 可选参数:jarsigner -storepass <口令>
      • 3.1.3 可选参数:jarsigner -keypass <口令>
      • 3.1.4 可选参数:jarsigner -tsa < url>
      • 3.1.5 可选参数:jarsigner -verify
  • 4️⃣ 应用场景
  • 5️⃣ 使用技巧
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

jarsigner是Java Development Kit (JDK) 提供的一个命令行工具,用于对JAR文件进行数字签名。它的设计目的是提供身份验证和完整性保护,确保在分发和发布Java应用程序时的安全性。

数字签名是一种用于确认数据的来源和完整性的机制。使用私钥对数据进行签名,并使用公钥进行验证。当用户下载应用程序时,可以使用与应用程序打包时使用的公钥进行验证,以确认应用程序未被篡改且来自可信的源。

jarsigner基于公钥基础设施 (Public Key Infrastructure, PKI) 技术。它使用非对称加密算法(如RSA)生成密钥对,并将私钥用于对JAR文件进行签名,而公钥用于验证签名。

当签名成功后,签名信息被添加到JAR文件的MANIFEST.MF文件中。验证时,使用公钥检查签名和时间戳是否有效。

2️⃣ 优势和缺点

优点:

  • 确保应用程序的完整性:通过校验数字签名,可以验证应用程序没有被篡改;
  • 防止篡改和中间人攻击:数字签名提供了认证机制,防止不被授权的修改或分发应用程序;
  • 增加用户信任度:数字签名是建立与用户之间信任关系的重要方式。

缺点:

  • 增加开发和部署复杂性:使用jarsigner需要额外的步骤来生成和管理密钥库、创建签名、以及进行时间戳等操作。

3️⃣ 使用

3.1 语法

以下是jarsigner命令的基本语法:

// 1、签名
jarsigner [-options] jar-file alias
// 2、验证签名
jarsigner -verify [-options] jar-file [alias ...]

其中,-options 是可选参数, jar-file 是要签名的JAR文件,alias 指定了密钥库中用于签名的别名。将 jarsigner 命令支持的所有可选参数汇总如下表:

参数说明
-keystore <url>密钥库位置
-storepass <口令>用于密钥库完整性的口令
-storetype <类型>密钥库类型
-keypass <口令>私有密钥的口令 (如果不同)
-certchain <文件>替代证书链文件的名称
-sigfile <文件>.SF/.DSA 文件的名称
-signedjar <文件>已签名的 JAR 文件的名称
-digestalg <算法>摘要算法的名称
-sigalg <算法>签名算法的名称
-verify验证已签名的 JAR 文件
-verbose[:suboptions]签名/验证时输出详细信息。子选项可以是 all, grouped 或 summary
-certs输出详细信息和验证时显示证书
-tsa <url>时间戳颁发机构的位置
-tsacert <别名>时间戳颁发机构的公共密钥证书
-tsapolicyid <oid>时间戳颁发机构的 TSAPolicyID
-tsadigestalg <算法>时间戳请求中的摘要数据的算法
-altsigner <类>替代的签名机制的类名
-altsignerpath <路径列表>替代的签名机制的位置
-internalsf在签名块内包含 .SF 文件
-sectionsonly不计算整个清单的散列
-protected密钥库具有受保护验证路径
-providerName <名称>提供方名称
-providerClass <类>加密服务提供方的名称
-providerArg <参数>...主类文件和构造器参数
-strict将警告视为错误

上面表格汇总了jarsigner的所有可选参数,读者可以根据自己的需求参照表格选择所需参数。下是主要介绍一些常用的可选参数:

  • -keystore <url>:指定密钥库 (Keystore) 文件的路径和名称。密钥库是存储与签名相关的密钥和证书信息的地方。例如,-keystore mykeystore.jks 将使用名为 mykeystore.jks 的密钥库文件进行签名;

  • -storepass <口令>:指定密钥库的密码。需要提供正确的密码才能对密钥库进行访问和执行签名操作。例如,-storepass mypassword 指定密钥库密码为 mypassword

  • -keypass <口令>:指定密钥的密码。当密钥库包含多个密钥时,可以为每个密钥设置不同的密码。例如,-keypass mykeypassword 指定用于签名的密钥密码为 mykeypassword

  • -tsa <url>:指定时间戳服务器的URL。时间戳是对签名进行的附加操作,用于在证书过期后仍然可以验证应用程序。通过提供时间戳服务器的URL,可以在签名中添加时间戳。例如,-tsa http://timestamp.digicert.com 指定了使用 http://timestamp.digicert.com 作为时间戳服务器。

这些是 jarsigner 命令中最常用的可选参数。它们允许指定密钥库的位置、密码以及相关的签名信息和时间戳。使用这些参数,可以根据自己的需求来执行签名操作,并确保应用程序的完整性和安全性。

3.1.1 可选参数:jarsigner -keystore < url>

jarsigner -keystore <url> 命令中使用 <url> 代表密钥库文件的路径和名称。

以下示例演示了命令的使用和作用:

jarsigner -keystore mykeystore.jks MyApp.jar

在这个命令中,-keystore 参数指定了密钥库文件的名称 mykeystore.jks。成功执行命令后,MyApp.jar 文件将使用 mykeystore.jks 密钥库中的默认别名来进行签名。此过程将确保应用程序的完整性和身份验证。

需要注意,在实际使用中,根据情况提供自己的密钥库文件并相应地更换 -keystore 参数值。可以使用 Java 自带的 keytool 工具来生成和管理密钥库,其中包含有关密钥和证书的信息。

通过使用 jarsigner -keystore <url> 命令,即可以指定要用于签名的密钥库文件,在分发和发布 Java 应用程序时提供身份验证和完整性保护。

3.1.2 可选参数:jarsigner -storepass <口令>

jarsigner -storepass <口令> 命令中使用 <口令> 代表密钥库的密码,即jarsigner -storepass <password>

通过使用 jarsigner -storepass <password> 命令,你可以在签名过程中提供密钥库的密码,以便 jarsigner 可以正确访问密钥库并完成签名操作。

以下是示例命令的使用和作用:

jarsigner -storepass mypassword MyApp.jar

在这个命令中,-storepass 参数指定了密钥库的密码 mypassword。成功执行命令后,MyApp.jar 文件将使用指定的密钥库进行签名,而不会提示输入密钥库密码。

需要确保提供的密码是与密钥库文件匹配的有效密码。如果密码不正确,那么 jarsigner 将无法访问密钥库并完成签名操作。

3.1.3 可选参数:jarsigner -keypass <口令>

jarsigner -keypass <password> 命令中使用 <password> 代表密钥的密码。通过使用 jarsigner -keypass <password> 命令,可以在签名过程中提供密钥的密码,以便 jarsigner 可以正确使用密钥对 JAR 文件进行签名。

以下是示例命令的使用和作用:

jarsigner -keypass mykeypassword MyApp.jar

在这个命令中使用 -keypass 参数指定了密钥的密码为 mykeypassword。成功执行命令后,MyApp.jar 文件将使用指定的密钥进行签名,而不会提示输入密钥密码。

需要注意确保提供的密码是与密钥匹配的有效密码。如果密码不正确,那么 jarsigner 将无法访问密钥并完成签名操作。

3.1.4 可选参数:jarsigner -tsa < url>

jarsigner -tsa <URL> 命令中使用 <URL> 代表时间戳服务器的URL。

在应用程序开发中,为了确保签名的持久性和验证的可靠性,可以将时间戳添加到签名中。时间戳是一个由权威机构提供的记录签名时间的标记,可以用来验证签名是否在证书过期之前完成。

以下是示例命令的使用和作用:

jarsigner -tsa http://timestamp.digicert.com MyApp.jar

在这个命令中,-tsa 参数指定了时间戳服务器的URL http://timestamp.digicert.com。成功执行命令后,MyApp.jar 文件将使用指定的时间戳服务器为签名添加时间戳。

通过为签名添加时间戳,可以确保签名长时间有效,在证书过期后仍然可以验证应用程序的完整性。时间戳服务器会为签名生成一个时间戳,作为证明签名是在一定时间内完成的证据。

通过使用 jarsigner -tsa <URL> 命令,你可以在签名过程中指定时间戳服务器的URL,并将时间戳添加到签名中,以增强签名的可靠性和验证能力。

3.1.5 可选参数:jarsigner -verify

jarsigner -verify [-options] jar-file [alias ...] 命令用于验证已签名的 JAR 文件的完整性和有效性,并提供了一些可选的配置选项。

以下是示例命令的使用和作用:

jarsigner -verify [-certs] [-verbose] MyApp.jar

在这个命令中,-verify 参数表示对指定的 JAR 文件进行验证。[-certs][-verbose] 是可选的选项,它们提供了进一步的验证配置和输出。

-certs 选项会显示详细的证书信息,包括签名者的证书链。-verbose 选项会显示更详细的验证信息,包括每个文件的签名状态。

执行上述命令后,jarsigner 工具将会检查 JAR 文件是否已被签名,并验证签名的完整性和有效性。根据提供的选项,它还会显示证书信息和详细的验证输出。

通过使用 jarsigner -verify [-options] jar-file [alias ...] 命令,可以根据需要配置验证过程,并确保签名的完整性和有效性。这是验证应用程序是否受信任以及是否未经篡改的重要步骤。

4️⃣ 应用场景

  • 发布Java应用程序:在将Java应用程序分发给用户之前,对JAR文件进行签名以确保应用程序的完整性,并增加用户信任度。
  • 下载校验:在下载Java应用程序时,可以使用jarsigner验证文件的数字签名,从而确认文件来自可信源。

5️⃣ 使用技巧

  1. 生成密钥库:使用Java自带的keytool工具生成密钥库,其中包含需要的密钥对。可以指定密码和其他选项;
  2. 签名JAR文件:使用jarsigner命令对JAR文件进行签名,提供密钥库、别名、密码等必要参数;
  3. 验证签名:可以使用jarsigner来验证已签名的JAR文件,以确认其完整性和信任;
  4. 添加时间戳:通过指定时间戳服务器的URL,可以为签名添加时间戳,确保应用程序在证书过期后仍然有效。

🌾 总结

jarsigner命令是Java开发工具中用于对JAR文件进行签名的重要工具之一。它通过数字签名实现身份验证和保证应用程序的完整性,提供了应用程序发布和分发的安全性。但它也引入了额外的复杂性和一些操作步骤。通过理解和正确使用jarsigner,可以提高Java应用程序的安全性和用户的信任度。

总的来说,jarsigner为Java应用程序提供了一种有效的方式来验证应用程序的来源和完整性,帮助建立用户和开发者之间的信任关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字信号处理复习(一):离散傅里叶变换(DFT)

一&#xff1a;为什么需要离散傅里叶变换 我们知道在傅里叶变换中存在连续信号和离散信号变换从而诞生了有拉普拉斯变换&#xff08;连续信号&#xff09;、Z变换&#xff08;离散信号&#xff09;&#xff0c;这两种变换是方便以前没有计算机时工程师们手动计算傅里叶变换。而…

同构:编程中的数学(文末送书4本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

多项目管理难在哪,多项目同时进行该如何做好进度管理?

最近&#xff0c;听到群里的项目经理吐槽&#xff0c;手上有10多个项目同时进行&#xff0c;工作起来手忙脚乱&#xff0c;杂乱无章&#xff0c;让他压力特别大。 对于项目经理来说&#xff0c;多项目并行推进的情况已是常态。从工作层面来说&#xff0c;不仅在各项目之间抢资…

解决 fatal: Authentication failed for ‘https://github.com/*/*.git/‘

原因&#xff1a;github 的认证策略发生了改变&#xff0c;在 2021年8月13日 的时候&#xff0c;用户名加密码的认证方式被去掉了&#xff0c;换成了 个人令牌&#xff08;Personal Access Token&#xff09;的校验方式。 官网解决方案&#xff1a;管理个人访问令牌 - GitHub …

数分面试题- 面试智力题

目录标题 1、如何用3L和5L桶量取4L水2、有两圈蚊香&#xff0c;一圈烧完需要1小时&#xff0c;怎么才能确定出15分钟/45分钟时间3、提灯过桥问题4、开关灯问题5、赛道赛跑问题6、砝码称重问题6.1 有10瓶药&#xff0c;每瓶有10粒药&#xff0c;其中有一瓶是变质的。好药每颗重1…

家政保洁维修上门预约系统开发;

家政保洁维修上门预约系统开发&#xff1b; 保洁&#xff0c;家电清洗等上门业务系统&#xff0c;支持派单接单&#xff0c;按区域&#xff0c;就近分配、套餐年卡等&#xff1b; 育婴月嫂系统 保姆筛选&#xff0c;简历主页&#xff0c;推荐跟进&#xff0c;在线合同&#xf…

IPO观察丨背靠百度、专注医疗内容营销,为何健康之路举步维艰?

互联网医疗赛道竞争加剧下&#xff0c;相关企业不仅在市场扩张上角逐&#xff0c;也在IPO道路上持续追赶。 仅就6月份而言&#xff0c;就有药师帮、方舟云康、健康之路等几家企业在持续推进上市进程&#xff0c;其中&#xff0c;药师帮已于6月28日成功登陆港交所&#xff0c;而…

pycharm断点调试

第一步&#xff1a;打上断点 第二步&#xff1a;进入调试模式 第三步&#xff1a;分析button作用 Resume Program&#xff1a;进入下一个断点show execution point (F10) &#xff1a;显示当前所有断点step over(F8) &#xff1a;单步调试&#xff0c;若函数A内存在子函数时&a…

改变下拉框中内容显示的顺序方法

在官网上&#xff1a; 如图所示&#xff1a;先点击龙须面&#xff0c;再点击虾仔煎的时候&#xff0c;会在下拉框中按照用户的点击顺序显示出来。 问题&#xff1a;前端如何按照黄金糕-双皮奶-虾仔煎-龙须面的顺序显示点击的值呢&#xff1f;这样做的一个好处就是按后端的顺序…

【2023】性感美少女-InsCode Stable Diffusion 美图活动一期

作者&#xff1a;闲散的不务正业的运维目录 一、 Stable Diffusion 模型在线使用地址&#xff1a;二、Stable Diffusion如何使用三、模型相关版本和参数配置&#xff1a;四、图片生成提示词与反向提示词&#xff1a;五、种子及对应图片&#xff1a;六、总结 一、 Stable Diffus…

Qt的发展如何?它是否是一个就业的好选择?

Qt是一种流行的跨平台应用程序开发框架&#xff0c;被广泛用于构建图形用户界面&#xff08;GUI&#xff09;和嵌入式应用程序。它具有良好的可移植性和可扩展性&#xff0c;并支持多种编程语言&#xff0c;如C、Python和JavaScript。 Qt的发展一直稳步推进&#xff0c;并且在…

I.MX6ULL_Linux_驱动篇(39) 阻塞和非阻塞IO

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式&#xff0c;在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO&#xff0c;以及如何在驱动程序中处理阻塞与非阻塞&#xff0c;如何在驱动程序使用等待队列和 poll 机制。 阻塞…

HTML5+CSS3+JS小实例:可自由拖拽排序的表格

实例:可自由拖拽排序的表格 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

嗨爆全场!联诚发大屏与荧光棒闪耀周杰伦海口演唱会!

6月29日-7月2日&#xff0c;2023周杰伦嘉年华世界巡回演唱会海口站在海口五源河体育场震撼开唱&#xff0c;来自世界各地的数万名歌迷粉丝齐聚椰城&#xff0c;共享狂欢盛宴。联诚发LCF龙腾S系列LED透明屏和智慧荧光棒系列产品在演唱会现场大放异彩&#xff0c;陪伴粉丝朋友们一…

2023 全球数字经济大会人工智能高峰论坛,和鲸科技入选北京市人工智能行业赋能典型案例

7月&#xff0c;由国家发展改革委、工业和信息化部、科技部、国家网信办、商务部、中国科协联合北京市人民政府共同主办“2023全球数字经济大会”在京召开&#xff0c;本届活动主题为“数据驱动发展&#xff0c;智能引领未来”。其中“人工智能高峰论坛”重点围绕通用人工智能大…

Leetcode-每日一题【61.旋转链表】

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4输出&#xff1a…

网页的动静分离设置

我们都知道nginx处理静态网页是强项,而tomcat处理动态网页是强项.我们可以发挥他们共同的优点.nginx处理静态页面而tomcat处理动态页面 进入nginx配置文件改 总结 1.改配置文件最好复制一份 2.做一步验证一步 才知道哪里出错了 3.出错了别着急先看页面在浏览器能不能打开 不…

Python 字节数组方式写入kafka(含报错return ‘<SimpleProducer batch=%s>‘ % self.async)

一、背景 项目开发了一个类似kafka tools查询工具的kafka 查询&#xff0c;现在需要测试一下如果通过字节数组的形式写入&#xff0c;看看查询有没有问题 二、kafka查询代码 Python代码示例&#xff1a; from kafka import KafkaProducer import json# 创建Kafka生产者 pro…

搭建高性能数据库集群之三:Keepalived实现MySQL集群高可用

搭建高可用集群&#xff0c;2台HAProxy 可实现Mycat多节点的集群高可用和负载均衡&#xff0c;而HAProxy 的高可用&#xff0c;由Keepalived来实现。Keepalived负责为该台服务器抢占vip(虚拟IP)&#xff0c;抢到后对该主机访问。 搭建高可用集群&#xff1a; 上图&#xff0…

开源全新H5充值系统源码/自定义首页+充值页面/灵活对接上游渠道接口

开源全新H5充值系统源码&#xff0c;系统基于thinkphp框架开发&#xff0c;功能已全完善&#xff0c;可灵活对接其他上游渠道接口&#xff0c;默认对接了大猿人接口&#xff0c;另外可无限制自定义创建充值页面&#xff0c;首页支持后台自定义修改&#xff0c;支持三级分销&…