NGINX自建SSL实现-单向、双向加密,中文SSL证书,吊销列表实现

Nginx_SSL

对称加密算法
对称加密算法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

非对称加密算法
非对称加密算法(RSA)是内容加密的一类算法,它有两个秘钥:公钥与私钥。公钥是公开的钥匙,所有人都可以知道,私钥是保密的,只有持有者知道。 通过公钥加密的内容,只能通过私钥解开。非对称加密算法的安全性很高,但是因为计算量庞大,比较消耗性能。

SSL证书的加密算法有哪些?

1.DES对称加密算法
	DES加密算法是1976年推出的,算是最古老的加密方法之一。DES通过将64位纯文本数据块分为两个单独的32位块,并针对每个块进行加密,从而将明文数据的64位块转换成密文。由于DES已被很多安全人员所破解,所以目前已不再被使用,2005年被正式弃用。DES最大缺点就是加密密钥长度短,暴力破解比较容易。
2.3DES加密算法
	3DES是DES算法的升级版,在上个世纪90年代后期投入使用。3DSE算法三次应用于每个数据块,使其比DES更难破解。但同DES一样,研究人员也在3DES算法中发现了严重的安全漏洞,使得美国标准技术研究院宣布在2023年后废弃3DES算法的使用。
3.AES对称加密算法
	AES是DES算法的替代方案,是最常使用的加密算法之一。与DES不同,AES是一组分组密码,由不同密钥长度和分组大小的密码组成。AES算法首先将明文数据转换为块,然后使用密钥进行加密,AES密钥长度为128、192或256位,并且用128位分组加密和解密数据,安全性要高上许多,目前广泛用于金融财务、在线交易、无线通信、数字存储等领域。
4.RSA非对称算法
	RSA是1977年发明的,是目前使用最广泛的非对称算法,其安全性建立在它所依赖的素数分解上。根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。事实证明,今天的超级计算机都很难破解RSA算法。2010年一组研究人员模拟对768位的RSA算法进行破解,发现至少需要使用超级计算机花费1500年才能破解,而目前RSA普遍使用2048位密钥,所以破解难度之大可想而知。因此,RSA算法从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
5.ECC非对称加密算法
	ECC又称椭圆曲线加密算法,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC可以使用更短的密钥来实现与RSA相同甚至更高的安全性。根据目前的研究,160位的ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。较短的密钥只需要更少的网络负载和计算能力,所以在SSL证书中使用ECC算法,可以大大减少SSL握手时间,缩短网站响应时间。
6.SM2加密算法
	SM2是我国国家密码管理局于2010年签发的一种基于椭圆曲线密码的公钥密码算法标准。SM2是ECC 256位的一种,其秘钥长度为256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。SM2的安全强度比RSA 2048位更高,且运算速度更快,所以普遍应用于CFCA等国密证书中。

SSL加密解密原理

1、客户端向服务器发起请求(Client Hello)。 
2、服务器回应客户端的请求(Server Hello),并且返回数字证书。 
4、客户端的浏览器进入数字证书认证环节,这一部分是浏览器内置的TLS完成的。 
(1)首先浏览器从内置的证书列表中索引,找到服务器下发证书对应的机构,取出该机构颁发的公钥。没有找到则不可信任。 
(2)用机构的证书公钥解密得到证书的内容和签名(内容包括网站的网址,网站的公钥等)。 
(3)浏览器生成一个随机数R,并使用网站公钥对R进行加密。 
5、浏览器将加密的R传送给服务器。 
6、服务器用自己的私钥解密得到R。 
7、服务器以R为密钥使用了对称加密算法加密网页内容并传输给浏览器。 
8、浏览器以R为密钥使用之前约定好的解密算法获取网页内容。

相关概念:

