一 介绍
HTTPS - Hyper Text Transfer Protocol over SecureSocket Layer,是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性;HTTPS在HTTP的基础下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL;HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)这个系统提供了身份验证与加密通讯方法,它被广泛用于万维网上安全敏感的通讯;服务端口为443
1 加密算法
对称加密算法:使用一个秘钥进行数据加密和解密;
非对称加密算法:加密和解密使用不同的秘钥,分为公钥和私钥,两个秘钥之间有着相互依存的关系,公钥和私钥成比例存在,公钥可以传输于公网,私钥不可外传;用其中一个加密的信息只能用其对应的另一个秘钥进行解密;
2 身份认证-数字签名
通过标识和鉴别用户的身份,防止假冒合法的用户来获取访问权限;
3 PKI - Public Key Infrastructure 公开秘钥体系
遵循标准的利用非对称加密技术为电子商务的开展提供一套安全基础平台的技术和规范;PKI就是利用公钥理论和技术建立的提供安全服务的基础设施,PKI采用证书管理公钥,通过第三方的可信任机构 - CA认证中心把用户的公钥和用户的其他标识信息(数字签名)捆绑在一起放在用户证书中,在互联网上验证用户的真实身份;
4 CA - 证书颁发机构
签发证书、规定证书的有效期和通过发布证书废除列表确保必要时可以废除证书、以及对证书和秘钥进行管理,CA为每个使用公钥的用户发放一个数字证书,数字证书内包括了用户的数字签名与其公钥,CA中心的数字签名使得攻击者不能伪造和篡改,具有一定的安全性;
5 加密示意图(建议放大)
过程解析
- Alice发送原始信息;
- 原始信息经过Hash运算得到信息摘要,Hash运算特点:不等长输入等长输出; 信息摘要经过Alice的私钥加密得到Alice的数字签名;
- 原始信息+Alice的数字签名+Alice的证书(内含Alice的公钥)经过Alice与Bob 的对称秘钥加密得到加密信息;
- 对称密码通过Bob的公钥进行加密,得到秘钥信封;
- 加密信息+秘钥信封组成加密数据包,在公网上进行传输到达Bob;
- Bob收到该数据包,用Bob的私钥解密秘钥信封(Bob的公钥进行加密)得到 Alice和Bob的对称秘钥;
- 使用对称秘钥解密加密信息得到:原始信息+Alice的数字签名+Alice的正式(内含Alice的公钥);
- 使用Alice的公钥解密Alice的数字签名(Alice的私钥加密)得到Alice经过Hash 运算的信息摘要;
- Bob将原始信息进行同样的Hash运算得到新的信息摘要;
- 比对这两个信息摘要内容,一致则接收,不一致则丢弃并重新请求Alice的信息;
上述数据传输同时使用了对称加密算法与非对称加密算法两种,我们通常使用对称加密算法加密较长的信息,比如我们需要发送的原信息或文件;使用非对称加密算法加密较短的信息,比如Hash运算后的信息;
11种免费获取SSL证书的方式,分别是阿里云SSL证书服务、百度云SSL证书服务、腾讯云SSL证书服务、华为云SSL证书管理SCM、站长安全认证证书服务、CloudflareSSL证书服务、滴滴云SSL证书服务、青云SSL证书服务、AlwaysonSSL、景安基础级DV、FreeSSL.org
经过亲测之后,个人推荐使用FreeSSL.org
二 安装
1 安装服务
# 安装apache环境依赖
[root@localhost ~]# yum -y install mod_ssl openssl httpd
[root@localhost ~]# yum install -y make
# mod_ssl主配置文件
[root@localhost ~]# rpm -qc mod_ssl
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf
# 查看配置信息
# 主要的修改有3处,一是监听端口,这里最好使用默认的443
# 二是网站的根目录,DocumentRoot和ServerName字段
# 三是证书的位置以及证书名称,可以使用默认,在创建的时候改成相应的名字
[root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf
Listen 443 https /监听端口
SSLEngine on /SSL功能是否打开
SSLCertificateFile /etc/pki/tls/certs/localhost.crt /证书文件路径
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key /私钥文件路径
# 制作证书文件
# 注意在RHEL 8.2中是没有Makefile文件的,我们需要外部导入该文件来制作证书,此实验我从RHEL 7虚拟机中找到此文件发送到RHEL 8中
[root@localhost ~]# cd /etc/pki/tls/certs/
[root@localhost certs]# ls
ca-bundle.crt localhost.crt Makefile
ca-bundle.trust.crt make-dummy-cert renew-dummy-cert
2 制作证书
创建自己的CA证书,注意:这里很多人喜欢使用rsa:4096,但在第三方平台上签署时一般都支持2048,所以不是越高越好
# 必须在/etc/pki/tls/certs/该目录下创建
[root@localhost certs]# make zhengshu.crt
umask 77 ; \
/usr/bin/openssl genrsa -aes128 2048 > zhengshu.key
Generating RSA private key, 2048 bit long modulus
...................+++
...................................................................................+++
e is 65537 (0x10001)
Enter pass phrase: # redhat
Verifying - Enter pass phrase: # redhat
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key zhengshu.key -x509 -days 365 -out zhengshu.crt
Enter pass phrase for zhengshu.key: # redhat
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:henan
Locality Name (eg, city) [Default City]:shangqiu
Organization Name (eg, company) [Default Company Ltd]:Yss
Organizational Unit Name (eg, section) []:AMS
Common Name (eg, your name or your server's hostname) []:wangjie
Email Address []:qq.com
[root@localhost certs]# ls
ca-bundle.crt localhost.crt Makefile zhengshu.crt
ca-bundle.trust.crt make-dummy-cert renew-dummy-cert zhengshu.key
较复杂的创建方式如图,可以借鉴,如有需求可查看openssl详细信息
-days 1095 正好是有效期3年,1095是天数
3 服务配置
[root@localhost ~]# cat /etc/httpd/conf.d/vhost.conf
<virtualhost 192.168.247.132:443>
servername 192.168.247.132
documentroot /var/www/jiami
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/zhengshu.crt
SSLCertificateKeyFile /etc/pki/tls/certs/zhengshu.key
</virtualhost>
<directory /var/www>
allowoverride none
require all granted
</directory>
# 创建对应路径和测试页面文件
[root@localhost ~]# mkdir -pv /var/www/jiami/
mkdir: created directory ‘/var/www/jiami/’
[root@localhost ~]# echo "this is jiami" >> /var/www/jiami/index.html
[root@localhost ~]# cat /var/www/jiami/index.html
this is jiami
# 证书
[root@localhost ~]# ls /etc/pki/tls/certs/
ca-bundle.crt localhost.crt Makefile zhengshu.crt
ca-bundle.trust.crt make-dummy-cert renew-dummy-cert zhengshu.key
# 重启,输入密码redhat
[root@localhost ~]# systemctl restart httpd
Enter SSL pass phrase for 192.168.247.132:443 (RSA) : ******(redhat)
4 验证
# 验证
[root@localhost ~]# curl -k https://192.168.247.132
this is jiami
[root@localhost ~]# curl -k https://192.168.247.132:443
this is jiami
三 附件
Makefile 文件内容,可以直接复制生成新文件,导入虚拟机即可使用。
[root@localhost ~]# cat /etc/pki/tls/certs/Makefile
UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)
DAYS=365
KEYLEN=2048
TYPE=rsa:$(KEYLEN)
EXTRA_FLAGS=
ifdef SERIAL
EXTRA_FLAGS+=-set_serial $(SERIAL)
endif
.PHONY: usage
.SUFFIXES: .key .csr .crt .pem
.PRECIOUS: %.key %.csr %.crt %.pem
usage:
@echo "This makefile allows you to create:"
@echo " o public/private key pairs"
@echo " o SSL certificate signing requests (CSRs)"
@echo " o self-signed SSL test certificates"
@echo
@echo "To create a key pair, run \"make SOMETHING.key\"."
@echo "To create a CSR, run \"make SOMETHING.csr\"."
@echo "To create a test certificate, run \"make SOMETHING.crt\"."
@echo "To create a key and a test certificate in one file, run \"make SOMETHING.pem\"."
@echo
@echo "To create a key for use with Apache, run \"make genkey\"."
@echo "To create a CSR for use with Apache, run \"make certreq\"."
@echo "To create a test certificate for use with Apache, run \"make testcert\"."
@echo
@echo "To create a test certificate with serial number other than random, add SERIAL=num"
@echo "You can also specify key length with KEYLEN=n and expiration in days with DAYS=n"
@echo "Any additional options can be passed to openssl req via EXTRA_FLAGS"
@echo
@echo Examples:
@echo " make server.key"
@echo " make server.csr"
@echo " make server.crt"
@echo " make stunnel.pem"
@echo " make genkey"
@echo " make certreq"
@echo " make testcert"
@echo " make server.crt SERIAL=1"
@echo " make stunnel.pem EXTRA_FLAGS=-sha384"
@echo " make testcert DAYS=600"
%.pem:
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req $(UTF8) -newkey $(TYPE) -keyout $$PEM1 -nodes -x509 -days $(DAYS) -out $$PEM2 $(EXTRA_FLAGS) ; \
cat $$PEM1 > $@ ; \
echo "" >> $@ ; \
cat $$PEM2 >> $@ ; \
$(RM) $$PEM1 $$PEM2
%.key:
umask 77 ; \
/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
%.csr: %.key
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $^ -out $@
%.crt: %.key
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days $(DAYS) -out $@ $(EXTRA_FLAGS)
TLSROOT=/etc/pki/tls
KEY=$(TLSROOT)/private/localhost.key
CSR=$(TLSROOT)/certs/localhost.csr
CRT=$(TLSROOT)/certs/localhost.crt
genkey: $(KEY)
certreq: $(CSR)
testcert: $(CRT)
$(CSR): $(KEY)
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -out $(CSR)
$(CRT): $(KEY)
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days $(DAYS) -out $(CRT) $(EXTRA_FLAGS)