Apache2上部署SSL证书 提升安全等级

首先得先申请一个证书
可以通过阿里云,腾讯云购买免费的ssl证书,也可以通过 来此加密来申请证书。

科普知识

网页访问过程
  1. 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
  2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
  3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
  4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
  5. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
  6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
https 连接过程
  1. 客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
  2. 服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥(用于非对称加密),以及证书的颁发机构等信息(证书中的私钥只能用于服务器端进行解密);
  3. 客户端验证服务器的合法性,包括:证书是否过期,CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配;
  4. 如果证书受信任,或者用户接收了不受信任的证书,浏览器会生成一个随机密钥(用于对称算法),并用服务器提供的公钥加密(采用非对称算法对密钥加密);使用Hash算法对握手消息进行摘要计算,并对摘要使用之前产生的密钥加密(对称算法);将加密后的随机密钥和摘要一起发送给服务器;
  5. 服务器使用自己的私钥解密,得到对称加密的密钥,用这个密钥解密出Hash摘要值,并验证握手消息是否一致;如果一致,服务器使用对称加密的密钥加密握手消息发给浏览器;
  6. 浏览器解密并验证摘要,若一致,则握手结束。之后的数据传送都使用对称加密的密钥进行加密

基础配置

上传证书到服务器
cd /etc/apache2/

我们要配置另 ssl 证书,要依靠另一个文件,也就是

/etc/apache2/sites-available/default-ssl.conf

首先我们需要设置一个软链接,把这个文件链接到sites-enabled这个文件夹中:

ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf

然后去修改default-ssl.conf或者000-default-ssl.conf

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		ServerAdmin 你的邮箱
        
		DocumentRoot /var/www/你的目录
	    ServerName 你的域名

		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined
        #启用ssl功能
		SSLEngine on
		# 注意,需要添加这三行
		#证书文件
		SSLCertificateFile 你自定义的路径/2_xxx.xxx.xxx.crt
		#私钥文件
    	SSLCertificateKeyFile 你自定义的路径/3_xxx.xxx.xxx.key
    	#证书链文件
    	SSLCertificateChainFile 你自定义的路径/1_root_bundle.crt
	
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
				SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
				SSLOptions +StdEnvVars
		</Directory>
	</VirtualHost>
</IfModule>
开启SSL
//开启apache2的ssl模块
sudo a2enmod ssl
//重启apache2服务
systemctl restart apache2  //或者 service apache2 restart

提升安全等级

在网站全站HTTPS后,如果用户手动敲入网站的HTTP地址,或者从其它地方点击了网站的HTTP链接,通常依赖于服务端301/302跳转才能使用HTTPS服务。而第一次的HTTP请求就有可能被劫持,导致请求无法到达服务器,从而构成HTTPS降级劫持。这个问题目前可以通过HSTS(HTTP Strict Transport Security,RFC6797)来解决。

开启 HSTS

HSTS简介

HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。采用HSTS策略的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址,以减少会话劫持风险。

HSTS响应头格式
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
max-age: 单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。
includeSubDomains: 可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。
preload: 可选参数,一个浏览器内置的使用HTTPS的域名列表。

举个例子, 我们在 Chrome 浏览器中访问 Facebook 的主页 , 然后打开开发者工具,可以看到服务端发送这样的相应:

这里面的 Strict-Transport-Security 头就是 HSTS 的信息了。 其实在服务端上,只需要发送这个头就可以了。具体的实现都在客户端上,也就是你的浏览器。 当浏览器检测到这样的 Header 信息后,就会做一个记录,根据 max-age 的提示,在一定时间内用户再次访问这个站点的时候就直接使用 HTTPS 协议请求,如果 HTTPS 请求失败,也不会降级到 HTTP 而是直接失败。

这样有什么好处
其实大家平时在使用浏览器的时候,一般是直接在地址栏里面输入域名,然后就访问了。 但大家应该知道,大多数浏览器在默认情况下会先用 HTTP 发起请求的。也就是说即便你的站点已经支持了 HTTPS,但如果不做任何处理的话,用户还是很难触及到。