概念术语描述
KEY通常指私钥文件
CSR证书签名请求文件
CRT即证书文件(公钥)
x509一种证书格式(类型)、
对于该类证书而言,认证者是CA机构或CA机构授权的对象,
一般该类型证书以 .crt 为后缀
PEM一种证书格式(类型)、
普遍使用与apache和nginx服务器
DER一种证书格式(类型)、
普遍用于java平台和IIS服务器
CACA (Certificate Authority,证书授权) 是由认证机构服务者签发,是数字签名的技术基础保障,也是网上实体身份的证明,能够证明某一实体的身份及其公钥的合法性,证明该实体与公钥二者之间的匹配关系。
证书是公钥的载体,证书上的公钥与实体身份相绑定。一个是签名证书行的PKI机制一般为双证书机制,即一个实体应具有两个证书、两个密钥对,其中一个是加密证书,一个是签名证书,而加密证书原则上是不能用于签名的。

SSL-HTTPS请求实现

一、安装OpenSSL支持(一般情况、都已开启SSL支持-ssh服务依赖该组建):

开启OpenSSL协议支持

安装依赖-创建目录

yum -y install openssl openssl-devel
mkdir -p ~/ssl/{ca,server,client} && cd ~/ssl/ca/

NGINX编译安装时需添加该模块

  • –with-http_ssl_module 
    执行 nginx -V 可检查是否开启了ssh支持  
    

创建证书文件 三步

生成的文件说明:
    ca.key     CA机构私钥
    ca.crt     CA机构证书文件(公钥)
    host.name.key        客户端私钥(带密码、重载时会要求输入密码)
    host.name.csr        客户端SSL证书签名注册请求文件
    host.name.crt        客户端SSL证书公钥文件    ---------发给客户部署
    nopass_host.name.key 获得客户端私钥(解密后的)---------发给客户部署

单向验证模式

CA部分:
**一、创建自定义CA证书颁发机构私钥 **
ca.key
#单独生成私钥文件(可指定一些特性)
#否则可以通过 -keyout ca.key 一步执行创建公钥证书时一并创建:
#openssl req -new -x509 -keyout ~/ssl/ca/ca.key -out ~/ssl/ca/ca.crt -days 36500:

openssl genrsa -des3 -out ~/ssl/ca/ca.key 4096
#pass wdzl
#输入私钥加密密码
二、借助私钥文件创建CA公钥证书文件
ca.crt
#创建CA机构公钥证书文件便捷方式:
openssl req -new -x509 -days 36500 -key ~/ssl/ca/ca.key -out ~/ssl/ca/ca.crt -subj "/C=CN/ST=Bei Jing/L=Chao Yang/O=ZhongZhi Data communication/OU=Issuing Center/CN=Dcommunication/emailAddress=sign@zhongzhi.gov.cn"
#输入 CA 证书 私钥 密码
#通过openssl工具查看CA证书的内容 -> openssl x509 -text -noout -in ~/ssl/ca/ca.crt 
#######################################
C = CN   		#国家简写(遵循标准格式)
ST = GZ  		#省份名称(支持英字符串)
L = GY   		#市州名称(支持英字符串)
O = wdzl 		#证书机构(说明证书所属信息)
OU = xxzx		#证书管理(CA证书则描述证书机构信息)
CN = autosec.cn #此证书绑定的主机(域名或主机名或机构信息-介于通过什么方式进行访问) 
emailAddress = xxzx@autosec.cn #证书管理者的联系方式

输入案例:

#openssl req -new -x509 -days 36500 -key ~/ssl/ca/ca.key -out ~/ssl/ca/ca.crt 
#输入证书文件加密密码、输入注册内容,主要体现颁发机构信息、(CA或项目公司信息)

openssl req -new -x509 -key ~/ssl/ca/ca.key -out ~/ssl/ca/cab.crt -days 36500
Generating a RSA private key
-----
Country Name (2 letter code) [AU]:CN   #国家
State or Province Name (full name) [Some-State]:GZ  #省、州
Locality Name (eg, city) []:GY  #市、州、县
Organization Name (eg, company) [Internet Widgits Pty Ltd]:alibaba  #所属机构-CA机构证书则体现项目所属方信息,否则体现项目信息
Organizational Unit Name (eg, section) []:xxzx  #责任部门,或责任人
Common Name (e.g. server FQDN or YOUR name) []:hostname   #通过域名访问则填域名,否则填业务对应IP
Email Address []:admin@alibaba.com #联系邮箱

