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”文章来源:https://www.toymoban.com/news/detail-779393.html
编辑修改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模板网!