证书与keytool
证书的来源与使用:
- 对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。
那么怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509,关于证书的具体内容,大家可以在网上搜集更详细的资料。
keytool
- 在Java中也广泛使用证书,JDK中创建和管理证书的工具是
keytool,keytool是一个功能强大的安全工具,它不仅仅只是用来创建和管理证书,还可以用来创建和管理对称性加密算法需要用到的密钥,keytool使用keystore存储密钥和证书,在一个keystore中可以存储多个条目,访问keystore和访问keystore中的条目均需要密码。 keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,它的位置为%JAVA_HOME%\bin\keytool.exe,如下图所示:

keytool的用法:

- keytool创建和管理证书:
- 由于keytool是JDK自带的,所以大家可以放心不用另外下载,要进行非对称性加密,我们首先要有属于自己的私钥/公钥对,这可以通过
keytool -genkeypairs -alias xxx命令得到。创建密钥对的时候,keytool会在keystore中生成一个新的条目,-alias xxx选项就是对该条目进行命名。生成密钥对之后,私钥是以原始数据直接储存在 keystore 中的,而公钥是要发布出去的,所以它被封装在一个X.509格式的自签名证书中。换句话说,创建密钥对的时候,同时就创建了一个自签名的证书。 首先,我先假设一个只对我自己签发证书的私有认证机构,我称之为MyCA(CA是一个证书管理机构),先为MyCA生成一个自签名的根证书,使用的命令是
keytool -genkeypair -alias MyCA,如下图所示:

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

如果给
keytool -list命令增加-v选项,则可以看到更加详细的内容。这些内容可以让我们对MyCA的证书有更直观的了解,如下图所示,你会发现证书的所有者和证书的发布者相同,说明这是一个自签名证书。

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

自签名的证书可以使用,但是总不如认证机构颁发的证书权威。要想让CA为我们颁发证书,首先我们要向 CA 提交申请,提交申请的时候需要提交一份称为certificate request的数据。我们可以通过
keytool -certreq命令针对 keystore中相应的条目生成该数据。在这里,我想让CA给Java颁发证书,则使用keytool -certreq -alias Java来生成 certificate request,如图所示:

从上图中可以看到,生成的certificate request数据是Base64编码的。然后,将该申请提交给CA。当然,现实中的CA是要收费的,而且还不便宜。那么我只好自己提交给自己了,使用私有的MyCA来给Java颁发证书。首先我利用指令
keytool -certreq -alias Java>Java.certreq,这里的>符号是重定向操作符,可以将生成的certificate request数据保存在文件Java.certreq中,再使用命令keytool -gencert -alias MyCA -infile Java.certreq -outfile Java.cer,文件Java.cer就是由MyCA颁发的证书。使用keytool -printcert -v -file Java.cer命令可以查看该证书,这时可以看到所有者和发布者不不一样了:

申请者收到CA颁发的证书后,可以使用
keytool -importcert -alias Java -file Java.cer将证书导入到 keystore中。导入证书后,再使用keytool -list -v -alias Java查看,会看到完整的证书链,如下图:

作为管理工具,keytool当然提供导出证书的功能,使用
keytool -exportcert命令即可,当然我们还可以用keytool -delete -alias xxx来删除条目,关于keytool更详细的参数,大家可以通过在命令提示符下输入keytool -help来查看,推荐参考Java中keytool的使用总结

证书与keytool的更多相关文章
- 数字证书中keytool命令使用说明
这个命令一般在JDK\jre\lib\security\目录下操作 keytool常用命令 -alias 产生别名 -keystore 指定密钥库的名称(就像数据库一样的证书库,可以 ...
- JDK 中的证书生成和管理工具 keytool
参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...
- java keytool证书工具使用小结
java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt PEM-encod ...
- 数字证书KeyTool使用(第二篇)
http://my.oschina.net/frankies/blog/344914 J2SDK提供了keytool命令行工具,可以根据指定的参数来创建数字证书.生成的证书或证书库默认保存在命令行当前 ...
- 用keytool制作证书并在tomcat配置https服务(二 )
用keytool制作证书并在tomcat配置https服务(一) 双向认证: 我们上边生成了服务端证书,并发送给客户端进行了验证. 双向认证是双向的,因此还差客户端证书. 1.为方便导入浏览器,生成p ...
- 使用keytool自建证书及应用
1. 在密钥库文件 keystore.jks 中生成证书: keytool -genkey -alias cas -keyalg RSA -keypass changeit -storepass ch ...
- JDK自带工具keytool生成ssl证书
前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...
- 使用jdk的keytool 生成CA证书的方法
一.CA证书生成设置总共分为以下5步: 步骤: 1.根据java的keytool生成CA根证书,放在服务器 2.根据服务器CA根证书导出客户端证书 3.tomcat增加SSL配置 4.客户端IE浏览器 ...
- java keytool证书工具使用小结【转】
java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...
随机推荐
- OOD沉思录 --- 类和对象的关系 --- 包含关系2
4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...
- android中的事件传递和处理机制
一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己 ...
- javascript元素绑定事件
js元素绑定事件 想给一个元素绑定一个方法之后,在绑定一个方法而且不被覆盖 window.onload = function () { alert('a'); } window.onlaod=fu ...
- 关于移动端的font和图片的问题
一.font-family 使用无衬线字体 body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif ...
- Remoting和Webservice的区别
其实现的原理并没有本质的区别,在应用开发层面上有以下区别:1.Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样 ...
- 【ubuntu】中文输入法安装二三事
本来很愉快地刷着JS程序,很有感慨啊,想写篇博客记一下学习笔记,结果忘记了博客账号,后来通过邮箱找回了之后想要开始写..发现ubuntu的中文输入法不能用啊(其实不是不能用,就是小白没搞清楚状况,双系 ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- div中的内容垂直居中的五种方法
一.行高(line-height)法 如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:3 ...
- HDU 3487 Play with Chain 【Splay】
1-n的序列,有两种操作: 1,将一段区间翻转 2,将一段区间切下来放到剩余序列的第C个数后 采用延迟更新的方法维护区间的翻转,并维护一个size域. 添加一个最大点和一个最小点,防止出界 翻转时,将 ...
- MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...