在讲如何让网站实现https访问之前,先了解一下 http 和 https 的区别,以及https实现安全通信的原理
http 和 https 的区别
安全性:
HTTP:数据以明文形式传输,缺乏加密保护,容易被拦截和窃取。
HTTPS:在 HTTP 基础上增加了 SSL/TLS 加密层,对数据进行加密传输,保护数据的机密性和完整性,防止中间人攻击。
端口:
HTTP:默认使用端口 80。
HTTPS:默认使用端口 443。
证书:
HTTP:不使用数字证书。
HTTPS:使用由权威 CA(Certificate Authority)颁发的数字证书来验证服务器的身份,确保通信的真实性和安全性。
性能:
HTTP:由于没有加密和解密过程,传输速度相对较快。
HTTPS:由于需要进行加密和解密操作,增加了握手过程,初次连接时可能会有略微的性能开销。
URL 形式:
HTTP:URL 以
http://
开头。HTTPS:URL 以
https://
开头。
SEO(搜索引擎优化):
HTTP:搜索引擎对 HTTP 站点的信任度较低,影响排名。
HTTPS:搜索引擎(如 Google)更倾向于信任 HTTPS 站点,HTTPS 站点在搜索排名中可能会有优势。
浏览器行为:
HTTP:现代浏览器通常会警告用户某些网站使用 HTTP 传输,提示不安全。
HTTPS:浏览器会在地址栏显示一个锁的图标,表明连接是安全的。
https 实现安全通信的原理
SSL/TLS 加密:
HTTPS 使用 SSL/TLS 协议来加密数据。SSL/TLS 协议通过加密算法确保客户端和服务器之间传输的数据是加密的,从而防止中间人攻击、数据窃听等安全问题。
握手过程:
当客户端(如浏览器)请求与服务器建立 HTTPS 连接时,会首先进行一个称为“握手”的过程。在握手过程中,客户端和服务器协商使用的加密算法,并交换加密密钥。
证书验证:
服务器会提供一个数字证书(通常由权威的证书颁发机构 CA 签发),客户端会验证该证书的合法性,以确保服务器的身份是可信的。
了解完这些,实现网站的https访问,我们需要一个SSL证书,这里以阿里云免费SSL证书举例,在购买获取到免费证书后,进行证书创建。
证书创建
证书申请
DNS验证
这个是在DNS控制台区添加它所说的DNS解析记录,然后进行验证。验证通过后,下发证书,然后下载证书即可。阿里云SSL证书支持多种服务器类型,如:Tomcat、Apache、Nginx、IIS、JKS、其他及根证书下载。
证书下载
在Nginx服务器安装证书
执行以下命令,在Nginx的conf目录下创建一个用于存放证书的目录。
cd /usr/local/nginx/conf #进入Nginx默认配置文件目录。该目录为手动编译安装Nginx时的默认目录,如果您修改过默认安装目录或使用其他方式安装,请根据实际配置调整。
mkdir cert #创建证书目录,命名为cert。
将证书文件和私钥文件上传到Nginx服务器的证书目录(/usr/local/nginx/conf/cert)。
编辑Nginx配置文件nginx.conf,修改与证书相关的配置。
执行以下命令,打开配置文件。vim /usr/local/nginx/conf/nginx.conf
在nginx.conf中定位到server属性配置。
server { listen 443 ssl; server_name <yourdomain>; ssl_certificate cert/<cert-file-name>.pem; ssl_certificate_key cert/<cert-file-name>.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { proxy_pass http://halo; proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
可选:设置HTTP请求自动跳转HTTPS。
server {
listen 80;
listen [::]:80;
server_name <yourdomain>;
client_max_body_size 1024m;
location / {
return 301 https://$host$request_uri;
}
}
执行以下命令,重启Nginx服务。
cd /usr/local/nginx/sbin #进入Nginx服务的可执行目录。
./nginx -s reload #重新载入配置文件。