网络知识详解之:CA证书制作实战
计算机网络相关知识体系详解
- 网络知识详解之:TCP连接原理详解
 - 网络知识详解之:HTTP协议基础
 - 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)
 - 网络知识详解之:CA证书制作实战(Nginx数字证书实战)
 - 网络知识详解之:网络攻击与安全防护
文章目录
- 网络知识详解之:CA证书制作实战
 - 需求
 - OpenSSL
 - 过程
 - 颁发证书
 - (1) 修改配置
 - (2) 生成根密钥
 - (3)生成根证书
 - (4) 为我们的Nginx服务器生成SSL密钥
 - (5)为nginx生成证书签署请求
 - (6) 私有CA根据请求来签署证书
 
- 使用 SSL证书
 - (1) Nginx 使用 SSL 证书
 - (2) 启动Nginx
 - (3) 访问测试
 - (4) 添加证书
 - (5)访问测试
 
 
需求
自建CA 颁发证书
使用自签名证书来构建安全网络,所谓自签名证书,就是自己扮演 CA 机构,自己给自己的服务器颁发证书。
OpenSSL

OpenSSL是一个以C语言编写现了SSL与TLS协议的开源的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。OpenSSL支持Linux、Windows、BSD(Unix的衍生系统)、Mac等平台,这使得OpenSSL具有广泛的适用性。
OpenSSL整个软件包大概可以分成三个主要的功能部分:
- 加密算法库 
  
- 对称加密算法:
 - 非对称加密算法
 - 信息摘要算法
 
 - SSL协议库 
  
- OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协
议 - OpenSSL也实现了TLSv1.0+
 
 - OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协
 - 应用程序 
  
- 多功能的命令行工具,可以实现加密解密、密钥生成、密钥和证书管理、自建CA和签名等功能
 
 
过程
- CA生成根密钥
 - CA生成根证书
 - Nginx生成私钥
 - Nginx申请证书
 - CA签发
 - Nginx安装证书,配置
 
颁发证书
默认情况下Linux操作系统已经内置安装了OpenSSL,可以通过 openssl version 查看版本号

但是在使用前,需要注意下当前OpenSSL的库的版本,因为版本1.0.1是一个很重要的风水岭版本,1.0.1是第一个支持TLS1.1和1.2的版本。
(1) 修改配置
在CA目录下创建两个初始文件,维护序列号。通过CA机构签发的每个证书都有一个唯一的序列号。
cd /etc/pki/CA
touch index.txt serial
echo 01 > serial
 
(2) 生成根密钥
表示的CA机构的私钥,CA结构签发的每一个证书都要通过自己的私钥进行签名
cd /etc/pki/CA
#生成一个2048位的密钥
openssl genrsa -out private/cakey.pem 2048
 

(3)生成根证书
使用req命令生成自签证书
- -new:表示新的申请
 - -x509:表示生成自签证书
 - -key:指定私钥文件
 - -out:保存证书的位置
 - -days:指定证书期限
 
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
 
会提示输入一些内容,因为是私有的,所以可以随便输入(之前修改的openssl.cnf会在这里呈现),最好记住能与后面保持一致。上面的自签证书cacert.pem 应该生成在 /etc/pki/CA 下。

(4) 为我们的Nginx服务器生成SSL密钥
申请SSL证书本质上就是服务器升级支持HTTPS,非对称加密(公钥和私钥)。
以上都是在CA服务器上做的操作,而且只需进行一次,现在转到nginx服务器上执行:
安装Nginx
#1.安装该rpm
rpm -ivh
http://nginx.org/packages/centos/7/noarch/RPMS/nginx-releasecentos-7-0.el7.ngx.noarch.rpm
#安装该rpm后,我们就能在/etc/yum.repos.d/ 目录中看到一个名为
nginx.repo 的文件。
#2.安装完Nginx源后,就可以正式安装Nginx了。
yum install -y nginx
#3.查看所在目录
whereis nginx
 
