目录:
环境说明:
Linux:ubuntu 20.0.4
nginx:1.18
首先,你得有域名的证书文件,如果还没有,就得要申请了,如果要求不高只要单域名证书的话,到购买域名的服务商那里就能免费申请到,本文以阿里云的单域名证书为例来进行说明。
1. 查看nginx是否支持SSL
使用命令查看nginx版本:
nginx -V
查看输出结果,如果有显示--with-http_ssl_module
,则说明支持安装SSL证书,如果没有显示,则需要重新下载nginx源码重新编译安装SSL模块。
2. 申请并下载SSL证书
一般对于个人用户来说,第三方机构颁发的免费DV证书即可满足要求,比如阿里云腾讯云都可以申请到为期一年的免费SSL证书(前提是在平台上买了域名)。要是对于信息安全有更高要求的用户或者企业来说,就得使用付费的SSL证书了。这里以阿里云的免费SSL证书为例说明:
首先登陆阿里云,前往阿里云SSL证书购买页面,按如图设置,使最后的价格为0:
点击购买,购买完成之后,自动跳转到SSL证书控制台,然后就可以为所购买的域名申请SSL证书了,申请过程很简单,照着提示做就可以,申请之后会提交审核,审核速度也很快,一般5分钟左右最长不超过10分钟就能审核成功。
完毕后,即可在SSL证书控制台下载SSL证书:
选择nginx,下载即可,记住下载的位置,等会上传时要用
3. 上传证书
先在服务器上创建一个放SSL证书的目录,这里以/etc/nginx/ssl为例,当然你也可以改成其他目录:
# 创建目录
sudo mkdir /etc/nignx/ssl
然后将下载好的证书文件使用Ftp工具上传到这个文件夹,这里推荐用XSHELL,FileZilla等FTP工具,上传之后如图:
4. 安装证书
编辑网站的Nginx配置文件,我的目录是/etc/nginx/sites-enabled,这里根据自己的实际情况来换成自己的目录:
sudo nano /etc/nginx/nginx.conf
在配置文件中定位到站点的配置信息,在其中添加以下server配置信息,并按照注释修改其中部分站点信息:
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 80;
#配置HTTPS的默认访问端口为443,如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;
#如果您使用Nginx 1.14.0及以下版本,请使用listen 443和ssl on代替listen 443 ssl。
#需要将yourdomain.com替换成证书绑定的域名。
server_name yourdomain.com;
root html; #站点目录更改成自己的
index index.html index.htm;
#需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate /etc/nginx/ssl/cert-file-name.pem;
#需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
ssl_certificate_key /etc/nginx/ssl/cert-file-name.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DHE;
#表示使用的TLS协议的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#其他的配置信息···
}
更改完成后,ctrl + o保存,ctrl + x退出,回到终端界面,然后重启Nginx服务:
sudo nginx -s reload
重启完成后,验证安装是否成功,在访问网址前方加入:https://,回车访问:
原来地址栏前面的“不安全”字样变为了一把绿色的小锁,说明SSL证书安装成功
5. 设置HTTPS强转
经过上面的设置后,网站虽然可以用HTTPS访问,但是每次都得网址前面手动添加HTTPS://字样,否则就是默认HTTP方式访问,那么我们可以设置一下,使网站在用HTTP方式访问时都能自动跳转到更安全的HTTPS方式。
下面提供了三种方式来实现,任选一种在配置文件中添加相应代码即可,添加完别忘了重启nginx服务。
# 1.利用497状态码跳转,在一个站点只允许 https 访问时, 如果使用 http 访问会报出497错误码,所以可以利用497状态码重定向到 https:
error_page 497 https://$host$uri?$args;
# 2.
if ($server_port = 80){
return 301 https://$host$request_uri;
}
# 3.
if ($scheme = http) {
return 301 https://$host$request_uri;
}
此篇博客仅限单域名证书的申请安装,但是泛域名证书的话在域名服务商那里就是付费的,当然也有免费的,比如大名鼎鼎的Let's encrypt证书,参考这里:免费的泛域名证书——Let's encrypt证书 - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)。
评论 (0)