Server:
创建本地证书:
keytool -genkey -alias testserver-keyalg RSA -keystore keystore
其中alias自己起一个别名,keystore为证书库的文件路径
还可以加上-keysize 1024、2048、4096等来指定公钥的大小,由此导出的证书查看时可以看到公钥的大小是与之一致的。keysize越大genkey时耗费时间越长。
会要求键入一个密码,为这个证书库的访问密码
会要求填写一些信息,姓名、单位、地区之类
最后要求键入一个密码,为这条证书别名的密码
导出cert:
keytool -export -alias testserver-file testcert.cer -keystore keystore
这里的别名和文件名同上一步
Client:
直接导入cert:
Truststore文件中存储的是作为client,信任那些server的证书。所以需要将server提供的证书导入进来(当然可以导入n个),client才能信任。
keytool -import -alias testserver-file testcert.cer -keystore truststore
导入时需要输入密码,该密码应该是truststore文件的访问密码,密码正确才能修改其信息。
提示是否信任该证书信息,确认。
查看证书信息:
keytool –list –v –keystore truststore
如果导入过多个,则可以看到多条entry
删除某一个证书entry,通过指定别名来删:
keytool -delete -alias testserver-keystore truststore
上述是自签名的证书,证书链的长度只为1
真正商用时,需要找相关机构(例如verisign)认证通过才能成为有效的证书:
生成证书签名请求:
keytool -certreq -keyalg RSA -alias testserver -file certreq.csr -keystore keystore
之后能够收到一个证书文件,证书链信息包含了该机构的一些信息,然后再导入。
有两种方法建立HTTPS连接,
一种是,在java中可以设置相关的4个系统参数,指向相关的keystore,truststore,一旦设置,在运行时就不可改变了。除非一定要使用多个不同的证书库文件,否则可以把多个不同证书都导入到同一个证书库里,这样,设置系统参数为唯一的值也够用,而且也比较简单一些。
另一种是,自己继承相关接口实现自己的证书管理器,这样可以自定义相关行为,也可以load不同的证书库。
如果不设置password,就认为不检查文件完整性,也能通过。如果设置了password,但是不正确,则会遇到密码错误的异常;如果server证书没有导入到client得信任列表里,则会遇到找不到可信证书的异常。