cd ./nginx-1.17.8/
# 创建一个ssl的新目录
mkdir ssl
cd ssl
#为我们的nginx web服务器生成ssl密钥
openssl genrsa -out nginx.key 2048
 
(5)为nginx生成证书签署请求
该过程会生成一个文件,包含了证书相关的信息,但是该文件不是证书,生成证书的请求文件。
该文件需要发送给CA机构,由CA签名后生成一个证书文件。
openssl req -new -key nginx.key -out nginx.csr
...
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:SZ
Organization Name (eg, company) [Internet Widgits Pty
Ltd]:COMPANY
Organizational Unit Name (eg, section) []:IT_SECTION
Common Name (e.g. server FQDN or YOUR name)
[]:your.domain.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...
 
同样会提示输入一些内容,其它随便,除了 Commone Name 一定要是你要授予证书的服务器域名或主机名,challenge password不填。

(6) 私有CA根据请求来签署证书
接下来要把上一步生成的证书请求csr文件,发到CA服务器上,在CA上执行:
openssl ca -in nginx.csr -out nginx.crt
 


上面三个文件中,nginx.crt表示证书,nginx.csr表示请求文件,nginx.key表示私钥
上面签发过程其实默认使用了 -cert cacert.pem -keyfile cakey.pem ,这两个文件就是前两步生成的位于 /etc/pki/CA 下的根密钥和根证书。将生成的crt证书发回nginx服务器使用。
到此我们已经拥有了建立SSL安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,剩下的是如何使用证书的问题。
使用 SSL证书
(1) Nginx 使用 SSL 证书
在本地安装完成证书(在Nginx服务器配置)也就意味着Java Web应用已经完成了从http到https协议的升级
以 Nginx 为例,在 Nginx 中新建ssl文件夹,将生成的crt和key放入其中,配置文件中加入以下代码:
#修改Nginx的配置文件,安装SSL证书
cd /etc/nginx/conf.d
vi default.conf
listen 443 ssl http2;#https协议监听的端口号是443端口,基于http2进行工作的。
ssl_certificate /etc/nginx/ssl/nginx.crt; # 指向 ssl文件夹中的 crt 文件
ssl_certificate_key /etc/nginx/ssl/nginx.key; # 指向ssl 文件夹中的 key 文件
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 
实际的配置文件如下:
default.conf
server {
    listen       80;
    server_name  localhost;
		
	listen 443 ssl http2;	
	ssl_certificate /opt/lagou/servers/nginx-1.17.8/ssl/nginx.crt; 
	ssl_certificate_key /opt/lagou/servers/nginx-1.17.8/ssl/nginx.key; 
	ssl_session_timeout 5m;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        root   html;
        index  index.html index.htm;
    }
    #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;
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
 
(2) 启动Nginx
#切换到可执行目录
cd /usr/sbin/
./nginx
#查看启动状态
ps -ef|grep nginx
 

(3) 访问测试
curl https://192.168.80.121
 
但是,我们自己签发的证书,是不受其他服务器信任的,当发起 curl 请求时,会出现以下情况:证书无效或无法验证错误。

这时候,我们就需要将我们 CA 服务器的根证书导入到这台服务器中。
(4) 添加证书
#安装 ca-certificates package:
yum install ca-certificates
#启用dynamic CA configuration feature:
update-ca-trust force-enable
#将证书文件放到 /etc/pki/ca-trust/source/anchors/ 目录下
mv /etc/pki/CA/cacert.pem /etc/pki/ca-trust/source/anchors/
#执行更新:
update-ca-trust extract
 
(5)访问测试
curl https://192.168.80.121
 
可以看到,通过上述配置后,已经可以成功访问nginx了,说明我们利用CA数字证书进行网络通信的方式测试成功!

![[Lua实战]整理Lua中忽略的问题](https://img-blog.csdnimg.cn/720df27435104c098057007dd895507e.png)














![[Lua实战]Skynet-1.如何启动(linux环境启动)[开箱可用]](https://img-blog.csdnimg.cn/9ba41846f0a84d89ac5449bed97b462c.png)


