Nginx使用openssl证书开启https服务
Openssl
SSL原理
基本术语:
- 加密 —— 使用公钥对数据进行加密的过程
- 私钥 —— 使用私钥对加密过的数据进行解密的过程
- 签名 —— 使用私钥对数据进行加密的过程
- 验证签名 —— 使用公钥对加密过的数据进行解密的过程
注:公钥和私钥均可对数据进行加解密,但是只有成对的公私钥才能解开对方的加密
HTTP通信
劣势:
- 通信使用明文,内容容易被窃听
- 不验证通信双方的身份,因此有可能遭遇伪装(如上了钓鱼网站,电脑中毒)
- 无法证明报文的完整性,所以有可能被篡改
SSL
1、SSL 是介于 HTTP 应用层和 TCP 协议层的一个通信接口,具有该层则可称之为 HTTPS,反之则为 HTTP。SSL 独立于 HTTP,不光 HTTP 可以用 SSL,SMTP、Telnet 均可使用 SSL
2、SSL 使用证书保证通信双方都是可靠的实体,目前 HTTPS 使用对称加密和非对称加密(公钥和私钥分开的加密方式)混合加密机制
3、非对称加密基本原理:
(请求开始)
1、服务器生成公钥和私钥,客户端同样
2、服务器将公钥对外公布,任何人均可获取公钥
3、客户端获取到公开秘钥,并使用其对数据进行加密
4、服务器收到加密后的数据,对数据使用私钥进行解密
(响应开始)
5、服务器将响应数据使用私钥进行签名
6、客户端拿到数据使用公钥进行签名验证
HTTPS
使用公开秘钥(非对称加密)其处理速度比共享秘钥(对称加密)要慢的多,所以混合使用二者,在保证安全的前提下能尽量的减少效率损失
- 在交换秘钥阶段使用公开秘钥的加密方式(以非对称加密来完成服务器和客户端的公钥互换)
- 通信建立后的报文互换阶段,使用共享加密的方式进行(建立连接后,后续的通信使用同一个相同的秘钥对数据进行加密、解密, 以提高处理速度)
上述过程中仍存在一个问题,就是公开秘钥(非对称加密的公钥)仍有被替换的风险。如瀚世的一台服务器向外公开了公钥,但是寅客的服务器埋伏在路由器前,偷偷把瀚世的公钥给换成了寅客自己的。客户需要对瀚世的数据进行请求时,实际建立上连接的却是寅客的服务器,寅客的服务器就可以获取到客户端的账号、密码等关键信息,并且可以随意对客户进行任意信息的返回
为了解决公钥被替换的风险,就要用到 数字证书认证机构(CA,Certificate Authority),这个机构是独立于客户端和服务器的,是广泛被认可的第三方机构。
该机构的处理流程如下:
- 服务器所有者向 CA 机构申请认证自己服务器的公钥
- CA 机构在判明服务器和所有者相关信息后,对服务器的公钥进行数字签名(使用 CA 自己的私钥),并且将签名放到公钥中(该公钥就可被成为证书了)
- 服务器将经 CA 机构签名后的公钥(证书)发布出去以供客户端使用
- 客户端在收到服务器的公钥证书后,使用 CA 机构的公钥对 服务器公钥上的数字签名进行验证,若通过则可进行安全通信(这一步其实是基于对 CA 机构的广泛信任)
各浏览器都会将常用的 CA 机构的公开秘钥植入到浏览器内部
https的缺点,综合来说 HTTPS 比 HTTP 慢 2 ~ 100 倍
- 服务器与客户端都需要进行加密、解密的操作 —— 额外效果 CPU、内存等硬件资源
- SSL通信部分要占用一些体积 —— 网络传输体积增大
- 出去TCP连接、发送和响应 HTTP 请求外,还要进行 SSL通信 —— 通信处理的时间延长
目前的解决方式:使用 SSL 通信专用硬件,当进行 SSL 处理时,可以分担负载,提升数倍 SSL 的计算速度
下载安装
从外网下载速度太慢,丢了个资源到CSDN,不需要安装 Perl 可以直接使用,下载地址 openssl
双击开始安装,可以直接一路默认过去
生成证书
1、生成私钥(这个是要丢到 nginx 上使用的),随便输一个记得住的密码(如:1234)
openssl genrsa -des3 -out server.key 2048
2、创建证书签名请求CSR文件,要输入一些信息
openssl req -new -key server.key -out server.csr
3、创建验证的附加文件(注意,下面的 IP 和 DNS 改成你自己的)
echo subjectAltName=IP:192.168.1.210,DNS:alun.hispatial.com >cert_extensions
4、生成CA证书(这一步的证书就可以丢到 nginx 里用的)
openssl x509 -req -sha256 -days 3650 -in server.csr -signkey server.key -extfile cert_extensions -out server.crt
或者
openssl x509 -trustout -req -sha256 -days 3650 -in server.csr -signkey server.key -extfile cert_extensions -out server.crt
5、将CA证书转为 pkcs 证书(若失败则使用第四步的 crt 证书,ArcGIS Enterpri 使用 pfx)
openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx
Nginx配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8531;
server_name 192.168.1.210;
autoindex on;
location / {
root D:\codes\webgis;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
server {
listen 8532 ssl;
server_name 192.168.1.210;
autoindex on;
ssl_certificate ./cert/server.crt;
ssl_certificate_key ./cert/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
error_page 500 502 503 504 /50x.html;
location / {
root D:\codes\webgis;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}