证书的来源与使用:

  1. 对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。
  2. 那么怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509,关于证书的具体内容,大家可以在网上搜集更详细的资料。

    keytool

  • 在Java中也广泛使用证书,JDK中创建和管理证书的工具是keytoolkeytool是一个功能强大的安全工具,它不仅仅只是用来创建和管理证书,还可以用来创建和管理对称性加密算法需要用到的密钥,keytool使用keystore存储密钥和证书,在一个keystore中可以存储多个条目,访问keystore和访问keystore中的条目均需要密码。
  • keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,它的位置为%JAVA_HOME%\bin\keytool.exe,如下图所示:

  • keytool的用法:

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

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

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

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

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

  7. 从上图中可以看到,生成的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命令可以查看该证书,这时可以看到所有者和发布者不不一样了:

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

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

证书与keytool的更多相关文章

  1. 数字证书中keytool命令使用说明

    这个命令一般在JDK\jre\lib\security\目录下操作 keytool常用命令 -alias       产生别名 -keystore    指定密钥库的名称(就像数据库一样的证书库,可以 ...

  2. JDK 中的证书生成和管理工具 keytool

    参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...

  3. java keytool证书工具使用小结

    java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt    PEM-encod ...

  4. 数字证书KeyTool使用(第二篇)

    http://my.oschina.net/frankies/blog/344914 J2SDK提供了keytool命令行工具,可以根据指定的参数来创建数字证书.生成的证书或证书库默认保存在命令行当前 ...

  5. 用keytool制作证书并在tomcat配置https服务(二 )

    用keytool制作证书并在tomcat配置https服务(一) 双向认证: 我们上边生成了服务端证书,并发送给客户端进行了验证. 双向认证是双向的,因此还差客户端证书. 1.为方便导入浏览器,生成p ...

  6. 使用keytool自建证书及应用

    1. 在密钥库文件 keystore.jks 中生成证书: keytool -genkey -alias cas -keyalg RSA -keypass changeit -storepass ch ...

  7. JDK自带工具keytool生成ssl证书

    前言: 因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全. 百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具: ...

  8. 使用jdk的keytool 生成CA证书的方法

    一.CA证书生成设置总共分为以下5步: 步骤: 1.根据java的keytool生成CA根证书,放在服务器 2.根据服务器CA根证书导出客户端证书 3.tomcat增加SSL配置 4.客户端IE浏览器 ...

  9. java keytool证书工具使用小结【转】

    java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...

随机推荐

  1. [eclipse]改项目名称后tomcat连接问题解决方法

    背景:在我们使用eclipse进行项目开发时,有时候会需要修改项目名称,当改动项目名称后发现tomcat启动访问出现问题,使用新的项目名称不可行,使用旧的项目名称却可以.修改web.xml里面的dis ...

  2. SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)

    --------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...

  3. python基本数据结构-集合-集合运算

  4. android linker (1) —— __linker_init()

    ilocker:关注 Android 安全(新手) QQ: 2597294287 __linker_init() 在 begin.S 中被调用,并传入两个参数:sp(堆栈指针).#0. linker( ...

  5. folly

    一.简介 Folly是,Facebook于2012年6月初开源的一个基于C++11的C++组件库,提供了类似Boost库和std库的功能,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能 ...

  6. hdu-5495 LCS(置换)

    题目链接: LCS Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  7. TopCoder SRM 633 Div.2 500 Jumping

    题意:给一个点(x,y),给一些步长delta1,delta2...deltaN,问从(0,0)严格按照步长走完N步后能否正好到达(x,y)点. 解法:其实就是判断这些线段和(0,0)-(x,y)这条 ...

  8. 2014 Super Training #2 C Robotruck --单调队列优化DP

    原题: UVA 1169  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  9. Win8/8.1 .NET3.5安装失败

    .NetFramework 作为开发人员,很多情况都需要.NetFramework,在Win7及之前的系统上直接双击 .NetFramework的安装包就可安装了. Win8/8.1无法安装.Net3 ...

  10. PPP(点对点协议(Point to Point Protocol)

    1.简介PPP(点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议.这种链路提供全双工操作,并按照顺序传递数据包.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成 ...