JDK 中的证书生成和管理工具 keytool
参考资料
该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference 。Oracle 在 Java 方面的文档是非常完善的。对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Documentation ,想阅读什么就点什么。本博客不定期从 Oracle 官网搬砖。这里介绍的工具是 keytool 。
网络安全概论
在 Web 世界里,安全是一个重之又重的课题,甚至是美国政府都禁止某些加密解密算法的出口。 Java 和 Linux 都是 Web 领域的领头羊,各种加解密的算法和管理工具一应俱全,例如 GnuPG 就是一个不错的安全套件。但是在这里,只展示一下 JDK 中的 keytool 工具的使用方法。
先来说一下加解密算法的分类。基本上可以分为三类,它们分别是对称性解密算法、非对称性加密算法和消息摘要算法。每一类算法中又有多个不同的具体算法。对于这些算法,我们不要求完全掌握,但是对于各类算法的特点和用途是一定要了解的,对于一些常见的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它们分别属于哪类算法。
对称性加密算法使用同一个密钥对信息进行加密和解密,其信息的安全性一部分取决于加密算法和密钥的长度,另一部分取决于密钥在传递过程中是否会被截获或盗取。非对称性加密算法使用两个密钥分别对信息进行加密和解密,这两个密钥称为私钥/公钥对。使用私钥加密的信息必须使用公钥解密,反之亦然。公钥可以公开发布,私钥由加密方保存,绝对不公开,将私钥被截获或窃取的可能性降到最低,因此非对称性加密算法的安全性比对称性加密算法的安全性更高。既然非对称性加密算法比对称性加密算法安全性更高,那对称性加密算法有什么存在的必要呢?这是因为对称性加密算法的运算速度更快。现实中,往往将对称性加密算法和非对称性加密算法结合使用,对于要传输的大块数据使用对称性加密算法加密,然后对加密使用的密钥使用非对称性加密算法进行加密,这样既可以获得更高的安全性,又可以获得更高的加解密运算速度。常用的对称性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非对称性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(椭圆曲线加密算法)。
消息摘要算法的主要目的是对数据生成摘要。消息摘要算法不需要密钥,只有输入相同的数据才能得到相同的摘要,而且不可能从摘要反过来推算出数据。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的变体。它们可以用来保证数据的完整性,在网络上发布文件时,常同时提供该文件的MD5值就是利用的消息摘要算法的这个特点,一旦该文件被篡改或者在网络传输中出现数据错误,再对其进行摘要运算就得不到相同的MD5值。
对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者,他再怎么抵赖也没有用。
那么问题来了,怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509,关于证书的具体内容,网络上一搜一大把,我这里就不讲了。
使用keytool创建和管理证书
在 Java 中也广泛使用证书,例如,使用 jarsigner 命令对 jar 包进行签名和认证。JDK 中创建和管理证书的工具是 keytool 。 keytool 是一个功能强大的安全工具,它不仅仅只是用来创建和管理证书,还可以用来创建和管理对称性加密算法需要用到的密钥,还可以用自己的证书给别人签发证书(类似 CA 的工作),还可以导入别人发布的证书。 keytool 使用 keystore 存储密钥和证书,在一个 keystore 中可以存储多个条目,访问 keystore 和访问 keystore 中的条目均需要密码。
下面开始实战。要进行非对称性加密,我们首先要有属于自己的私钥/公钥对,这可以通过 keytool -genkeypairs -alias xxx 命令得到。创建密钥对的时候, keytool 会在 keystore 中生成一个新的条目, -alias xxx 选项就是对该条目进行命名。生成密钥对之后,私钥是以原始数据直接储存在 keystore 中的,而公钥是要发布出去的,所以它被封装在一个 X.509 格式的自签名证书中。换句话说,创建密钥对的时候,同时就创建了一个自签名的证书。
先将自己假想为一个认证机构,或者说一个只对我自己签发证书的私有认证机构,我称之为 MyCA,先为 MyCA 生成一个自签名的根证书,使用的命令是 keytool -genkeypair -alias MyCA ,如下图:

可以看到,除了提示我们输入 keystore 的密码和 MyCA 条目的密码之外,还提示我们输入名字、部门、组织、区域、国家代码等信息,这些信息主要是用来标识证书的所有者。按提示完成操作后,就在 keystore 中生成了一个 MyCA 条目,该条目中保存有 MyCA 的私钥和 MyCA 的自签名证书,该证书中包含 MyCA 的公钥。使用 keytool -list 命令看一下,可以看到 keystore 中新增的 MyCA 条目。
如果给 keytool -list 命令增加 -v 选项,则可以看到更加详细的内容。这些内容可以让我们对 MyCA 的证书有更直观的了解,如下图:

然后,再为我自己生成一个密钥对,使用命令 keytool -genkeypair -alias youxia 命令,按提示完成操作后,keystore 中就又多了一个 youxia 条目,如下图:

使用 keytool -list -v -alias youxia 命令可以查看 youxia 的证书,它也是自签名的,如下图:

自签名的证书可以使用,但是总不如认证机构颁发的证书权威。怎么样让 CA 为我们颁发证书呢?首先我们要向 CA 提交申请,提交申请的时候需要提交一份称为 certificate request 的数据。我们可以通过 keytool -certreq 命令针对 keystore 中相应的条目生成该数据。在这里,我想让 CA 给 youxia 颁发证书,则使用 keytool -certreq -alias youxia 来生成 certificate request,我同时使用管道和 tee 命令让生成的数据既显示在控制台中,又保存在文件 youxia.certreq 中,如下图:

从上图中可以看到,生成的 certificate request 数据是 Base64 编码的。然后,将该申请提交给 CA。当然,现实中的 CA 那都是要收费的,而且还不便宜。那么我只好自己提交给自己了,使用私有的 MyCA 来给 youxia 颁发证书。使用的命令为 keytool -gencert -alias MyCA -infile youxia.certreq -outfile youxia.cer,文件 youxia.cer 就是由 MyCA 颁发的证书。使用 keytool -printcert -v -file youxia.cer 命令可以查看该证书。
然后,申请者收到 CA 颁发的证书后,可以使用 keytool -importcert -alias youxia -file youxia.cer 将证书导入到 keystore 中。导入证书后,再使用 keytool -list -v -alias youxia 查看,会看到完整的证书链,如下图:

作为管理工具,keytool 当然提供导出证书的功能,使用 keytool -exportcert 命令即可。至此,我们已经完全了解了生成密钥对和证书的完整流程。关于 keytool 更详细的参数,请大家自己查看 keytool 的文档吧。
总结
keytool 的使用方法很简单,重要的也就是 keytool -genkeypair、keytool -gencert、keytool -certreq 等命令,看到这些命令基本上就可以想到它们的功能。让人稍稍有点疑惑的是, keytool -genkeypair 不仅仅是生成密钥对,它会同时对公钥进行包装生成自签名的证书, keytool -gencert 并不是凭空生成证书,而是对 certificate request 进行回复。理解这两点,使用 keytool 就畅通无阻了。
(京山游侠于2015-04-22发布于博客园,转载请注明出处。)
JDK 中的证书生成和管理工具 keytool的更多相关文章
- Linux学习笔记(1)Linux虚拟机安装过程中的知识点及常用管理工具
1. VMware的相关知识 (1)建议的VMware的配置: CPU 主频1GHz以上 内存 1GB以上 硬盘 分区空闲空间8GB以上 (2)VMware创建快照 快照的作用是保存虚拟机的现有状态, ...
- JDK中自带的JVM分析工具
目录 一.业务背景 二.Jdk-Bin目录 三.命令行工具 1.jps命令 2.jinfo命令 3.jstat命令 4.jstack命令 5.jmap命令 四.可视化工具 1.jconsole 2.v ...
- elk中es集群web管理工具cerebro
cerebo是kopf在es5上的替代者 安装es虽然不能再root下运行,但是cerebro 可以 run as root is ok wget https://github.com/lmeneze ...
- java jdk中安装证书的步骤
需要注意的是:导入证书时,请确认导入的JDK为当前程序运行所用的JDK,且路径是jdk目录下的jre目录路径,非与jdk同级的jre目录 首先你可以把需要导入的证书放在keytool的同级目录下,然后 ...
- .net WebApi中使用swagger生成WepApi集成测试工具
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...
- Tomcat配置https之 JDK SSL证书生成与验证
关于证书 SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer(SSL),安全协议是由Netscape Communication公司设计开发. ...
- ASP.NET 网站管理工具
ylbtech-Miscellaneos:ASP.NET 网站管理工具 1. 网站管理工具概述返回顶部 网站管理工具概述 介绍 使用网站管理工具,可以通过一个简单的 Web 界面来查看和管理网站配置. ...
- bug管理工具为开发者工作带来哪些改变?
BUG管理工具的主要功能是对软件开发测试过程中出现的BUG进行跟踪管理,提高开发者的工作效率与工作质量. 在实际工作中,如果没有bug管理工具的帮助,就可能会出现如下一系列的影响: 1.软件测试人员将 ...
- 进程管理工具之supervisor[详解]
原文链接:https://blog.csdn.net/weixin_42390791/article/details/88866237 一.问题背景1.背景 如何才能让一个进程摆脱终端,获得相对 ...
随机推荐
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- Javascript - Promise学习笔记
最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下. 一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...
- SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- WebSocket - ( 一.概述 )
说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...
- AbpZero--1.如何开始
1.加群 群号:104390185,下载这个文件并解压 用VS2015打开aspnet-zero-1.9.0.1 2.修改Web项目web.config连接字符串 <add name=" ...
- 【JQ基础】数组
each() 方法规定为每个匹配元素规定运行的函数.
- Supermap iCloudManager -负载均衡
Supermap icm负载均衡理解: 应用场景:地图出图 子节点1和子节点2中的服务保持一致,一般情况下设置的是匿名用户通过nginx访问服务信息,所以不需要登录. 1.通过nginx分发请求,(轮 ...
- Android之解析XML
1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...