使用nginx配置SSL证书实现https访问
这篇文章主要是以阿里云申请的SSL免费证书为例,通过nginx配置的方式,实现https安全访问网站,并通过nginx进行端口的映射,从而实现https访问应用服务的目的。
本文目录:
- 域名解析到服务器
- 阿里云上申请免费SSL证书
- nginx配置
- SSL证书配置(ubuntun16.04)
- nginx将访问映射到具体应用端口
一、把域名解析到服务器
登陆阿里云,在阿里云控制台-产品与服务-云解析DNS-找到需要解析的域名点“解析”,进入解析页面后选择【添加解析】按钮会弹出如下页面:
主机记录填写自己的二级域名,记录值就是服务器ip地址,确认,域名解析成功。
二、在阿里云上申请免费的SSL证书
首先,打开aliyun购买SSL证书的地址,https://commonbuy.aliyun.com/spm=5176.2020520163.cas.1.12092b7aZwTIBO&commodityCode=cas#/buy
可能会发现找不到免费版本的SSL证书,不用担心,只需要先选择一个域名,再选择Symantec品牌,这个时候,就会发现有免费版的证书了,购买即可
购买成功后,回到管理界面,点击补全信息,输入刚刚映射的域名
等待一段时间,等证书状态变为“已签发”后,SSL证书就申请成功了,点击下载,找到页签中Nginx/Tengine配置信息,并“下载证书 for Nginx”:
三、服务器配置Nginx
登陆到服务器,进行nginx的安装,在Ubuntu下安装Nginx有apt安装和源码安装的方式,本次使用apt安装,如果想安装最新版本的话,则只能使用源码安装,具体可以自行百度
$ apt-get update // 更新软件
$ apt-get install nginx // 安装nginx
安装好的文件位置如下:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
如果想更加清楚Nginx的配置项放在什么地方,可以打开/etc/nginx/nginx.conf查看,
如果要查看加载的是哪个配置文件,可以使用sudo nginx -t
或者ps -ef | grep nginx
命令进行查看
通过这种方式安装的,会自动创建服务,会自动在/etc/init.d/nginx新建服务脚本
如需重启nginx,用以下命令:
$ service nginx stop // 停止
$ service nginx start // 启动
$ service nginx restart // 重启
$ service nginx reload// 重新加载
四、配置SSL证书
( 1 ) 在Nginx的安装目录/etc/nginx/下创建cert目录,并且将下载的全部文件拷贝到cert目录中。
( 2 ) 打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到:
# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#}
#}
将其修改为:
server {
listen 443;
server_name xxx.icarole.com; //域名
ssl on;
root html; //对应静态文件目录,可以映射到你需要的目录
index index.html index.htm;
ssl_certificate cert/214691357820877.pem; //证书的名字
ssl_certificate_key cert/214691357820877.key; //证书的名字
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name xxx.icarole.com;// 你的域名
rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名请求转成https
}
(3)配置完成后,检查一下nginx配置文件是否可用,有successful表示可用。
$ sudo nginx -t // 检查nginx配置文件
(4)配置正确后,重新加载配置文件使配置生效:
$ nginx -s reload // 使配置生效
至此,nginx的https访问就完成了,并且通过rewrite方式把所有http请求也转成了更加安全的https请求。
五、Nginx将请求映射到具体应用端口
如果项目中使用的是某些端口,则需要通过nginx将访问请求转发映射到对应的端口,只需将上面的配置做一些修改即可,具体配置如下:
upstream testServer{
server xxx.icarole.cn:6201;
}
server {
listen 443;
server_name xxx.icarole.com; //域名
ssl on;
root html; //对应静态文件目录,可以映射到你需要的目录
index index.html index.htm;
ssl_certificate cert/214691357820877.pem; //证书的名字
ssl_certificate_key cert/214691357820877.key; //证书的名字
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
proxy_pass http://testServer; //对应上面的
}
}
server {
listen 80;
server_name xxx.icarole.com;// 你的域名
rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名请求转成https
}
同样,通过sudo nginx -t
验证配置,然后重启nginx service nginx restart
,再次访问xxx.icarole.cn,会发现已经将访问请求映射到了具体的端口,而且会跳转到https页面
说明:
- 因为我们这里申请的是开发版免费证书,所以一个证书仅支持一个域名认证,不支持通配符。
- 如果是云服务器比如阿里云ECS,需要到阿里云ECS的管理后台的安全组,修改端口过滤规则把80端口和443端口开放才能访问到,如果是公司内部服务器,则需要确认服务器端口有没有开放,以及路由器有没有对端口做限制。