实验环境:centos7
0x01 升级openssl
在centos7中使用yum安装的openssl,发现版本比较老,停留在OpenSSL 1.0.2k-fips 26 Jan 2017
,所以升级一下openssl到OpenSSL 1.1.1i 8 Dec 2020
。
wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz #下载最新openssl包
tar -zxvf openssl-1.1.1i.tar.gz
cd openssl-1.1.1i/
./config --prefix=/usr/local/openssl
make &&make install #编译和安装,如果报找不到gcc就安装gcc,参考如:yum -y install gcc gcc-c++ libstdc++-devel
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v #设置生效
openssl version #查看openssl版本
0x02 创建根证书
生成私钥
openssl genrsa -out ca.key 2048 #生成2048位私钥
生成证书请求文件
openssl req -new -key ca.key -out ca.csr
生成自签证书
openssl req -x509 -days 3650 -key ca.key -in ca.csr -out ca.crt
0x03 创建用户证书
生成私钥
openssl genrsa -out server.key 2048
生成证书请求
openssl req -new -key server.key -out server.csr
生成证书(根证书对用户的证书请求签名,最终生成用户证书)
先把openssl配置文件复制到当前目录find / -name "openssl.c*" cp /usr/local/openssl/ssl/openssl.cnf ./
然后再生成server.crt证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
这时候会报错
ca: ./demoCA/newcerts is not a directory
,需要手动创建CA目录结构mkdir ./demoCA mkdir demoCA/newcerts touch demoCA/index.txt echo "01" > demoCA/serial #这里的01控制证书杂项里的序列号
此时还会报错
The organizationName field is different between CA certificate and the request
,还需要修改openssl.cnf
配置文件vi openssl.cnf #将organizationName和organizationalUnitName改为optional [ policy_match ] countryName = match stateOrProvinceName = match organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional
然后就可以生成证书了。
验证证书有效性
verify 命令对证书的有效性进行验证,verify 指令会沿着证书链一直向上验证,直到一个自签名的 CA:openssl verify -CAfile ca.crt server.crt server.crt: OK
0x04 安装mod_ssl模块
安装httpd默认是没有安装 mod_ssl的,要自己安装。
yum -y install mod_ssl
0x05 apache配置文件加载mod_ssl模块
vi /etc/httpd/conf/httpd.conf #在LoadModule中加入下方这一行,加载mod_ssl模块
LoadModule ssl_module modules/mod_ssl.so
0x06 编辑ssl.conf文件
在配置文件中对相应的项目进行修改
vi /etc/httpd/conf.d/ssl.conf
Listen 443 https #开启443端口
SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM # 使用此加密套件。
SSLHonorCipherOrder on
SSLCertificateFile /usr/https/server.crt # 将domain name_public.crt替换成您证书文件名。
SSLCertificateKeyFile /usr/https/server.key # 将domain name.key替换成您证书的秘钥文件名。
#SSLCertificateChainFile /usr/4119464_chain.crt # 证书链文件,我们没有,所以注释掉
DocumentRoot "/var/www/html" #你的网站家目录
ServerName cocosec.top:443 #你的域名
这里为了用wireshark导入私钥解密https流量,可以将密码套件改为SSLCipherSuite AES128-SHA
。
然后重启httpd就行了
0x07 查看证书
配置好本地/etc/hosts
把自定义的域名指向装有lamp的服务器,然后访问查看证书。
这里由于客户端未导入受信任的根证书,所以浏览器输入栏左上方的小锁标志有个小三角,需要把openssl生成的根证书导入浏览器才能去掉。
这里将ca证书转换为pem格式,然后再把ca.pem导入浏览器
openssl x509 -in ca.crt -out ca.pem -outform PEM
参考文档
https://www.gokuweb.com/operation/d95eae05.html
https://zhuanlan.zhihu.com/p/115324515
https://blog.csdn.net/qq_45414629/article/details/104165931
https://m.linuxidc.com/Linux/2015-05/117034.htm
https://blog.csdn.net/howeverpf/article/details/21622545
https://blog.csdn.net/weixin_30265103/article/details/101908216
https://blog.csdn.net/vi18387682183/article/details/108733030