标准CA证书签法

CA分为根CA,二级CA,三级CA,三级CA证书由二级CA的私钥签名,二级CA证书由根CA的私钥签名,根CA是自签名的,不会给用户证书签名。

我们平时用的证书都是由二级CA或者三级CA签名的,这样就形成了一个证书链。

浏览器在验签的时侯一层层往上验证,直到用内置的根CA证书的公钥来验签成功就可以表示用户证书是合法的证书。

根证书已经内置在浏览器或者操作系统里了,在SSL握手时就不需要发根CA证书了,只需要提供中间二级三级CA证书和用户证书就可以。

# 该模块若 不采用 不理睬

# 生成根CA并自签(Common Name填RootCA)
openssl genrsa -des3 -out ~/ssl/ca/RootCA.key 2048
openssl req -new -x509 -days 3650 -key ~/ssl/ca/RootCA.key -out ~/ssl/ca/RootCA.crt

# 生成二级CA(Common Name填SecondCA)
openssl genrsa -des3 -out ~/ssl/ca/secondCA.key 2048
openssl rsa -in ~/ssl/ca/secondCA.key -out ~/ssl/ca/secondCA.key
openssl req -new -days 3650 -key ~/ssl/ca/secondCA.key -out ~/ssl/ca/secondCA.csr
openssl ca -extensions v3_ca -in ~/ssl/ca/secondCA.csr -days 3650 -out ~/ssl/ca/secondCA.crt -cert ~/ssl/ca/RootCA.crt -keyfile ~/ssl/ca/RootCA.key -subj "/C=CN/ST=Bei Jing/L=Chao Yang/O=ZhongZhi Data communication/OU=Issuing Center/CN=Dcommunication/emailAddress=sign@zhongzhi.gov.cn"

# 生成三级CA(Common Name填ThirdCA)
openssl genrsa -des3 -out ~/ssl/ca/thirdCA.key 2048
openssl rsa -in ~/ssl/ca/thirdCA.key -out ~/ssl/ca/thirdCA.key
openssl req -new -days 3650 -key ~/ssl/ca/thirdCA.key -out ~/ssl/ca/thirdCA.csr
openssl ca -extensions v3_ca -in ~/ssl/ca/thirdCA.csr -days 3650 -out ~/ssl/ca/thirdCA.crt -cert ~/ssl/ca/secondCA.crt -keyfile ~/ssl/ca/secondCA.key -subj "/C=CN/ST=Bei Jing/L=Chao Yang/O=ZhongZhi Data communication/OU=Issuing Center/CN=Dcommunication/emailAddress=sign@zhongzhi.gov.cn"

crt转pem格式
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
SERVER部分:
一、生成 Server端证书 RSA 私钥
host.name.key nopass_host.name.key
openssl genrsa -des3 -out ~/ssl/server/host.name.key 4096
#pass hserver
#按要求输入加密密码、加密长度看服务器性能,推荐使用>4096位秘钥
#该类型私钥文件应用再NGINX中间件时需输入如上密码,如若不想麻烦、需进行脱密处理再将该公钥文件进行部署

#---获得客户端私钥(解密后的)  nopass_host.name.key
openssl rsa -in ~/ssl/server/host.name.key -out ~/ssl/server/nopass_host.name.key
二、借助 RSA 私钥生成证书“签名请求”文件
host.name.csr
#openssl req -new -key ~/ssl/server/host.name.key -out ~/ssl/server/host.name.csr
#输入私钥文件加密密码
#根据具客户提报请求资料填报具体证书内容、主要体现项目信息,生成“签名请求”文件
#根据需求配置是否需要为该签名文件进行加密


