我们在做一些项目或者网站的时候需要配置https,以加强网站的安全性等,记录一下学习之路~
HTTPS认识
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
本文测试环境
服务环境:nginx-1.7
系统环境:windows10/CentOS7
1) 通过openssl自己办法证书测试https服务
2)通过let`s Encrypt申请免费证书
Https项目服务部署(linux-CentOS7)
1)openssl
1. 首先确保机器上安装了openssl和openssl-devel
1)#yum install openssl
2)#yum install openssl-devel
2. 创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 1024 //生成私钥
3. 创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr //生成证书颁发机构,用于颁发公钥
4. 在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key //除去密码以便reload询问时不需要密码
5. 配置nginx,最后标记证书使用上述私钥和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
6. 修改Nginx配置文件,让其包含新标记的证书和私钥:
server {
listen 9003 ssl; //监听端口为9003 同时兼容http和https
server_name www.aecccloud.com;
#ssl on; //开启ssl 指定https时打开注释
ssl_certificate /usr/share/nginx/html/sslfile/server.crt; #证书位置
ssl_certificate_key /usr/share/nginx/html/sslfile/server.key; #私钥位置
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; //指定密码为openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5; //密码加密方式
ssl_prefer_server_ciphers on; //依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
location / {
root html; //根目录的相对位置
index index.html index.htm;
}
}
2)let`s Encrypt
certbot是Let's Encrypt官网推荐的自动化配置工具,工具官网可以选择针对Apache/Nginx/Haproxy/Plesk等不同服务器不同操作系统的安装配置方法
根据官网https://certbot.eff.org选择服务类型系统版本来执行命令:
certbot有几个不得不解决的依赖问题:
1) certbot依赖的python2的urllib3库版本为1.21.1版本,如果已经安装了更高版本的urllib3库,那么降级吧pip install urllib3==1.21.1
2) 如果python2的requests库版本小于2.6.0,那么自觉升级pip install --upgrade --force-reinstall 'requests==2.6.0'
3) 接下来真正的安装过程:
yum install epel-release -y && yum update -y
yum install python2-certbot-nginx -y
4) 确保你的nginx配置已经有配置域名,并且域名解析也已经指向该IP地址,域名能够通过80端口正常访问(或配置其他端口)
5) 当安装完成以后,一切就简单了,运行certbot --nginx,会以提问的方式询问你几个配置问题:
# 第一步会读取你的nginx配置,询问你需要对哪些域名需要添加ssl
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: a.haofly.net
2: b.haofly.net
-------------------------------------------------------------------------------
# 第二步询问你在遇到http的时候是否需要重定向到https
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
就这样,配置就算完成了,可以看到新的nginx配置已经写入到配置文件中,访问域名也会自动跳转到https了
6)当然,Let's Encrypted只有90天的有效期,可以使用这条命令更新证书: sudo certbot renew --dry-run,官方建议每天随机运行两次该命令,如果证书没有过期,运行命令并不会对你的服务器造成什么影响,所以就添加如下定时任务:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
Https项目服务部署(windows)
1. 安装perl(非必须)
下载地址:Download & Install Perl - ActiveState
以管理员身份运行cmd或者重启cmd重启电脑,验证是否安装成功
2. 安装openssl
下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
按照提示更改存放目录,一直next即可,安装完成之后配置一下环境变量。把openssl安装路径bin的路径(例如 D:\OpenSSL-Win64\bin)加入到操作系统的系统环境变量Path中
运行cmd,命令行openssl查看是否安装成功
1)生成证书
首先在nginx安装目录中创建新文件夹sslfile用于存放证书,如:D:\niginx\sslfile
在控制台执行命令:cd D:\nginx\ssl
2) 创建私钥
genrsa -des3 -out test.key 1024 # test文件名是自己随便起即可
输入密码后,再次重复输入确认密码
3) 创建csr证书
openssl req -new -key test.key -out test.csr
#其中key文件为刚才生成的文件
执行上述命令后,需要输入一系列的信息。输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名
4) 去除密码
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。
复制test.key并重命名为test.copy.key。
在命令行中执行如下命令以去除口令:
openssl rsa -in test.copy.key -out test.key
#然后输入密码,这个密码就是上文中在创建私钥的时候输入的密码。
5) 生成crt证书
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。下面,配置https服务器的时候,我们需要用到的是其中的test.crt和test.key这两个文件
3. 修改nginx配置
listen 9003 ssl; #监听端口为9003 且同时支持http和https
server_name www.aecccloud.com; #域名
ssl_certificate /usr/share/nginx/html/sslfile/server.crt; #证书位置
ssl_certificate_key /usr/share/nginx/html/sslfile/server.key; #私钥位置
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; #指定密码为openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5; #密码加密方式
ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先
关闭nginx服务,重启服务即可。