(本文参考https://blog.csdn.net/tuzongxun/article/details/88647172)
1、什么是系统安全管理
置于公网的系统,通常都需要一定的安全管理,据我个人理解,这里的安全管理主要分三个方面:
一是应用内的权限控制,比如具体应用的用户名、密码等;
二是应用数据传输过程中的安全机制,例如各种报文的加解密方案;
三是数据传输前的通讯安全机制,保证通讯双方都是可靠可信任的,PKI就是其中一个解决方案。
2、什么是PKI
PKI是 Public Key Infrastructure的简称,意思是公钥基础设施。
公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。
3、什么是CA
CA是Certificate Authority的简称,即证书的签发机构,它是PKI的核心。
正常情况来说,CA是具有权威性的机构,通过CA获取证书需要给钱。
但是有的时候可能不想用CA机构的证书,又想要使用https站点,那么可能就需要自己生成证书,但是这种证书浏览器是认为不安全的,本文档后边的具体步骤即针对这种场景。
4、什么是https
https是http+ssl,通俗点说,就是采用http通讯的安全传输协议,用来保证http传输过程中数据的机密性、完整性和可靠性,ssl需要证书。
5、单向认证
网络通讯是双向的,但是安全认证不一定都是双向。大多数情况下可能都是单向的,只需要客户端确认服务端是可靠的,而服务端不管客户端是否可靠。即客户端,比如浏览器会验证服务端证书,服务端不需要客户端证书。
6、双向认证
双向认证相对于单向认证,即客户端需要确认服务端是否可信,服务端也需要确认客户端是否可信。双方都要验证对方的证书。
二、实现步骤
1、本地环境
本次技术调研过程全程都在自己的电脑上,采用物理机加虚拟机的方式:
物理机:win10+ie+Chrome
虚拟机:centeros6.8+nginx+tomcat+openssl
2、nginx安装
2.1、安装包准备
nginx安装需要依赖其他的一些组件,网上说有以下三个必要依赖:
openssl
pcre
zlib
但实际安装过程发现只有openssl是必要的,其他两个可以排除,因此实际安装时下载了两个安装包:
nginx-1.12.2.tar.gz
openssl-1.0.0a.tar.gz
2.2、安装openssl
2.2.1、解压
tar -zxvf openssl-1.0.0a.tar.gz
2.2.2、配置
进入解压后目录
./configure
2.2.3、编译
make
2.2.4、安装
make install
2.3、安装nginx
2.3.1、解压
tar -zxvf nginx-1.12.2.tar.gz
2.3.2、配置
进入解压后的文件夹配置,这里需要注意的是,使用参数排除了pcre和zlib,同时指定了openssl的安装目录,并指定安装ssl模块
./configure --without-http_rewrite_module --without-http_gzip_module --with-http_ssl_module --with-openssl=/home/tuzongxun/openssl/openssl-1.0.0a
2.3.3、编译
make
2.3.4、安装
make install
安装后会看到/usr/local目录中多了一个nginx目录,即nginx的安装目录
3、证书生成
3.1、生成根证书
mkdir ssl 创建证书存放的目录
cd ssl 进入证书存放目录
openssl genrsa -out ca.key 2048 生成根证书私钥
制作根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
3.2、生成服务端证书
先生成服务端私钥
openssl genrsa -out server.pem 1024
openssl rsa -in server.pem -out server.key
生成签发请求,注意这里的common name必须需要访问的域名(也可以是IP),其他的内容可以和根证书填写的一样
openssl req -new -key server.pem -out server.csr
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
4、单向认证
CA单向认证,只需要验证服务端是否可信即可,因此也就只需要上边的步骤生成了根证书和服务端证书即可,然后就可以配置nginx了。
4.1、nginx配置
进入nginx的安装目录找到nginx.conf文件更改配置
主要是更改server里的内容,更改后如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 443 default_server;
server_name _ ;
ssl on;
ssl_certificate /usr/local/nginx/ssl/server.crt;
ssl_certificate_key /usr/local/nginx/ssl/server.key;
ssl_session_timeout 5m;
#ssl_client_certificate /usr/local/nginx/ssl/ca.crt;
#ssl_verify_client on;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://192.168.4.20:8082/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
主要更改如下:
默认的 listen 80为 listen 443 default_server;
server_name _;
使用 ssl on开启ssl安全认证功能;
ssl_certificate指定服务端证书的地址,如/usr/local/nginx/ssl/server.crt;
ssl_certificate_key指定服务端私钥地址,如/usr/local/nginx/ssl/server.key;
ssl_session_timeout设置ssl session超时时间5m;
更改默认的跟访问路径/的路由为实际需要访问的资源,例如这里指向了tomcat默认端口(启动了tomcat才能访问,或者其他具有8080端口的可访问资源)。
4.2、启动nginx
在nginx的sbin目录中启动nginx
4.4、客户端安装根证书
上边启动nginx,并配置hosts之后,ie浏览器中就可以访问https://192.168.4.20了,但是会提示不安全的站点,点击之后才能继续访问:
做到这一步,如果请求已有资源,访问不到静态资源:
控制台报错如下:
报错信息如下:
1 Mixed Content: The page at 'https://login.jsp' was loaded over HTTPS, but requested an insecure stylesheet 'http://login.css'. This content should also be served over HTTPS.
解决方案请看我的另一篇博客:
>>>传送门<<<
5、双向认证(自测只能IE内核浏览器访问)
单向认证是客户端根据ca根证书验证服务端提供的服务端证书和私钥;双向认证还要服务端根据ca根证书验证客户端证书和私钥,因此双向认证之前还需要生成客户端证书和私钥。
5.1、生成客户端证书
客户端证书生成步骤和服务端基本一样,填写的信息中,comm name也要是访问的域名,其他信息最好是和服务端的不一样。
双向认证命令:
openssl genrsa -out client.pem 1024
openssl rsa -in client.pem -out client.key
openssl req -new -key client.pem -out client.csr
填写信息
openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
下面是将nginx中配置文件的这两个打开。
修改后重启nginx
访问地址,报错:
将打包生成的client.p12文件拷贝至客户端,双击安装证书.
关闭浏览器=>再次访问=>提示确认证书=>点击确定即可.
双向认证完成。再次提醒,双向认证只能适用于IE内核,其他浏览器解决方案暂时未研究。