1、证书概述
SSL基于对称和部队称这两种加密方法。后者涉及了一对密钥,即一个公钥,一个私钥。
公钥通常包在证书中,因为证书是发布公钥的一种可信任的方式。证书是利用与证书中包含的公钥相对应的私钥来签署的,这叫自签证书。换句话说,自签证书的签署者与颁发者是相同的。
如果人们已经人事发送者,那么用自签证书来验证签署文档的发送者是可以的。但是为了得到更广泛的接受,则需要由数字证书认证中心(Certificate Authority,CA)签署,如VeriSign和Thawte,你需要将自签证书发给他们。
CA对你完成验证之后,就会给你办法一份证书,它代替了自签证书。这份新证书也可以是一个证书链。在这个证书链的最上方是”根”,就是指自签证书。接下来就是CA对你进行验证的证书。如果这家CA名气不够大,他们会将它发给更大的CA,更大的CA会验证第一家CA的公钥。最后一家CA也会发出证书,因此形成了一个证书链。这个更大的CA通常会广泛发布他们的公钥,因此人们可以很容易验证他们签署的证书。
Java提供了一组可以用于处理前面讲过的不对称加密法的工具和API,用她们可以完成以下工作:
1、生成公钥和私钥对,然后你就可以将生成的公钥发送给证书颁发者,以便获得你自己的证书,当然,这是要收费的。
2、将私钥和公钥保存在一个称作密钥存储库的数据库中。密钥存储库有名称,并且有密码保护。
3、将其他人的证书保存在同一个密钥存储库中。
4、通过自己的私钥进行签署来创建自己的证书。但是,这种证书的用途有限。如果用作测试,那么使用自签证书就可以了。
5、对一个文件进行数字签名,这个特别重要,因为如果Applets是保存在一个签过名的jar文件中,那么浏览器将只允许Applets访问资源。签过名的java代码可以向用户保证,你真的是这个类的开发者。现在我们看以下这个工具
2、KeyTool程序
KeyTool程序是创建和维护公钥和私钥及证书的工具。它在JDK中,位于JDK的bin目录下。KeyTool是一个命令行程序。要想查看它的正确语法,只要在命令窗口中输入keytool即可。
2.1、生成密钥对
首先,要了解在Java中生成密钥的几个关键点:
1、Keytool生成一个公钥/私钥对,并利用这个私钥创建一份证书。其中,证书包含了公钥及实体的身份信息,证明这是属于谁的密钥。因此,你需要提供名称和其他信息。这个名称称作识别名称(Distinguished Name, DN),包含以下信息:
CN= common name, e.g. Joe Sample
OU=organizational unit, e.g. Information Technology
O=organization name, e.g. Brainy Software Corp
L=locality name, e.g. Vancouver
S=state name, e.g. BC
C=country, (two letter country code) e.g. CA
2、密钥将保存在一个称作密钥存储库的数据库中。密钥存储库是基于文件并有密码保护的,因此任何未被授权的用户都无法访问保存在其中的私钥。
3、如果在生成密钥或执行其他功能时没有指定密钥存储库,将使用默认的密钥存储库,在用户的home目录下(即user.home系统属性定义的目录),默认木要存储库命名为.keystore。例如,在Windows平台上,Windows XP的默认密钥存储库是放在C:\Documents and Settings\userName
4、密钥存储库中有两种条目:
a、密钥条目,每个条目都是一个私钥,并配有对应公钥的证书链。
b、可信任的证书条目,每个条目中都包含你所信任的实体的公钥。
5、密钥存储库汇总的每个条目都用一个唯一的名称或者别名表示。你在用keytool生成密钥或做其他事情的时候必须指定一个别名。
6、如果在生成密钥对时没有指定别名,将默认使用mykey做为别名。
生成密钥对的最简短的命令是:
keytool -genkeypair
使用这个命令时,将使用默认的密钥存储库;如果用户的home目录下没有密钥存储库,则会创建一个。生成的密钥以mykey做为别名。然后你会被要求输入密钥存储库的密码,并提供识别名称的信息。最后,会有弹出窗口要求你输入条目的密码。
在此调用keytool -genkeypair会产生一个错误,因为它会试图创建一对密钥,并且在此使用mykey做为别名。
指定别名时,可以使用-alias参数。例如,以下命令创建了以关键字email标识的一个密钥对:
keytool -genkeypair -alias email
还是使用默认的密钥存储库。
指定密钥存储库时,要使用-keystore参数。例如,下列命令生成了一个密钥对,并将他保存在C:\javakeys目录下名为myKeystore.keystore的密钥存储文件中:
keytool -genkeypair -keystore C;\javakeys\myKeyStore
调用完程序之后,会要求你输入任务信息。
生成密钥对的完整命令要使用genkeypair、alias、keypass、storepass以及dname参数。例如:
keytool -genkeypair -alias email4 -keypass myPassword -dname
“CN=JoeSample, OU=IT, O=Brain Software Corp, L=Surrey, S=BC, C=CA”
-storepass myPassword
2.2、认证
当你可以利用Keytool生成公钥/私钥对和自签证书时,这个证书将只被已经认识你的人所信任。为了得到更广泛的认可,要由数字证书认证中心(CA)为你的证书进行签署,例如VeriSign、Entrust或者Thawte。
如果想要这么做,需要利用Keytool的-certreq参数生成一个CSR(Certificate Signing Request,证书签署请求),其语法如下:
keytool -certreq -alias alias -file certregFile
这个命令的输入值就是alias所引用的证书,其输出是一个CSR,这是一个由certregFile指定路径的文件。将CSR发送给CA,他们会离线对你进行验证,一般会请你提供有效的身份证明资料,例如护照或者驾照复印件。
如果CA认可你的身份资料,就会给你发一份新的证书,或者是一个包含你公钥的证书链。这个新证书代替了目前的证书链。一旦你收到回复,就可以利用Keytool的importcert参数将新证书导入到一个密钥存储库中。
2.3、将证书导入密钥存储库
如果从第三方收到一个签过名的文档,或者收到CA的回复,就可以将它保存在密钥存储库中,并且需要给它起一个容易记住这份证书的别名。
要将证书存入或导入密钥存储库中,需使用importcert参数,其语法如下:
keytool -importcert -alias anAlias -file filename
例如,要将joeCertificate.cer中的证书导入密钥存储库,并取别名brotherJoe时,要使用下面这个命令:
keytool -importcert -alias brotherJoe -file joeCertificate.cer
将证书保存在密钥存储库中有两个好处。第一,有一个受密码保护的集中保存的地方。第二,如果你已经将第三方的证书保存在密钥存储库中,就可以轻松得验证来自他们的签名文档。
2.4、从密钥存储库中导出证书
利用私钥可以给文档进行签名。在给文档签名时,要给文档建议一份摘要信息,然后用私钥对摘要信息进行加密。然后发布文档以及加过密的摘要。
其他人要验证文档,他们必须有你的公钥。为了安全期间,公钥也需要进行签名。你可以自签,也可以让可信任的证书颁发商为它签名。
首先,是从密钥存储库中导出证书,并将它保存成一个文件。然后轻松地发布这个文件,为了从密钥存储库中提取证书,需要使用-exportcert参数,并传入包含证书的文件名和别名,其语法如下:
keytool -exportcert -alias anAlias -file filename
包含证书的文件一般以.cer为扩展名。例如,为了提取别名为Meredith的证书,并将它存入meredithcertificate.cer文件,可以使用以下命令:
keytool -exportcert -alias Meredith-file meredithcertificate.cer
2.5、列出密钥存储库条目
有了可以保存专用密钥的密钥存储库,以及可信任的证书颁发商,就可以利用keytool程序将它列出,来查询它的内容,其做法是使用list参数:
keytool -list -keystore myKeyStore -storepass myPassword
如果缺失keystore参数,将在此使用默认的密钥存储库