而为什么我们平时访问很多网站的时候自动就跳转到 HTTPS 站点了呢,也是因为这些站点对这一点做了处理。 最原始的方法就是 302 跳转,服务端把所有的 HTTP 流量跳转到 HTTPS 上。 但这样做有一个明显的安全漏洞, 就是第一次访问站点的时候如果是 HTTP 就有可能被中间人劫持,很可能都没到 302 跳转的时候就被劫持了。

这也就是为什么要引入 HSTS 机制的原因了。 用户的浏览器一旦得到了 HSTS 的信息,下次再访问站点的时候客户端浏览器就会强制使用 HTTPS。 无论你在地址栏里输入什么,都会以 HTTPS 访问。 这样就避免了每次服务端跳转可能导致的潜在安全问题。

这样就解释了为什么我们使用主流浏览器输入网站域名的时候,都会自动跳转到 HTTPS 了。 因为我们访问的大多是主流的大网站,所以用户的感觉就是 HTTPS 自动发生了。但实际上并不是这样的。

HSTS 本身也有缺陷,假如用户的浏览器从未访问过这个站点,那也就不会得到 HSTS 响应头, 这个时候依然会有被劫持风险, 但相比每次都进行服务端跳转的机制,已经好了不少。

针对 HSTS 的这个缺陷,主流的浏览器也提供了一些解决方案,比如把一些大流量并且已知支持 HSTS 的站点预先内置到浏览器中,这样就更大程度的完善了 HTTPS 的安全机制。

Apache上启用HSTS

$ vim /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
  ServerName www.hi-linux.com
  ServerAlias hi-linux.com
...
 #将所有访问者重定向到HTTPS,解决HSTS首次访问问题。
  RedirectPermanent / https://你的域名/
</VirtualHost>

$ vim /etc/apache2/sites-available/default-ssl.conf

# 开启HSTS需要启用headers模块
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
<VirtualHost 0.0.0.0:443>
...
# 启用HTTP严格传输安全
  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
...
</VirtualHost>
指定 TLS 协议版本

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
因为TLSv1.0存在诸多安全问题,所以我们要用TLSv1.2

$ vim /etc/apache2/sites-available/default-ssl.conf
</VirtualHost>
...
SSLProtocol   TLSv1.2
...
</VirtualHost>
开启 PFS

PFS(perfect forward secrecy)正向保密 ,在密码学中也可以被称为FS(forward secrecy),是安全通信协议的特性,要求一个密钥只能访问由它所保护的数据,用来产生密钥的元素一次一换,不能再产生其他的密钥,一个密钥被破解,并不影响其他密钥的安全性。

$ vim /etc/apache2/sites-available/default-ssl.conf
</VirtualHost>
...
SSLHonorCipherOrder on
...
</VirtualHost>
开启 http/2

HTTP/2 的协议名称,口语叫法HTTP2和http/1.1 是一个概念,通过ALPN协商。
HTTP/2 中只能使用 TLSv1.2+协议

sudo a2enmod http2
$ vim /etc/apache2/sites-available/default-ssl.conf
</VirtualHost>
...
Protocols h2 http/1.1
...
</VirtualHost>

如果使用 Apache2+PHP 架构的应用程序,由于 mpm_prefork 模块不支持 mod_http2,所以我们需要切换 mpm_prefork、mod_php 到 mpm_event 和 php-fpm 来解决这个问题

# Install php-fpm and enable
sudo apt install php-fpm
sudo systemctl enable php7.2-fpm
# To enable PHP 7.2 FPM in Apache2
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.2-fpm
# First to disable PHP 7.2/ mpm_prefork to avoid conflicts,then enable.
sudo a2dismod php7.2 mpm_prefork
sudo a2enmod mpm_event

最终评级

这里推荐两个权威SSL评测网站
亚洲诚信在这里插入图片描述
Quals
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值