证书和SSL或TLS
本篇说明如下问题:
1、证书是啥,有哪些内容?
2、证书编码及格式?
3、证书如何用?
4、tomcat如何启用SSL?
5、keystore是什么keytool有何用?
1、什么是证书
一个证书包含(当前证书的公钥(私钥是单独存储的)、证书颁发者、证书使用者、签名(来自生成当前证书的那个证书))
签名的计算是使用私钥,签名的验证是使用公钥,因此验证当前证书的签名(即验证合法性)需要拿到上级证书(即生成当前证书的那个证书),而上级证书同样需要验证,于是形成了一个递归(当然了,也叫证书链),递归的终结处就是根证书。
根证书无须验证,根证书的证书颁发者和使用者都是自己,一些主流的第三方CA中心的根证书都被内置到各大主流浏览器中,因而,由那些CA中心签发的证书都会被浏览器自动信任,当然那些机构签发一个证书是要钱的,而且很贵。
开源工具openssl可以生成根证书(包括对应的公私钥),然后再签发一些其他证书(给自己的若干应用系统),只是浏览器默认不信任这个根证书而已。
当然了,根证书也可以手动的添加到浏览器的根证书库里,所以经过手动的操作,也能达到其他主流根证书的效果(只是出了问题呢,没人赔偿而已)
(openssl生成一个证书包括: *.cert, *.key, *.pub, *.csr, *.p12五个文件,其中*.key是私钥,*.pub是公钥,*.cert是自签名证书,*.csr是生成非自签名证书的请求,*.p12是*.cert和*.key文件的合并,且是加了密的)
可参考如下链接:
https://www.landiannews.com/archives/38679.html
https://docs.oracle.com/cd/E19900-01/820-0847/ablom/index.html
http://www.barretlee.com/blog/2016/04/24/detail-about-ca-and-certs/
2、证书编码及格式
http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/
分为DER和PEM两种格式,PEM格式就是以ASCII码形式存储,直接打开后直观上看不会是乱码。
3、证书如何用
客户端和服务端均有一个证书、一对对应的公私钥和信任证书。客户端配置的信任证书是服务端证书的祖先证书;而服务端配置的信任证书是客户端证书的祖先证书。
使用浏览器访问的网站,服务端不会验证客户端证书,(因为客户端就是浏览器,并没有证书哇)
客户端与服务端的https握手(双向)过程如下:
参考:
http://www.jianshu.com/p/7158568e4867
4、tomcat启用ssl
修改tomcat的配置文件conf/server.xml,其中有个Connector节点,改成如下形式即可:
keystoreFile 是服务端的keystore(必须同时包含证书和对应的公私钥;可以同时包含多套哦)
keystorePass 是服务端keystore的打开密码
keyAlias 是要使用的证书别名(如果keystoreFile中只有一个证书,那么这个别买可以不配置)
truststoreFile 是服务端信任的keystore(仅包含证书,如果改keystore还包含私钥,那么会抛出这样的错误”the trustAnchors parameter must be non-empty”),这个文件里的证书是用来验证客户端请求的(会附带客户端的证书),若clientAuth参数设置为false,那么就不会验证。
truststorePass 是truststoreFile的打开密码
参考:
https://tomcat.apache.org/tomcat-5.5-doc/config/http.html#SSL_Support
5、什么是keystore
keystore是指一个证书+一对公私钥。
一个keystore文件可以同时包含多个keystore。
keystore文件的格式一共有三种,jks、jceks、pkcs12。(https://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#KeyStore)
keystore文件的后缀不一定是.keystore,可以是任意的,只要其内容格式是keystore的就可以。
java的keytool命令可以用来生成keystore文件,如keytool -import -file server.cert -keystore ~/test.keystore
这个命令就是将server.cert里的证书导入到一个名为test.keystore的keystore文件里,如果test.keystore文件不存在,那么会要求输入keystore密码以创建test.keystore文件;如果已经存在,那么同样要求输入keystore密码以验证。
openssl也可以生成一个keystore文件,一般后缀是.p12,也就是pkcs12类型的keystore,这个文件会同时包含证书和对应的公私钥。