在网上经常看到自建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 证书必须参照上述格式执行此步骤。
如果要通过 修改 openssl.cnf 来签发证书,除将上述配置直接改到 openssl.cnf 相应位置外,必须将配置中的 basicConstraints = CA:FLASE 改为 basicConstraints = CA:TRUE,否则修改不生效,这是其他教程没有提到的。
如果是域名证书,也可以在此可以添加多域名,如:
[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.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明。