前言
我这个WordPress搭建的时候并没有使用宝塔面板,而是直接在Centos之上直接部署的,于是添加ssl证书就只能手编了。在网上找了一圈,并没有特别详细的教程,只有阿里云有一点,于是本着没有就自己做的精神,同时因为为我之后做参考(之后ssl证书估计还得续签或者更换),帮助下和我一样需要手动配置的人。
另外提一句,其实也可以把ssl直接部署到CDN里面,也可以实现https访问,这两个地方有一个部署了就可以了。我不知道是信了谁的鬼话,说是最好部署到服务器里面,折腾了半天。区别就是后者使用源站的时候或者使用ip登录可能会出现问题,除此之外貌似真没啥区别。
ssl证书与https关系
ssl证书
SSL 证书是一个数字证书,是经Webtrust认证的知名CA(Certificate Authority) 机构颁发给网站的可信凭证,具有网站身份验证和加密传输双重功能。用于认证网站的身份并启用加密连接。SSL 代表安全套接字层,这是一个安全协议,可在 Web 服务器和 Web 浏览器之间创建加密链接。
为什么要使用https
首先便是强迫症,Chrome 和其他浏览器将所有 HTTP 网站标记为“不安全”。而且搜索引擎也会增加https的权重
其次,HTTP协议无法加密数据,数据传输为明文传输,于是就出现了数据传输可能产生泄露、篡改或钓鱼攻击等问题。
SSL证书部署到Web服务器后,可帮助您的Web服务器和网站间建立可信的HTTPS协议加密链接,为您的网站安全加锁,保证数据安全传输。
ssl证书与https关系
我们可以简单的把ssl证书看成一个密钥,而https就是其使用的加密方式。
要想深入的了解便需要先有以下的知识
对称加密
对称加密顾名思义就是加密解密时使用的密钥时相同的,一个密码既用于加密,同时也用于解密
常见的zip,rar压缩包的加密方式就是对称加密
非对称加密
首先要生成一个密钥对,即私钥和公钥。
用公钥可以对数据加密,而只有私钥才能解密
反之,用私钥加密,只能用公钥才能解密。
摘要运算
摘要算法又称为哈希或散列算法,是一种算法,可以将一段数生成一段数字指纹,并且保证唯一。哪怕改了一个字节,数字指纹就会完全不同
最常见的便是MD5
数字签名
加密
先将数据进行摘要运算,然后将这段摘要使用数字证书私钥进行加密。
数字签名就包括了摘要,私钥加密后的摘要,证书公钥
验证签名
利用公钥对数据进行解密,解密后和摘要相同,则验证通过
目的
做到只有拥有私钥的人才能加密,而所有人都可以验证签名是否有效
数字签名具有法律效力,防冒充(伪造),可鉴别身份,防篡改(防破坏信息的完整性),防重放,防抵赖,具有机密性(保密性)。
https的大致过程
现在我们终于可以看到https的过程了
https结合了非对称加密和对称加密。结合使用对称加密的原因就在与非对称加密速度太慢,消耗资源太多,于是就发明出了这一个聪明的加密方式可以在保证安全的前提下不影响数据传输效率:
- 访问https网站
- 网站发送其公钥证书
- 浏览器检查证书是否有效(验证有效期,颁发机构是否可信(CA)……)
- 如果可信,浏览器生成一个随机码KEY,使用网站服务器发送的公钥证书进行加密,并发送给服务器
- 服务器使用私钥将密文进行解密,得到浏览器产生的随机数KEY
- 解密成功,完成握手
- 之后使用KEY进行对称加密
为ngnix添加ssl证书
下载并传输ssl文件
申请到ssl证书之后,下载对应的文件,并解压
可以使用WinSCP软件将.pem和.key上传到服务器
找到.conf文件
.conf文件有两个,一般来说有一个nginx.conf和网站名.conf
我的nginx.conf文件在/etc/nginx,而另一个则在/etc/nginx/conf.d之中
两个文件使用其一即可,添加以下代码
- nginx.conf将代码修改后添加到http { }内部
- 网站名.conf将代码修改后在下面另起一个sever { }
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name yourdomain;#yourdomain替换为你的网站域名,前面不加https
root html;#Web网站程序存放目录
index index.html index.htm;
ssl_certificate cert/cert-file-name.pem; #ssl证书文件中的.pem文件路径
ssl_certificate_key cert/cert-file-name.key; #ssl证书文件中的.key文件路径
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; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_prefer_server_ciphers on;
location / {
root html; #Web网站程序存放目录
index index.html index.htm;
}
}
验证并重启
验证配置文件语法是否正确
nginx -t
重启nginx(下面两个命令都可以,任选其一即可)
ystemctl restart nginx
service nginx restart
https访问报错403
不知道是否是我的特有问题,我添加https之后,网站显示403
我把之前使用的http的配置文件复制了下来,修改并添加了部分内容,大家要是也遇到了这个问题,可以用我的进行参考,列出了部分可能需要修改的位置,代码如下:
server {
listen 443 ssl;
#网站域名
server_name pandax.wiki;
charset utf-8;
#Web网站程序存放目录
set $host_path "/var/www/pandax.wiki";
access_log /var/log/nginx/pandax.wiki.access.log main buffer=32k flush=30s;
error_log /var/log/nginx/pandax.wiki.error.log;
root $host_path;
index index.html index.htm;
#证书文件地址
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/cert.key;
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; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_prefer_server_ciphers on;
set $skip_cache 0;
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# 登录用户或发表评论者
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location = / {
index index.php index.html;
try_files /index.php?$args /index.php?$args;
}
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$args;
}
location ~ ^/\.user\.ini {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_cache wordpress;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.(js|css|png|jpg|jpeg|gif|ico|swf|webp|pdf|txt|doc|docx|xls|xlsx|ppt|pptx|mov|fla|zip|rar)$ {
expires max;
access_log off;
try_files $uri =404;
}
}
收尾
设置HTTP请求自动跳转HTTPS
添加以下代码,推荐使用Really Simple SSL对网站开启301重定向
server {
listen 80;
server_name yourdomain; #需要将yourdomain替换成证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
location / {
index index.html index.htm;
}
}
使用Really Simple SSL进行配置
由于修改了协议,导致之前上传的图片等链接出现问题而无法加载,可以使用Really Simple SSL插件对其进行善后工作,使用完成之后还可以卸磨杀驴,将其保留https配置的同时进行停用并删除
后记
你永远想不到一个非常微小的东西背后的复杂与精密,如果我不配置我网站的https,我肯定会对https感到非常自然,认为他本该就是这样的理所当然。我也相信之前肯定发生过不少问题,https协议才得以诞生。