#创建签名请求”文件便捷方式:
openssl req -new -key ~/ssl/server/host.name.key -out ~/ssl/server/host.name.csr -subj "/C=CN/ST=HanDong economize/L=JingZhong market/O=JingZhou Data communication/OU=Information Center/CN=hserver.com/emailAddress=jzdc@zhongzhi.gov.cn"
#输入 Server 端SSL证书 私钥 密码
#使用openssl req -text -noout -in xxzx.csr查看创建的文件

#######################################
C = CN   		#国家简写(遵循标准格式)
ST = GZ  		#省份名称(支持英字符串)
L = GY   		#市州名称(支持英字符串)
O = wdzl 		#证书机构(说明证书所属信息)
OU = xxzx		#证书管理(CA证书则描述证书机构信息)
CN = autosec.cn #此证书绑定的主机(域名或主机名或机构信息-介于通过什么方式进行访问) 
emailAddress = xxzx@autosec.cn #证书管理者的联系方式
三、调用CA证书文件、对项目证书进行签名
host.name.crt

借助CA私钥文件、CA公钥文件、客户端签名请求文件生成客户端公钥文件

openssl x509 -req -days 36500 -in ~/ssl/server/host.name.csr \
-CA ~/ssl/ca/ca.crt \
-CAkey ~/ssl/ca/ca.key \
-CAcreateserial \
-out ~/ssl/server/host.name.crt

#输入CA公钥文件 ca.crt 加密密码 Getting CA Private Key
#通过openssl工具查看CA证书的内容 -> openssl x509 -text -noout -in ~/ssl/server/host.name.crt 

**NGINX **SSL部署(单向)

NGINX SSL模块配置单向HTTPS解析将生成的SSL证书链文件部署入对应服务

mkdir -p /etc/nginx/conf.d/ssl
cp ~/ssl/server/nopass_host.name.key   ~/ssl/server/host.name.crt /etc/nginx/conf.d/ssl
server {
    listen 80;
    server_name host.name;
    return 301 https://host.name$request_uri;  #可避免请求头重写问题 但301存在post转发问题  建议更换307
}
server{
	listen       443 default ssl;
	listen       [::]:443 ipv6only=on default ssl;
    server_name  		host.name;
    ssl_certificate  	conf.d/ssl/host.name.crt;
    ssl_certificate_key     conf.d/ssl/nopass_host.name.key;
    ssl_session_cache 	shared:SSL:1m;
    ssl_protocols  		TLSv1.2 TLSv1.3;
    ssl_session_timeout 10m;
    ssl_ciphers  EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    location / {
    	....
    }
}


双向验证模式

需增加客户端认证证书文件、并在nginx配置文件内做出配置。

生成的文件说明:

host.name.client.key    客户端私钥(带密码、重载或重新导入时会要求输入密码)
host.name.client.csr    客户端SSL证书签名注册请求文件
host.name.client.crt    客户端SSL证书公钥文件
host.name.client.p12    客户端浏览器导入证书文件   ---------发给客户端浏览器部署安装导入  
服务端需要开启双向认证以及引入配置CA机构公钥文件
Client部分
一、创建 Client 端 RSA 私钥文件
host.name.client.key
openssl genrsa -des3 -out ~/ssl/client/host.name.client.key 4096
二、借助 RSA 秘钥生成客户 SSL 证书请求csr文件
host.name.client.csr
#openssl req -new -key ~/ssl/client/host.name.client.key -out ~/ssl/client/host.name.client.csr
 
#创建签名请求”文件便捷方式:
 openssl req -new -key ~/ssl/client/host.name.client.key -out ~/ssl/client/host.name.client.csr -subj "/C=CN/ST=HanDong economize/L=JingZhong market/O=JingZhou Data communication/OU=Operation and maintenance /CN=wdzl/emailAddress=wdzl@zhongzhi.gov.cn"

