https站点证书自制
1. 自制一个CA证书(假定的第三方认证机构)
生成CA私钥(fakeca.key)
openssl genrsa -des3 -out fakeca.key 4096
这个命令对输入的密码使用DES3加密,并生成一个4096位的密钥
生成CA(fakeca.crt)证书,用于向客户端发布和对站点进行签名
openssl req -new -x509 -days 3650 -key fakeca.key -out fakeca.crt
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
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站点了
抓取报文,可见整个协商过程如下:
1、TCP三次握手,client与Server的443端口建立TCP连接
2、Client发起Client Hello,报文中指定版本,随机数(random1),client所有支持的密码套件(CipherSuites),其它参数
#client hello
3. Server回应Server Helllo,包含指定版本,Server端的随机数(random2),选定的CipherSuites,会话ID(Session ID)和其它参数
#server hello
4、Server发送Certificate(Server的证书), Server Hello done, 客户端需要验证服务器发过来的证书的合法性(通过操作系统内置的ca证书,来验证服务器证书的颁发者和过期时间是否合法,如果存在数据签名,则用操作系统中颁发者CA的公钥对签名解密,用相同的hash算法算出签名的hash值,将这个hash值与签名中的hash值对比。验证是否是真实的服务器发送的)
#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 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。
#client Key Exchange
6、Server通告使用加密进行通讯
,