证书的来源与使用:

  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. Python 常用函数time.strftime()简介

    time.strftime()可以用来获得当前时间,可以将时间格式化为字符串等等   格式命令列在下面:(区分大小写) %a 星期几的简写%A 星期几的全称%b 月分的简写%B 月份的全称%c 标准的 ...

  2. Java 读取txt文件,读取结果保存到数据库

    需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.加载文件后一行一行读取 2.数据库连接后按行插入到数据库 pac ...

  3. 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 ...

  4. MySQL 如何修改字符集 utf8 改为 utf8mb4

    在实行sql server 向 mysql 迁移数据时,报错: Incorrect string value: '\xF0\x9F\x98\x8A' 原因是mysql 采用的是 utf8 的字符集,而 ...

  5. 问题解决——使用GP-3120TN打印条形码标签

    终于大致的尝试出了参数和编程手册里指令的使用. 在这里,感谢佳博中一个叫做"Gprinter 陶玮"的工程师所提供的技术支持.非常感谢,如果没有你,在写这篇文章之前我可能换别的打印 ...

  6. 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 ...

  7. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  8. [转]angularjs 设置全局变量的3种方法

    本文转自:http://blog.51yip.com/jsjquery/1601.html angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是 ...

  9. MFC双缓冲绘图实例

    本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...

  10. html之大白

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...