计算机证书相关知识总结

Life is short , play more!
本文来自lihao's Blog,转载请注明。

我们不是谈 毕业证书这种证书。 说的是计算机里的证书概念。 对于大多数计算机工作的同学想必对这个术语肯定是不陌生的,但并不是所有人会亲自使用,大部分可能是被动的用到了。 证书 certificate 是 TLS(transport layer security) 里一个重要的组成部分(模块), 大多数我们过去经常称为  SSL . 这个也许你就不陌生了。 顾名思义, 这个是和安全相关的。

谈到证书,免不了要简单说下 key (钥匙)。  证书是用来证明, 而为了传输数据的安全, key也是必不可缺的部分。 下面我们来看看, 证书(简写为cert)和钥匙是如何配合来保证传输数据的安全的。

一TLS(SSL)工作机制

  1. 例如我们访问一个网站通常是https(https://).
  2. 网站发来公钥和它的证书 (稍后我们来讲如何生成钥匙和证书)
  3. 我们的浏览器确认这个证书是否是被三方可信的机构签证的证书,如果是有效且可信的,浏览器会认为是安全的。否则会提示你不安全的链接。
  4. 这时候浏览器收到了公钥, 然后用公钥加密一个随机的对称钥匙串,和加密后的url地址和http请求数据发送给服务器。
  5. 服务器收到了加密的一个钥匙串(上一步客户端浏览器随机生成的)。这时候可以解密(通过私钥解密)拿到客户端随机生成的密钥(对称密钥)。并用此密钥解密http请求并拿到http请求数据。
  6. 此时服务器处理此客户端的请求,然后将处理结果用密钥(还是随机生成的密钥)加密后,发送给客户端的浏览器。
  7. 浏览器解密数据,并展现。

可以看到当ssl 握手之后, 就开始使用 对称密钥进行传输数据的加密和解密了。 而证书在这里作用仅是对web服务器的一个认证作用, 此服务器是否是可信的。 所以对外服务的公司会通过三方根证书机构获取授权的证书。  这样你就看到浏览器的有一个绿色的锁标志。

其次,仅仅使用证书对应的公钥,密钥 也是不够安全的。 这里可以谈下 非对称密钥(有公钥和密钥)。 公钥发给所有的用户要访问此web服务器的浏览器。 公钥是共享给所有人的。 而私钥是由web服务器自己所有的。  当服务器把传输的数据用私钥加密后, 所有有公钥的浏览器多可以解密。 而公钥加密后,则只有服务器用私钥可以解密。 所以服务器的私钥加密后的数据,可以被所有 有公钥的人解密,所以也不是安全的。 这里就引入了一个,握手时会由客户端随机生成一个对称密钥,并通过公钥加密后传输给web服务器。 这样之后的数据加密通过对称密钥进行。就保证了安全。

二 证书的后缀名到底都是什么意思呢?

以编码来区分的:

pem:  base64编码格式的证书。

der: 二进制der格式的证书, 通常可以命名为 *.der , 后缀名当然也可能是 *.crt 或者是 *.cer 都表示是证书。 为了便于区分其编码,可以建议 命名为 *.pem.crt 。 这样我们一看便知道是pem格式的证书文件。

通常的后缀名:

crt, cer:  这2个是完全等价的。 linux,类unix 系统通常证书命名为 hissummer.crt, 而windows的系统通常使用 hissummer.cer.   但从这个后缀名,我们却无法分辨其的编码格式。 所以pem和der的后缀名也是方便从编码的角度来区分证书。 所以 crt,cer 的文件是完全等价的。 (注:不同的系统对编码的要求不一致, 假设某系统导入证书仅支持pem编码的证书,则你有der格式的证书转城pem格式)

key: 密钥的后缀。 公钥,私钥都是这个后缀。  key就是key,和证书是没有任何关系的。  key通常也有pem和der两种编码格式。

 

例如我不知道一个 hissummer.crt 的证书是什么编码的,那么我可以通过如下命令获得。

openssl x509 -in cert.crt -text -noout

如果上述命令提示如下错误,则该crt是der编码的。

unable to load certificate
12626:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

这样通过如下命令就可以查看该证书的内容了,加上此参数-inform der。

openssl x509 -in certificate.der -inform der -text -noout

 

三 如何创建证书和密钥

通过上面的认识,我们知道如果我们要建立一个 https 的服务,则必须需要证书和公钥了。  证书是需要私钥进行加密的。 通常我们 创建私钥和证书, 并没有显示地去创建公钥,但其实公钥已经存在。

如果我们不打算去购买可信CA的证书,则可以自己生成自签证书。

1. 购买可信机构的授权的证书。

生成csr 文件,将csr发给机构,然后机构返回给签名的证书。

即 csr -> cert   (cert 证书是由可信的CA机构 签)

2. 自签证书,自己搬给自己。 没有什么根证书,自己就是根证书。

生成key

openssl genrsa -des3 -out server.key 1024

生成证书

openssl req -new -key server.key -out server.csr

如果服务器使用server.key 重启关闭时,都需要输入password。比较麻烦,我们需要去掉pass phase。  (如果你不去掉,你自己试一下就知道为什么要去掉了。比如我们把 上面获得的 server.key 和 server.csr 配置到 nginx或者httpd服务器后,每次重启 nginx 或者 httpd都需要输入密码, 这显然是我们不需要的。)

cp server.key server.key.org

openssl rsa -in server.key.org -out server.key

3. 自己创建CA

自己把自己当作是CA机构。

1) 先创建 CA key 和 CA crt (CA 机构的私钥和证书)模拟我们自己就是CA机构。

2) 创建 server key , 用CA.crt  签 server.crt

3) 如果需要给用户(客户端)签证书。 则生成client.key , 然后用 CA.crt 签 client.crt.

这样服务端的证书和客户端的证书都是 我们自己的CA 给签的证书了。


发表评论

电子邮件地址不会被公开。 必填项已用*标注