https站点证书自制

1. 自制一个CA证书(假定的第三方认证机构)

生成CA私钥(fakeca.key)

openssl genrsa -des3 -out fakeca.key 4096

这个命令对输入的密码使用DES3加密,并生成一个4096位的密钥

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(1)

生成CA(fakeca.crt)证书,用于向客户端发布和对站点进行签名

openssl req -new -x509 -days 3650 -key fakeca.key -out fakeca.crt

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(2)

2. 自制Server(站点证书),并利用自制的CA证书(fakeca.crt)对其进行签名

Server的私钥制作

openssl genrsa -des3 -out server.key 4096

生成免密码输入版本

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

生成CSR(Certificate Signing Request---签名请求文件)

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

用CA证书私钥对csr文件签名(CA不能用X509,这点需要注意)生成Server证书

openssl ca -days 3650 -in server.csr -cert fakeca.crt -keyfile fakeca.key -out server.crt

若出现如下错误:

Using configuration from /etc/pki/tls/openssl.cnf

Enter pass phrase for fakeca.key:

/etc/pki/CA/index.txt: No such file or Directory

unable to open '/etc/pki/CA/index.txt'

执行如下命令后,再次对server.csr进行签名

touch /etc/pki/CA/index.txt

touch /etc/pki/CA/serial

echo "01" > /etc/pki/CA/serial


配置https服务

nginx的https服务配置

将生成的证书导入和Server的私钥(免密版本) 导入到nginx的配置目录下(cert为自建)

cp ./server.crt /opt/nginx/conf/cert/server.crt

cp ./server.nosecret.key /opt/nginx/conf/cert/server.nosecret.key

编辑nginx配置文件(/opt/nginx/conf/nginx), 在需要开启https访问的站点目录(location)增加443端口监听,配置完成后重启服务

vim /opt/nginx/conf/nginx

listen       443 ssl;

ssl_certificate      cert/server.crt;

ssl_certificate_key  cert/server.nosecret.key;

ssl_session_cache    shared:SSL:1m;

ssl_session_timeout  5m;

ssl_ciphers  HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers  on;

防火墙放行443,并重新加载防火墙规则

firewall-cmd –add-port 443/tcp --permanent

浏览器中输入server地址(https://10.10.11.250),即可打开

Apache配置https服务

在httpd.conf配置文件中加载mod_ssl.so模块

cat /etc/httpd/conf/httpd.conf

Listen 80

DocumentRoot "/home/admin/www/html"

<Directory "/home/admin/www/html">

    Require all granted

    Require host ip

</Directory>

.... 

LoadModule ssl_module modules/mod_ssl.so

若模块不存在,需要安装

yum install mod_ssl

配置ssl.conf配置文件:

cat /etc/httpd/conf.d/ssl.conf

Listen 443 https

<VirtualHost _default_:443>

SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

SSLCertificateFile /etc/httpd/conf/cert/server.crt

SSLCertificateKeyFile /etc/httpd/conf/cert/server.nosecret.key

</VirtualHost>

重新加载httpd服务后,即可访问https站点了


SSL的协商过程

抓取报文,可见整个协商过程如下:

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(3)

1、TCP三次握手,client与Server的443端口建立TCP连接

2、Client发起Client Hello,报文中指定版本,随机数(random1),client所有支持的密码套件(CipherSuites),其它参数

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(4)

#client hello

3. Server回应Server Helllo,包含指定版本,Server端的随机数(random2),选定的CipherSuites,会话ID(Session ID)和其它参数

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(5)

#server hello

4、Server发送Certificate(Server的证书), Server Hello done, 客户端需要验证服务器发过来的证书的合法性(通过操作系统内置的ca证书,来验证服务器证书的颁发者和过期时间是否合法,如果存在数据签名,则用操作系统中颁发者CA的公钥对签名解密,用相同的hash算法算出签名的hash值,将这个hash值与签名中的hash值对比。验证是否是真实的服务器发送的)

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(6)

#certificate

5、Client发起Key Exchange, 这一步实际上是三个过程合为一个报文进行的:

Client Key Exchange:客户端验证通过,取出证书中的公钥,然后再生成一个随机数random3,用这个公钥对random3加密,生成PreMaster Key,客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 Random2 Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。

Change Cipher Spec(Client):这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。

Encrypted Handshake Message(Client): 这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(7)

#client Key Exchange

6、Server通告使用加密进行通讯

怎么查看一个网站的ssl证书(自制站点证书及SSL协商过程分析)(8)

,