安全控制
关于web服务器的安全是比较大的一个话题,里面所涉及的内容很多,Nginx反向代理是安全隔离来提升web服务器的安全,通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。
使用SSL对流量进行加密
HTTPS是一种通过计算机网络进行安全通信的传输协议。它经由HTTP进行通信,利用SSL/TLS建立全通信,加密数据包,确保数据的安全性。
- SSL(Secure Sockets Layer)安全套接层
- TLS(Transport Layer Security)传输层安全
上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS和SSL在传输层和应用层对网络连接进行加密。
总结来说为什么要使用https:
http协议是明文传输数据,存在安全问题,而https是加密传输,相当于http+ssl,并且可以防止流量劫持。
nginx添加SSL的支持
前置安装
yum install openssl-devel # CentOS/RHEL
如果是使用yum安装的话,默认是有--with-http_ssl_module
模块的。
如果是通过源码安装的话
- 将原有/usr/local/nginx/sbin/nginx进行备份
- 拷贝nginx之前的配置信息
- 在nginx的安装源码进行配置指定对应模块 ./configure --with-http_ssl_module
- 通过make模板进行编译
- 将objs下面的nginx移动到/usr/local/nginx/sbin下
- 在源码目录下执行 make upgrade进行升级,这个可以实现不停机添加新模块的功能
Nginx的SSL相关指令
ssl
ssl:该指令用来在指定的服务器开启HTTPS
语法 | ssl_certificate file; |
默认值 | |
位置 | http、server |
server{
listen 443 ssl;
}
ssl_certificate
为当前这个虚拟主机指定一个带有PEM格式证书的证书。
语法 | ssl_certificate file; |
默认值 | |
位置 | http、server |
ssl_certificate_key
该指令用来指定PEM secret key文件的路径
语法 | ssl_ceritificate_key file; |
默认值 | |
位置 | http、server |
ssl_session_cache
语法 | ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size] |
默认值 | ssl_session_cache none; |
位置 | http、server |
- off:禁用会话缓存,客户端不得重复使用会话
- none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
- builtin:内置OpenSSL缓存,仅在一个工作进程中使用。
- shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
ssl_session_timeout
开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。
语法 | ssl_session_timeout time; |
默认值 | ssl_session_timeout 5m; |
位置 | http、server |
ssl_ciphers
指出允许的密码,密码指定为OpenSSL支持的格式
语法 | ssl_ciphers ciphers; |
默认值 | ssl_ciphers HIGH:!aNULL:!MD5; |
位置 | http、server |
可以使用openssl ciphers
查看openssl支持的格式。
ssl_prefer_server_ciphers
该指令指定是否服务器密码优先客户端密码
语法 | ssl_perfer_server_ciphers on|off; |
默认值 | ssl_perfer_server_ciphers off; |
位置 | http、server |
生成证书
- 使用阿里云/腾讯云等第三方服务进行购买。
- 使用openssl生成证书
先要确认当前系统是否有安装openssl
openssl version
安装下面的命令进行生成
mkdir /root/cert # 创建目录并切换到该目录
cd /root/cert
openssl genrsa -des3 -out server.key 1024 # 生成带有密码保护的 RSA 密钥
openssl req -new -key server.key -out server.csr # 生成证书签名请求(CSR)
cp server.key server.key.org # 备份私钥文件并移除密码保护
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt # 自签名证书
生成带有密码保护的 RSA 密钥
openssl genrsa -des3 -out server.key 1024
这将生成一个加密的 RSA 私钥文件 server.key
,其中包含一个 1024 位的密钥。您将被要求输入一个密码来保护私钥文件,可以输入test
生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr
这将使用私钥文件生成一个证书签名请求文件 server.csr
。在生成过程中,您将被要求提供一些与证书相关的信息,例如组织名称、域名等
- 第一次会要求你输入你之前输入的密钥:test
- 国家输入:CN
- 省份:guangdong
- 城市:guangzhou
- 组织:gjs
- 组织的:gjs
- 域名:test
- 邮箱地址:1216xx9850@qq.com
- 密码:test
- 公司:gjs
备份私钥文件并移除密码保护
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
这将复制一份原始的私钥文件 server.key
,并将其备份为 server.key.org
。然后,使用 openssl rsa
命令从备份文件中删除密码保护,并将结果保存回 server.key
文件中。需要输入密钥test
自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
这将使用私钥文件 server.key
和证书签名请求文件 server.csr
来生成一个自签名的 X.509 证书文件 server.crt
。该证书的有效期将为 365 天。
完成上述步骤后,您将在 /root/cert
目录下获得以下文件
server.key
: 不带密码保护的私钥文件server.crt
: 自签名的 SSL 证书文件
开启SSL实例
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /root/cert/server.cert; # 使用了绝对路径指定证书
ssl_certificate_key /root/cert/server.key; # 使用了绝对路径指定密钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
测试