#######################################
C = CN   		#国家简写(遵循标准格式)
ST = GZ  		#省份名称(支持英字符串)
L = GY   		#市州名称(支持英字符串)
O = wdzl 		#证书机构(说明证书所属信息)
OU = xxzx		#证书管理(说明证书管理部门或人员)
CN = autosec.cn #此证书绑定的主机(域名或主机名或机构信息-介于通过什么方式进行访问) 
emailAddress = xxzx@autosec.cn #证书管理者的联系方式
三、用同一个服务器端的同一个 CA 机构证书及私钥文件签发客户端证书文件
host.name.client.crt
openssl x509 -req -days 30 -in ~/ssl/client/host.name.client.csr \
-CA ~/ssl/ca/ca.crt -CAkey ~/ssl/ca/ca.key -CAcreateserial \
-out ~/ssl/client/host.name.client.crt
四、证书转换、双向验证时需要在本地导入客户端的证书文件
host.name.client.p12
#因win系列浏览器一般支持的是p12格式证书、顾需进行转换
openssl pkcs12 -export -clcerts \
-in ~/ssl/client/host.name.client.crt \
-inkey ~/ssl/client/host.name.client.key \
-out ~/ssl/client/host.name.client.p12

-----------------------------##########------------------------------------
Enter pass phrase for host.name.client.key:  # #输入host.name.client.key的密码短语:qqqq
Enter Export Password:  #输入导出密码:ffff
Verifying - Enter Export Password:  #验证-输入导出密码:gggg
-----------------------------##########------------------------------------
#如上步骤会提示输入私钥,p12证书加密密码、证书加密密码可不输入,
#不配置密码时客户下载安装该证书就不提示输入密码信息,否则要求输入如上配置的密码。

#将获得的 host.name.client.crt 或 host.name.client.p12 和 host.name.client.key 下载分发之客户,导入本地证书链后在行访问对应网站
五、客户端小绿标问题
#小绿标问题-新版浏览器该方案已经失效:
#因自建证书未在对应可信机构名单内、各大操作系统无该CA机构的注册信息,无法鉴别该机构真伪,
#需要将CA的根证书转换为 p12 格式并导入本地操作系统内。
openssl pkcs12 -export -clcerts \
-in ~/ssl/ca/ca.crt \
-inkey ~/ssl/ca/ca.key \
-out ~/ssl/ca/ca.p12
#输入 ca.crt 文件加密密码
#导入方式:
	#windows系列下双击下一步完成证书安装、提示密码输入框、若配置有密码则输入密码、未配置则不输入、直接跳过
	#或点击浏览器、通过浏览器内的"证书管理"选项进行导入
	#选择将其证书存储区域为 “受信任的根证书颁发机构” 完成添加过程
	#导入完成后重新打开对应网站、弹框提示选择证书进行访问

NGINXSSL部署(双向)

mkdir -p /etc/nginx/conf.d/ssl
cp ~/ssl/server/nopass_host.name.key ~/ssl/server/host.name.crt ~/ssl/ca/ca.crt /etc/nginx/conf.d/ssl
server {
    listen 80;
	server_name host.name;
	return 301 https://host.name$request_uri;  #可避免请求头重写问题 但301存在post转发问题  建议更换307
}
server{
	listen       443 default ssl;
	listen       [::]:443 ipv6only=on default ssl;
    server_name  			localhost;
    ssl_certificate  		conf.d/ssl/host.name.crt;
    ssl_certificate_key     conf.d/ssl/nopass_host.name.key;
    
    ssl_verify_client on;           #启用双向认证
    ssl_client_certificate 	conf.d/ssl/ca.crt;  #指定双向认证的CA机构证书文件,使用ca.crt校验客户端证书,由该ca.crt签发的证书才可以通过校验
    
    ssl_session_cache 	shared:SSL:1m;
    ssl_protocols  		TLSv1.2 TLSv1.3;
    ssl_session_timeout 10m;
    ssl_ciphers  EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    

    location / {
    	....
    }
}
通过CURL验证结果:
#携带私要+CA公钥签名的证书文件请求 报错 400
curl -k -vo /dev/null https://hserver.com/index.html --resolve hserver.com:443:127.0.0.1
curl -k https://hserver.com/index.html --resolve hserver.com:443:127.0.0.1

