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