Centos7使用OpenSSL搭建CA服务器并颁发ssl证书

在网上经常看到自建CA和自签证书文档,但是发现自己生成之后,将ca证书导入客户端之后,Chrome访问网站总是会出现如下错误:
NET::ERR_CERT_COMMON_NAME_INVALID
此服务器无法证实它就是 domain.com - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。一直以为是Chrome浏览器安全强度太高导致的,因为发现Firefox和IE没有这个问题,但是后来才发现自签证书有缺陷。

现写出这篇文章,留作记录。

亲测有效

一、安装依赖

利用 OpenSSL 签发自然是需要 OpenSSL 软件及库,一般情况下 CentOS、Ubuntu 等系统均已内置,可执行 openssl 确认,如果出现 oepnssl: command not found 说明没有内置,需要手动安装,以 CentOS 为例,安装命令如下:

[root@CA ~]# yum install -y openssl openssl-devel
  • 备份openssl.cnf
[root@CA ~]# cd /etc/pki/tls/

[root@CA ~]# cp openssl.cnf openssl.cnf.back

1.1、修改openssl.cnf配置文件

[root@CA ~]# vim /etc/pki/tls/openssl.cnf

dir = /etc/pki/CA

basicConstraints=CA:FALSE   # 把FALSE改成TRUE 把本机变成CA认证中心

1.2、创建相关的文件

[root@CA ~]# cd /etc/pki/CA
[root@CA ~]# mkdir certs newcerts crl
[root@CA ~]# touch index.txt
[root@CA ~]# echo 01 > serial

二、自建CA

2.1 生成根密钥

[root@CA ~]# (umask 077; openssl genrsa -out private/cakey.pem 2048)

2.2 生成根CA证书

[root@CA ~]# openssl req -x509 -new -key private/cakey.pem -out cacert.pem -days 3650

三、颁发证书

3.1 创建证书请求

#先为网站生成一对密钥
[root@web ~]# (umask 077; openssl genrsa -out http.key 2048 )
#生成证书颁发请求.csr
[root@web ~]# openssl req -new -key http.key -out http.csr
#将此请求文件(http.csr)传递给CA服务器

3.2 附加用途(重要)

这一步骤可以解决Chrome不能识别证书通用名称NET::ERR_CERT_COMMON_NAME_INVALID错误

[root@CA ~]# vim http.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
IP.1=192.168.1.1
IP.2=192.168.1.2

与签发域名证书的区别(也是与其他教程的区别)就在于此步骤,在 不改 openssl.cnf 的情况 (方便签发不同证书)下如果是要签发 IP 证书必须参照上述格式执行此步骤。

如果是域名证书,也可以在此可以添加多域名,如:

[root@CA ~]# vim http.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName

[ SubjectAlternativeName ]
DNS.1=test.com
DNS.2=www.test.com

extendedKeyUsage 可以指定证书目的,即用途,一般有:
serverAuth:保证远程计算机的身份
clientAuth:向远程计算机证明你的身份
codeSigning:确保软件来自软件发布者,保护软件在发行后不被更改
emailProtection:保护电子邮件消息
timeStamping:允许用当前时间签名数据
ikeIntermediate:允许 Internet 上的安全通信(OpenVPN)
如果不指定,则默认为 所有应用程序策略

3.3 签发证书

CA服务器签署颁发此证书

[root@CA ~]# openssl ca -in http.csr -out http.crt -days [number]

或者

[root@CA ~]# openssl x509 -req -days 365 -in http.csr -signkey http.key -out http.crt

或者(需要事前定义好http.ext中的内容,该操作Chrome不会报错)

[root@CA ~]# openssl x509 -req -in http.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out http.crt -days 3650 -sha256 -extfile http.ext

CA服务器再将签署好的证书发送给客户端

四、问题排查

1.问题:TXT_DB error number 2
解决:原因是已经生成了同名证书,将 common name 设置成不同,或修改 CA 下的 index.txt.attr,将 unique_subject = yes 改为 unique_subject = no

五、一些实用技巧

1.crt证书转pfx:

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt

声明:
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:service@starryfrp.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明

给TA打赏
共{{data.count}}人
人已打赏
PHP学习笔记学习笔记

PHP队列的实现

2021-12-27 13:04:15

学习笔记

Ubuntu20.04 LTS下Minecraft纯净服开服流程

2022-2-15 22:08:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索