证书与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, ...
随机推荐
- Python 常用函数time.strftime()简介
time.strftime()可以用来获得当前时间,可以将时间格式化为字符串等等 格式命令列在下面:(区分大小写) %a 星期几的简写%A 星期几的全称%b 月分的简写%B 月份的全称%c 标准的 ...
- Java 读取txt文件,读取结果保存到数据库
需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.加载文件后一行一行读取 2.数据库连接后按行插入到数据库 pac ...
- Effective Java 59 Avoid unnecessary use of checked exceptions
The burden is justified if the exceptional condition cannot be prevented by proper use of the API an ...
- MySQL 如何修改字符集 utf8 改为 utf8mb4
在实行sql server 向 mysql 迁移数据时,报错: Incorrect string value: '\xF0\x9F\x98\x8A' 原因是mysql 采用的是 utf8 的字符集,而 ...
- 问题解决——使用GP-3120TN打印条形码标签
终于大致的尝试出了参数和编程手册里指令的使用. 在这里,感谢佳博中一个叫做"Gprinter 陶玮"的工程师所提供的技术支持.非常感谢,如果没有你,在写这篇文章之前我可能换别的打印 ...
- hdu 1561 The more, The Better(树形dp,基础)
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- POJ 2406 Power Strings (KMP)
Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...
- [转]angularjs 设置全局变量的3种方法
本文转自:http://blog.51yip.com/jsjquery/1601.html angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是 ...
- MFC双缓冲绘图实例
本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...
- html之大白
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...