使用openSSL和nginx搭建本地https服务
一.写在前面的话
这里在主要介绍在本地环境下,搭建https的过程,关于https的相关理论,可以参考我上一篇博客:
Https原理解析及详细推演过程。
这里主要先明确几个概念:
- SSL/TSL: SSL 的英文全称是 “Secure Sockets Layer” ,中文名为 “ 安全套接层协议层 ” ,它是网景( Netscape )公司提出的基于 WEB 应用的安全协议。 SSL 协议指定了一种在应用程序协议(如 HTTP 、 Telenet 、 NMTP 和 FTP 等)和 TCP/IP 协议之间提供数据安全性分层的机制,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。 TSL的英文全称是“Transport Layer Security”,中文名为 “ 传输层安全性协议 ” ,在1996年,由Netscape和Paul Kocher共同设计的版本SSL 3.0协议发布。SSL 3.0协议获得互联网广泛认可和支持,因特网工程任务组(IETF)接手负责该协议,并将其重命名为传输层安全(TLS)协议。TLS协议的第一个版本(RFC 2246)于1999年1月发布,实质上就是SSL 3.0协议的适度改进版。虽然TLS协议和SSL协议是同一个协议的迭代升级,但是其重命名后在名称上造成的混淆一直延续到今天,业内通常将二者统称为SSL/TLS协议。
- CSR:CSR的英文全称是“Certificate Signing Request”,是一个证书签名请求,是客户的服务器软件所生成的一串文本字符。客户在注册的过程中首先要在WEB服务器上生成CSR,并把这串字符提供给证书认证中心。CSR中包括国家、省份、城市、组织名称、部门、域名、邮箱等信息,它还不是一个证书,知识一个整数签名的请求文件。
- CRT:CRT是英文单词Certificate的缩写,即生成的真实的整数;
- KEY:指利用des3等对称加密算法生成的私钥;
- X509:由国际电信联盟(ITU-T)制定的数字证书标准
- OpenSSL:是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
二、实验过程
1.实验环境及物料
win10 操作系统、Win64 OpenSSL v1.1.1i、VMware、centos 7.x、 nginx;
2.证书中的信息说明
- Country Name (2 letter code) [AU]:CN #请求签署人的国家
- State or Province Name (full name) [Some-State]:Shandong:#请求签署人的省份
- Locality Name (eg, city) []:Jining:#请求签署人的城市名字
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:91donkey :#请求签署人的公司名字
- Organization Name (eg, company)[Default Company Ltd]:#请求签署人的公司名字
- Organizational Unit Name (eg, section) []:jishubu:#请求签署人的部门名字
- Common Name (e.g. server FQDN or YOUR name) []:donkey.com:#这里一般填写请求人的服务器域名
3.Win64 OpenSSL v1.1.1i下载
下载地址:http://slproweb.com/products/Win32OpenSSL.html
下载到本地,然后按照提示,直接傻瓜式安装就行,这里我就不再演示了,我在本机的安装位置:
C:\Program Files\OpenSSL-Win64
4.OpenSSL自建服务端证书请求
进入OpenSSL的安装目录中的bin目录:找到OpenSSL.exe,通过这个可执行文件来进行下面一系列的操作。
1.生成服务端私钥
openssl.exe genrsa -des3 -out d:/study/openssl/server.key 2048
注意这个过程中要输入密码,执行完成后,我们看到目录中生成了server,key这个文件.
2.由私钥生成待签名证书
利用上一步生成的server.key生成待签名证书,即证书生成请求,CSR文件。
openssl.exe req -new -key d:/study/openssl/server.key -out d:/study/openssl/pub.csr
这个中间需要输入在第一步中设置的密码,然后填写证书请求信息。执行完成后,我们看到输出目录中出现pub.csr文件。
3.查看CSR文件中的信息
openssl.exe req -text -in d:/study/openssl/pub.csr
5.OpenSSL自建CA根证书
我们用的操作系统(windows,linux,unix,android,ios等)都预置了很多信任的根证书,比如VeriSign根证书,那么浏览器在访问服务端的时候,SSL协议握手时服务器就会把它的服务器证书发给用户浏览器,而这本服务器证书又比如说是VeriSign颁发的,自然就能验证通过。
win10系统里要查看证书,右键工具栏左下角windows图标,选择“运行”,然后输入certmgr.msc,回车,这时就会弹出一个窗口就可以查看到了,如下图所示:
1.创建CA私钥
openssl.exe genrsa -out d:/study/openssl/ca.key 2048
执行完成后,输出目录中生成ca.key这个文件。
2.生成CA待签名证书
openssl.exe req -new -key d:/study/openssl/ca.key -out d:/study/openssl/ca.csr
执行完成后,输出目录会出现ca.csr文件。
3.生成CA根证书
openssl.exe x509 -req -in d:/study/openssl/ca.csr -extensions v3_ca -signkey d:/study/openssl/ca.key -out d:/study/openssl/ca.crt
执行完成后,输出目录中生成ca.crt文件。
6.OpenSSL生成服务端证书
openssl.exe x509 -days 365 -req -in d:/study/openssl/pub.csr -extensions v3_req -CAkey d:/study/openssl/ca.key -CA d:/study/openssl/ca.crt -CAcreateserial -out d:/study/openssl/server.crt
执行完成后,输出目录中生成了server.crt证书文件。
证书制作完毕。
7.nginx中配置证书
nginx的搭建过程,我这里就不再详细说明了,不清楚的小伙伴,可以参考我之前的博客:
Nginx搭建静态资源Web服务器。
1.Nginx开启SSL模块
在我第一次配置好启动nginx的时候,启动不了,抛出错误如下:
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上–with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,这里做个简单说明。
- 切换到源码包:
cd /soft/nginx-1.18.0/src
- configure 生成新的配置信息:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
- 执行make命令
运行上面的命令即可,配置完成后,运行命令:
make
这里不要进行make install,否则就是覆盖安装。
- 备份原有已安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
- 覆盖掉原有的nginx
然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
cp ./objs/nginx /usr/local/nginx/sbin/
这样https模块就暗转更好了。
2.上传证书文件到服务器
将server.key和sever.crt文件上传的本地虚拟中的linux服务器上,这里我直接放到
/usr/local/openssl
3.在nginx上配置证书文件
nginx上开启443端口,同时配置证书地址:
# HTTPS server
#
server {
listen 443 ssl;
server_name 51donkey.com;
ssl_certificate /usr/local/openssl/server.crt;
ssl_certificate_key /usr/local/openssl/server.key
location / {
alias html/;
autoindex on;
set $limit_rate 2m;
}
4.启动nginx
./sbin/nginx
这时候需要输入密码,就是我们最开始输入的密码。这样nginx就配置完成了。
如果不想输入密码,我们可以用OpenSSL下面的命令:
openssl.exe rsa -in d:/study/openssl/server.key -out d:/study/openssl/unsecure-server.key
输出目录中生成了unsecure-server.key,把这个key上传的服务器,然后将nginx配置中
ssl_certificate_key /usr/local/openssl/server.key
改为
ssl_certificate_key /usr/local/openssl/unsecure-server.key
到此为止,nginx就配置完成了。
我们先访问下看看:
我在本地设置了host:
192.168.15.31 51donkey.com
http://51donkey.com/
https://51donkey.com/
当访问https的时候,出现如下:
本地浏览器直接阻止了。我点击高级,虽然站点也能访问,但是查看证书时,
下面我就要在本机将自制的CA证书加入到可信任根证书。
5.自制的CA证书加入到可信任根证书
双击本地生成的ca.crt证书文件:
点击安装证书,安装到“受信任的根证书颁发机构”
这样就可以了。