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

这篇具有很好参考价值的文章主要介绍了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服务器
CA CA (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如下内容:文章来源地址https://www.toymoban.com/news/detail-779393.html

字段 描述 描述(简写)
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

到了这里,关于NGINX自建SSL实现-单向、双向加密,中文SSL证书,吊销列表实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是HTTPS加密协议?HTTPS安全传输原理,SSL和TLS介绍,NGINX如何配置SSL证书

    HTTPS是超文本传输协议(HTTP)的安全版本。它使用SSL(安全套接层)或TLS(传输层安全)加密协议来保护数据传输的安全性和机密性,以防止未经授权的访问和窃听。HTTPS协议通常用于处理敏感信息,如在线支付或登录凭证等。可以通过URL的前缀来识别一个网站是否使用了H

    2024年02月03日
    浏览(56)
  • SSL单向认证和双向认证分析

    SSL单向认证和双向认证 【ssl认证、证书】SSL双向认证和SSL单向认证的区别(示意图)

    2024年02月14日
    浏览(48)
  • gRPC — SSL/TLS单向认证、双向认证、Token认证

    传输层安全性协议(Transport Layer Security,缩写作 TLS ) ,其前身 安全套接层(Secure Sockets Layer,缩写作 SSL )是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。根据传输层安全协议的规范,客户端与服务端的连接安全应该具备连接是私密的或连接是可靠的一

    2024年04月09日
    浏览(46)
  • openssl自签名CA根证书、服务端和客户端证书生成并模拟单向/双向证书验证

    1.1 生成CA证书私钥 openssl genrsa -aes256 -out ca.key 2048 1.2 取消密钥的密码保护 openssl rsa -in ca.key -out ca.key 1.3 生成根证书签发申请文件(csr文件) openssl req -new -sha256 -key ca.key -out ca.csr -subj \\\"/C=CN/ST=FJ/L=XM/O=NONE/OU=NONE/CN=localhost/emailAddress=test@test.com\\\" 上述参数含义 req----执行证书签发命令

    2024年04月25日
    浏览(39)
  • linux自建证书搭建https(单项加密)

    搭建https有两种方式,分为单向认证和双向认证。单向认证就是传输的数据加密过了,但是不会校验客户端的来源,也就只有客户端验证服务端证书。 本次实验是搭建单向认证的https证书 1、 建立服务器私钥,生成RSA秘钥,过程中会输入密码(123456) 1.1、 创建存放ssl证书的路

    2024年02月15日
    浏览(53)
  • 基于netty框架不使用SSL证书,实现websocket数据加密传输

    1、简介 2、实现方式 3、服务端主要代码 4、客户端主要代码 5、调用方式 为什么不使用SSL证书? 1、服务器运行在专网环境,不能访问互联网。证书有有效期,CA机构规定,证书有效期最多2年。在客户的专网环境里更新和维护证书就会增加运营成本。 实现逻辑? 参照SSL的实

    2024年02月04日
    浏览(52)
  • Nginx配置ssl证书实现https安全访问

    目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件,拥有服务器与可以解析到该服务器的自己的域名。 若已安装好了Nginx,则需查看自己的Nginx是否开启了SSL的模块功能:  显示如上,则代表ssl功能已开启,否则可能出现以下错误提示: nginx: [emer

    2024年02月15日
    浏览(38)
  • Nginx实现自签名SSL证书生成与配置

    目录 一、Nginx实现自签名SSL证书生成与配置 1、名词介绍 2、生成私钥 3、生成公钥 4、生成解密的私钥key  5、签名生成证书 6、配置证书并验证 7、加密私钥的报错 1、名词介绍 ①key 私钥  = 明文--自己生成(genrsa ) ②csr 公钥  = 由私钥生成 ③crt  证书  = 公钥 + 签名(自签

    2024年02月15日
    浏览(50)
  • SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

    HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。 不验证通信方的身份,因此有可能会遭遇伪装。 无法证明报文的完整性,所以有可能会遭篡改等。 因HTTP有存在通信

    2024年02月06日
    浏览(59)
  • Linux nginx实现访问,配置ssl证书实现https访问

    注意:服务器需要开通80端口 (1)alias: alias指定的路径是location的别名,不管location的值怎么写,资源的 真实路径都是 alias 指定的路径 例如:同样请求 http://xxx.com/upload/top.gif 时,在服务器查找的资源路径是: /www/wwwroot/upload/top.gif (2)root:真实的路径是root指定的值加上

    2024年02月01日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包