<html-<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.24.0</center>
</body>
</html>


#携带私要+CA公钥签名的证书文件请求 响应 200
curl -k https://hserver.com/index.html --resolve hserver.com:443:127.0.0.1 --cert ~/ssl/client/host.name.client.crt --key ~/ssl/client/host.name.client.key

curl -k -vo /dev/null https://hserver.com/index.html --resolve hserver.com:443:127.0.0.1 --cert ~~/ssl/client/host.name.client.crt --key ~/ssl/client/host.name.client.key

curl -L --insecure --key ~/ssl/client/host.name.client.key --cert ~/ssl/client/host.name.client.crt hserver.com


Enter PEM pass phrase:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to ipv6 test!</title>
<style>
body {
  width: 35em;
  margin: 0 auto;
  font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this ipv6, the nginx web server is successfully installed
</p>
<p><em>Thank you for using nginx is ipv6.</em></p>
</body>
</html>

启用双向验证时:

注意调配浏览器、让其弹框提示选择使用那个证书进行验证,否则一直卡400错误

吊销列表(解除客户端授权)

一、创建吊销用户文件

涉及文件:

~/ssl/ca/ca.crt

~/ssl/ca/ca.key

~/ssl/client/host.name.client.crt

[root@www dxlb]# mkdir -p /etc/pki/CA
[root@www dxlb]# echo 00 > /etc/pki/CA/crlnumber
[root@www dxlb]# echo "" > /etc/pki/CA/index.txt

#一般由于用户私钥泄露等情况才需要吊销一个未过期的证书。(当然我们用本测试CA时其时很少用到该命令,除非专门用于测试吊销证书的情况)
#假设需要被吊销的证书文件为client.pem,则执行以下命令吊销证书:
openssl ca -revoke ~/ssl/client/host.name.client.crt -cert ~/ssl/ca/ca.crt -keyfile ~/ssl/ca/ca.key

# 生成证书吊销列表文件 CRL(ca.key + ca.crt -host.name.client.crt =  ca.crl)
# 可添加-crldays和-crlhours参数来说明下一个吊销列表将在多少天后(或多少小时候)发布。
openssl ca -gencrl -out  ~/ssl/ca/ca.crl -cert ~/ssl/ca/ca.crt -keyfile ~/ssl/ca/ca.key


# 以下命令检查client.crl的内容:
# openssl crl -in ca.crl -text -noout
# 通过下命令检查验证是否被吊销
# openssl verify -crl_check -CRLfile ~/ssl/ca/ca.crl -CAfile ~/ssl/ca/ca.crt ~/ssl/server/host.name.crt 
二、添加吊销成员配置
server {
    listen 80;
	server_name host.name;
	return 301 https://host.name$request_uri;  #可避免请求头重写问题 但301存在post转发问题  建议更换307
}
server{
	listen       443 default ssl;
	listen       [::]:443 ipv6only=on default ssl;
    server_name  			localhost;
    ssl_certificate  		conf.d/ssl/host.name.crt;
    ssl_certificate_key     conf.d/ssl/nopass_host.name.key;
    
    ssl_verify_client on;           # 启用双向认证
    ssl_client_certificate 	conf.d/ssl/ca.crt;  #指定双向认证的CA机构证书文件,使用ca.crt校验客户端证书,由该ca.crt签发的证书才可以通过校验
    ssl_crl conf.d/ssl/ca.crl;      # 启用吊销列表、指定吊销文件
    
    ssl_session_cache 	shared:SSL:1m;
    ssl_protocols  		TLSv1.2 TLSv1.3;
    ssl_session_timeout 10m;
    ssl_ciphers  EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    

    location / {
    	....
    }
}
三、重新加载NGINX配置
sudo cp ~/ssl/ca/ca.crl /etc/nginx/conf.d/ssl
# 调整配置后重载
sudo systemctl restart nginx.service 

支持中文SSL

原理:编辑openssl.cnf配置文件,修改默认值-配置中文内容,并通过iconv将其(gbk)转换(utf-8)模式

原因:默认编码格式为 ASCII 码(模式Linux 命令行及配置文件都为ASCII码),故命令行:

​ openssl req -new -key host.name.key -out host.name.csr -subj “/C=CN/ST=贵州省/L=贵阳市/O=…” 会出现乱码

若系统支付集为UTF-8时,编辑该配置文件后保存时会将其隐形转换为UTF-8模式,然后在行传递时就不会在出现乱码了。

查看系统默认字符集:

m@HomeServer:~/ssl$ cat /etc/default/locale

LANG=“zh_CN.UTF-8”
LANGUAGE=“zh_CN:zh”

编辑修改openssl.cnf如下内容:

字段描述描述(简写)
string_mask = utf8only字符类型
countryName_default国别C = CN #国家简写(遵循标准格式)
stateOrProvinceName_default中文的省份名称ST = GZ #省份名称(支持英字符串)
localityName_default中文的城市名称L = GY #市州名称(支持英字符串)
0.organizationName_default组织、公司O = wdzl #证书机构(说明证书所属信息)
organizationalUnitName_default组织机构(部门)OU = xxzx #证书管理(说明证书管理部门或人员)
commonName本证书绑定的域名或主机名CN = autosec.cn #此证书绑定的主机(介于通过什么方式进行访问)
emailAddress本证书预留的联系邮箱地址emailAddress = xxzx @ autosec.cn #证书管理者的联系方式
# 准备:
mkdir -p ~/ssl/{ca,server,client}
sudo find / -name openssl.cnf
cp /etc/ssl/openssl.cnf ~/ssl/ && cd ~/ssl/
Ca:
#一、编辑配置文件或在对应位置加入如下配置
cp ~/ssl/openssl.cnf ~/ssl/ca/ca_utf8_openssl.cnf
vim ~/ssl/ca/ca_utf8_openssl.cnf

......
[ req_distinguished_name ]
countryName                     = CN
countryName_default             = CN
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = 省份
stateOrProvinceName_default     = 汉东省

localityName                    = 地市
localityName_default            = 京州市

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = 中治数通

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = 签证中心

commonName                      = 主机名
commonName_default              = *.zhongzhi.com
commonName_max                  = 64

emailAddress                    = 邮件地址
emailAddress_default            = sig@zhongzhi.com
emailAddress_max                = 64


    
#二、转换utf-8编码   
#注意-可先通过命令查看文件编码格式:
#m@HomeServer: ca$ file ca_utf8_openssl.cnf 
#	openssl.cnf: UTF-8 Unicode text
#若已为 UTF-8 则无需在行转换
#iconv -f gbk -t utf-8 ./ca_utf8_openssl.cnf > ca.openssl_utf-8.cnf
#出现报错:iconv: 未知 10304 处的非法输入序列。
#可依次使用ISO8859 GB2312 GBK GB18030 来解决。

三、生成私钥文件
openssl genrsa -des3 -out ~/ssl/ca/ca.key 4096
#pass wdzl

四、创建证书申请文件
openssl req -new -x509 -days 36500 -utf8 -config ~/ssl/ca/ca_utf8_openssl.cnf -key ~/ssl/ca/ca.key -out ~/ssl/ca/ca.crt

#通过openssl工具查看CA证书的内容
#openssl x509 -text -noout -in ~/ssl/ca/ca.crt 
Server:
#一、编辑配置文件或在对应位置加入如下配置
cp ~/ssl/openssl.cnf  ~/ssl/server/ser_utf8_openssl.cnf
vim ~/ssl/server/ser_utf8_openssl.cnf

......
[ req_distinguished_name ]
countryName                     = CN
countryName_default             = CN
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = 省份
stateOrProvinceName_default     = 汉东省

localityName                    = 地市
localityName_default            = 京州市

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = 微数

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = 信息中心

commonName                      = 主机名
commonName_default              = *.weishu.com
commonName_max                  = 64

emailAddress                    = 邮件地址
emailAddress_default            = message@weishu.com
emailAddress_max                = 64


#二、转换utf-8编码   
#.......

三、生成私钥文件
openssl genrsa -des3 -out ~/ssl/server/host.name.key 4096
#pass host
#---获得客户端私钥(解密后的)  nopass_host.name.key
openssl rsa -in ~/ssl/server/host.name.key -out ~/ssl/server/nopass_host.name.key

四、创建证书申请文件
openssl req -new -days 3650 -utf8 -config ~/ssl/server/ser_utf8_openssl.cnf -key ~/ssl/server/host.name.key -out ~/ssl/server/host.name.csr

#通过openssl工具查看CA证书的内容
#openssl x509 -text -noout -in ~/ssl/server/host.name.crt 


五、自签名申请文件、生成CA数字证书
openssl x509 -req -days 36500 -in ~/ssl/server/host.name.csr \
-CA ~/ssl/ca/ca.crt \
-CAkey ~/ssl/ca/ca.key \
-CAcreateserial \
-out ~/ssl/server/host.name.crt
部署:
sudo cp ~/ssl/server/host.name.crt ~/ssl/server/nopass_host.name.key /etc/nginx/conf.d/ssl/
# 调整配置后重载
sudo systemctl restart nginx.service 
Client:
# 一、编辑配置文件
cp ~/ssl/openssl.cnf  ~/ssl/client/cli_utf8_openssl.cnf
vim ~/ssl/client/cli_utf8_openssl.cnf

    ......
[ req_distinguished_name ]
countryName                     = CN
countryName_default             = CN
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = 省份
stateOrProvinceName_default     = 火星

localityName                    = 地市
localityName_default            = 北半球

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = 火星北半球数通

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = 技术支撑中心

commonName                      = 主机名
commonName_default				= 运维中心
commonName_max                  = 64

emailAddress                    = 邮件地址
emailAddress_default            = OperationAndMaintenance@zhongzhi.com
emailAddress_max                = 64

    
二、转换utf-8编码   
.......

三、生成私钥文件
openssl genrsa -des3 -out ~/ssl/client/host.name.client.key 4096
#pass client
#---获得客户端私钥(解密后的)  nopass_host.name.client.key
openssl rsa -in ~/ssl/client/host.name.client.key -out ~/ssl/client/nopass_host.name.client.key

四、创建证书申请文件
openssl req -new -days 3650 -utf8 -config ~/ssl/client/cli_utf8_openssl.cnf -key ~/ssl/client/host.name.client.key -out ~/ssl/client/host.name.client.csr

#通过openssl工具查看CA证书的内容
#openssl x509 -text -noout -in ~/ssl/client/host.name.client.crt 

五、自签名申请文件、生成CA数字证书
openssl x509 -req -days 36500 -in ~/ssl/client/host.name.client.csr \
-CA ~/ssl/ca/ca.crt \
-CAkey ~/ssl/ca/ca.key \
-CAcreateserial \
-out ~/ssl/client/host.name.client.crt
部署:
sudo cp ~/ssl/ca/ca.crt ~/ssl/server/host.name.crt ~/ssl/server/nopass_host.name.key /etc/nginx/conf.d/ssl/
# 调整配置后重载
sudo systemctl restart nginx.service 
#因浏览器个人证书一般支持的是p12格式证书、需进行转换:
openssl pkcs12 -export -clcerts \
-in ~/ssl/client/host.name.client.crt \
-inkey ~/ssl/client/host.name.client.key \
-out ~/ssl/client/host.name.client.p12
  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值