http协议是互联网应用中的主要协议,从诞生至今一直被广泛的使用,我们知道http协议是明文传输的,现在的互联网安全形势严峻,使用明文传输的http协议很容易被互联网网络中的中间设备嗅探,因此在很多安全需求等级高的场景下http协议不能满足安全的需要,因此https协议诞生了。传统的http协议直接讲需要发送的数据丢给osi模型的传输层,所有的数据没有经过加密处理,当用户访问的时候,也无法确定与之通信主机的身份,而https的协议的诞生就是为了解决互联网通信中的身份验证和加密传输的需求。https和http相比,是在应用层和传输层之间引入了中间ssl层,利用这一中间层来实现身份验证和数据传输加密。

   https协议使用的是443端口,https工作的主要原理是,当用户以https协议访问某个站点的时候,站点服务器将返回站点服务器的证书,证书是一个文本,里面记载着这个证书的签发机构,该证书所有者的相关信息,该站点服务器的公钥,以及使用证书颁发机构的私钥加密的证书信息(证书颁发机构私钥加密的证书信息只有证书颁发机构的公钥才能解密,当客户端使用自己信任的证书颁发机构的公钥对加密的证书信息解密的时候,可以判断出该证书是否被串改,因此可以判断出远程服务器是否是自己想要访问的服务器,实现身份验证)。客户端拿到服务器证书后,验证服务器身份如果没有问题,接下来就会与服务器协商数据加密的对称密钥。协商过程为客户端随机生成一个字符串,并且以服务器的公钥进行加密处理传输给服务器,服务器用自己的私钥解密,该随机字符串被服务器和客户端同时知晓,后续的数据传输就可以使用此字符串进行对称加密。实现https数据传输的保密性,当然https的过程比上诉的复杂得多,涉及到密码学的知识,但是对于大多数人来说,了解简单过程即可。

     今天我们的重点不是讲述https协议的工作原理,而是在工程应用层面讲述自定义ca,以及使用自定义ca签署自定义证书给服务器使用。

     很多人会问什么是ca,ca可以理解为一个机构,这个机构可以进行网站的身份认证,网站需要向ca提供自己的基本信息,然后ca可以认证该网站。经过认证的网站拿着ca给他的认证证书,对外提供服务。当有用户访问网站时,网站先给经过ca认证过的证书提供给客户端,告诉客户端证书上是我的信息,ca给我盖了章的。在客户端看来,如果客户端信任该ca,那么就信任该证书,并检验证书完整性,如果证书完整就信任证书上面的信息,判断证书上面的信息是否和自己需要访问的服务器是否是同一个。


搭建ca服务器:

 1    ca生成自己的私钥

[root@localhost CA]# cd  /etc/pki/CA/
[root@localhost CA]# (umask 077;openssl  genrsa  -out private/cakey.pem   1024 )
Generating RSA private key, 1024 bit long modulus
...............++++++
....++++++
e is 65537 (0x10001)

2  使用私钥生成自签证书。

openssl  req -new  -x509  -key  private/cakey.pem    -out cacert.crt  -days   3089

3 修改ca的相关配置

ll  /etc/pki/tls/openssl.cnf
dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file

dir:        ca工作的主目录

certs:    被签名证书存放地址

crl_dir:  已经签署但弃用的证书列表


上面三步构建出一个ca,后续就可以使用该ca对其他的服务器证书进行签名

cakey.pem :ca的私钥(可提取出公钥)
cacert.crt:ca自签名证书


ca构建好后,我们就可以使用他来为其他证书签名,假如我们有一个服务器需要开启https服务,他需要一个证书,那么他只要要使用下面几步就可以获得上面的ca签名的ca

1  生成证书的公钥和私钥:

openssl genrsa   -out   http1.key   2048

2  使用该密钥生成证书签署请求

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

3 将2生成的.csr文件传输给ca服务器,ca服务器使用下面命令签署该证书

openssl  ca  -in http1.csr  -out httpd.crt  -days  3650

到此ca签署证书到此完毕,将生产的证书httpd.crt发给服务器,服务器就可以使用该证书。

由于该证书不是权威ca签发的,当使用的时候,浏览器没有内置我们自己搭建ca的证书,所以使用时候会出现不受信任的情况,忽略即可。可以将CA服务器上/etc/pki/CA/cacert.pem文件拷贝到自己的window桌面。将cacert.pem的后缀名修改为.crt,打开后安装证书,安装证书后将不会出现不受信任的提示。