证书和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/

分为DERPEM两种格式,PEM格式就是以ASCII码形式存储,直接打开后直观上看不会是乱码。


3、证书如何用

客户端和服务端均有一个证书、一对对应的公私钥和信任证书。客户端配置的信任证书是服务端证书的祖先证书;而服务端配置的信任证书是客户端证书的祖先证书。

使用浏览器访问的网站,服务端不会验证客户端证书,(因为客户端就是浏览器,并没有证书哇)

客户端与服务端的https握手(双向)过程如下:

参考:

http://www.jianshu.com/p/7158568e4867


4、tomcat启用ssl

修改tomcat的配置文件conf/server.xml,其中有个Connector节点,改成如下形式即可:

证书和SSL或TLS

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文件的格式一共有三种,jksjcekspkcs12。(https://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#KeyStore

keystore文件的后缀不一定是.keystore,可以是任意的,只要其内容格式是keystore的就可以。

javakeytool命令可以用来生成keystore文件,如keytool -import -file server.cert -keystore ~/test.keystore

这个命令就是将server.cert里的证书导入到一个名为test.keystorekeystore文件里,如果test.keystore文件不存在,那么会要求输入keystore密码以创建test.keystore文件;如果已经存在,那么同样要求输入keystore密码以验证。

openssl也可以生成一个keystore文件,一般后缀是.p12,也就是pkcs12类型的keystore,这个文件会同时包含证书和对应的公私钥。