03-OpenSSL-创建带SAN扩展的证书并进行CA自签

发布于:2022-11-11 ⋅ 阅读:(1230) ⋅ 点赞:(1)

在第一节中我们知道了HTTPS为什么需要证书,以及证书的作用。那么这一节对证书的细节展开更加深入的研究。

一、HTTPS证书申请原理

1、制作CSR文件
所谓CSR就是由申请人制作的_Certificate Secure Request_证书请求文件。制作过程中,系统会产生2个密钥,一个是公钥就是这个CSR文件,另外一个是私钥,存放在服务器上。要制作CSR文件,申请人可以参考WEB SERVER的文档,一般APACHE等,使用OPENssl命令行来生成KEY+CSR2个文件,Tomcat,JBoss,Resin等使用KEYTOOL来生成JKS和CSR文件,IIS通过向导建立一个挂起的请求和一个CSR文件。

2、CA认证
将CSR提交给CA,CA一般有2种认证方式:
1)域名认证:一般通过对管理员邮箱认证的方式,这种方式认证速度快,但是签发的证书中没有企业的名称;
2)企业文档认证:需要提供企业的营业执照。
也有需要同时认证以上2种方式的证书,叫EV ssl证书,这种证书可以使IE7以上的浏览器地址栏变成绿色,所以认证也最严格。

二、华为云SSL 证书申请流程

image.png

  1. 登录管理控制台。
  2. 单击页面左上方的,选择“安全与合规 > 云证书管理服务”,进入云证书管理界面CCM。
  3. 在左侧导航栏选择“SSL证书管理”,进入SSL证书管理页面。
  4. 在证书列表左上角,单击
    “创建测试证书”
    ,进入创建测试证书对话框界面。
    “创建测试证书”按钮处显示的数字表示测试证书剩余可创建数量和可累计创建总数量。例如数字显示为“13/20”,表示剩余可创建13张测试证书,可累计创建20张测试证书。
    image.png
    image.png
  5. 阅读并勾选“我已阅读并同意《云证书管理服务(CCM)免责声明》”,单击“确认”。
  6. 您在SSL证书列表中可查看到创建成功的免费测试证书。
    image.png

三、自签名证书

3.1、创建根证书

(1)创建根证书私钥

openssl genrsa -out root.key 1024

(2)创建根证书请求文件:

openssl req -new -out root.csr -key root.key

后续参数请自行填写,下面是一个例子:

Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:wh
Locality Name (eg, city) [Default City]:wh
Organization Name (eg, company) [Default Company Ltd]:huawei
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your servers hostname) []:root
Email Address []:a.huawei.com
A challenge password []:
An optional company name []:

(3)创建根证书

openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

在创建证书请求文件的时候需要注意三点,下面生成服务器请求文件和客户端请求文件均要注意这三点:

  • 根证书的Common Name填写root就可以,所有客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样;
  • 其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
  • 最后的密码可以直接回车跳过。

image.png
经过上面三个命令行,我们最终可以得到一个签名有效期为10年的根证书root.crt,后面我们可以用这个根证书去颁发服务器证书和客户端证书。

3.2、 生成自签名服务器端证书

(1)生成服务器端证书私钥

openssl genrsa -out server.key 1024

(2) 生成服务器证书请求文件,过程和注意事项参考根证书,本节不详述:

openssl req -new -out server.csr -key server.key

(3) 生成服务器端公钥证书

openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

经过上面的三个命令,我们得到:
server.key:服务器端的密钥文件 server.crt:有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成

四、证书验证过程原理

如下图图所示,为数字证书签发和验证流程:
![](https://img-blog.csdnimg.cn/img_convert/6f4bd249ab005dc9cae394da2b7bc26a.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u4f0d99c6&margin=[object Object]&originHeight=598&originWidth=1080&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=u2fd88b98-3e64-44cb-a163-5ea2e1e113e&title=)
当服务端向 CA 机构申请证书的时候,CA 签发证书的过程,如上图左边部分:

  • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
  • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
  • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

  • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
  • 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。

五、证书链

但事实上,证书的验证过程中还存在一个证书信任链的问题,因为我们向 CA 申请的证书一般不是根证书签发的,而是由中间证书签发的,比如百度的证书,从下图你可以看到,证书的层级有三级:
image.png
对于这种三级层级关系的证书的验证过程如下:

  • 客户端收到 http://baidu.com 的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证 http://baidu.com 证书是否可信。于是,客户端根据 http://baidu.com 证书中的签发者,找到该证书的颁发机构是 “GlobalSign Organization Validation CA - SHA256 - G2”,然后向 CA 请求该中间证书。
  • 请求到证书后发现 “GlobalSign Organization Validation CA - SHA256 - G2” 证书是由 “GlobalSign Root CA” 签发的,由于 “GlobalSign Root CA” 没有再上级签发机构,说明它是根证书,也就是自签证书。应用软件会检查此证书有否已预载于根证书清单上,如果有,则可以利用根证书中的公钥去验证 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,如果发现验证通过,就认为该中间证书是可信的。
  • “GlobalSign Organization Validation CA - SHA256 - G2” 证书被信任后,可以使用 “GlobalSign Organization Validation CA - SHA256 - G2” 证书中的公钥去验证 http://baidu.com 证书的可信性,如果验证通过,就可以信任 http://baidu.com 证书。

在这四个步骤中,最开始客户端只信任根证书 GlobalSign Root CA 证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而 “GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任 http://baidu.com 证书,于是客户端也信任 http://baidu.com 证书。总括来说,由于用户信任 GlobalSign,所以由 GlobalSign 所担保的 http://baidu.com 可以被信任,另外由于用户信任操作系统或浏览器的软件商,所以由软件商预载了根证书的 GlobalSign 都可被信任。
![](https://img-blog.csdnimg.cn/img_convert/66005ea8b98fcda7196f58e73fca29dd.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u7c374408&margin=[object Object]&originHeight=891&originWidth=707&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=udb4dbdfe-8a71-4311-82b6-1b34ac46020&title=)img
操作系统里一般都会内置一些根证书,比如我的 MAC 电脑里内置的根证书有这么多:
![](https://img-blog.csdnimg.cn/img_convert/eef247d93eaf0b14c3a0eb0481726dbb.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u533de7bb&margin=[object Object]&originHeight=534&originWidth=867&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=uadf6e4b6-2eab-4165-955e-e46ee6a7f19&title=)
这样的一层层地验证就构成了一条信任链路,整个证书信任链验证流程如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/51593bb9b25fc838de34902c9afb744f.jpeg#clientId=ueb3ace0d-56fa-4&crop=0&crop=0&crop=1&crop=1&errorMessage=unknown error&from=paste&id=u4ee1a9cf&margin=[object Object]&originHeight=330&originWidth=1080&originalType=url&ratio=1&rotation=0&showTitle=false&status=error&style=none&taskId=u3b87fb02-fb5f-4451-8559-b6f3dd57459&title=)
如果你的电脑中毒了,被恶意导入了中间人的根证书,那么在验证中间人的证书的时候,由于你操作系统信任了中间人的根证书,那么等同于中间人的证书是合法的。
这种情况下,浏览器是不会弹出证书存在问题的风险提醒的。
这其实也不关 HTTPS 的事情,是你电脑中毒了才导致 HTTPS 数据被中间人劫持的。
所以,HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全。

更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》## 一、问题描述
小编之前提供的利用OpenSSL创建自签名证书的方法在chrome上再次遇到了证书无效的错误:
image.png
原因概述Chrome浏览器要求证书中必须包含“Subject Alternative Names”这一参数。SAN
关于这个参数的解释:

二、什么是 SAN

SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
来看看百度的证书,百度证书的扩展域名有这么多,其中还有了*.hao123.com,那我们再看看www.hao123.com的证书
![](https://img-blog.csdnimg.cn/img_convert/8ffb0066371031078d7f0ec1568757e0.webp?x-oss-process=image/format,png#clientId=u15884bc1-b34f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u2c7afe0f&margin=[object Object]&originHeight=476&originWidth=409&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=uc99c6aaa-2dd3-473a-a5c8-214397740ea&title=)
发现的确是用的前面的百度证书
![](https://img-blog.csdnimg.cn/img_convert/7d37c4b1833fb76c7f08cd2713662b36.webp?x-oss-process=image/format,png#clientId=u15884bc1-b34f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u940145e7&margin=[object Object]&originHeight=756&originWidth=643&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ua97e0c3f-f865-47df-ac1e-1181b3ab657&title=)
所以SAN带来的好处就可以看出来了,一个证书可以用在各种不同的域名下,不需要一个域名买一个证书了。

三、利用OpenSSL创建证书

因为是本地环境,直接用OpenSSL给自己颁发一个CA根证书用于后面给服务器做CA签署。

  1. 生成CA密钥
openssl genrsa -des3 -out ca.key 2048
  1. 生成CA根证书
openssl req -sha256 -new -x509 -days 365 -key ca.key -out ca.crt \
    -subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=testRoot"
  1. 生成服务器密钥
openssl genrsa -des3 -out server.key 2048
  1. 生成服务器证书请求文件
openssl req -new \
    -sha256 \
    -key server.key \
    -subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=huanghe.com" \
    -reqexts SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=DNS:*.huanghe.com,DNS:*.baidu.com")) \
    -out server.csr
  1. CA签署服务器证书;如下出现问题可以参考:
openssl ca -in server.csr \
        -md sha256 \
        -keyfile ca.key \
    -cert ca.crt \
    -extensions SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=DNS:*.huanghe.com,DNS:*.baidu.com")) \
    -out server.crt

之后把生成好的服务器证书和服务器密钥在服务器(ngnix,tomcat)里配置好,并且把ca.crt证书导入到浏览器的受信任的根证书颁发机构里,在浏览器访问就不会有红叉叉了。关于chrome中导入自签名证书:
【chrome】安装证书并配置为受信任网站连接(windows)
参考文章:
![](https://img-blog.csdnimg.cn/img_convert/a1fbd30e645fca86f20d5ec522f14d86.webp?x-oss-process=image/format,png#clientId=u15884bc1-b34f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u40fd2ef8&margin=[object Object]&originHeight=486&originWidth=419&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ud95a2c98-93ee-4eb2-b52b-4c45b1cd380&title=)
![](https://img-blog.csdnimg.cn/img_convert/13af2248162c95fa900907c6bcd0331e.webp?x-oss-process=image/format,png#clientId=u15884bc1-b34f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ub340c4d5&margin=[object Object]&originHeight=486&originWidth=419&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u9f1b58a9-1fcc-4244-b669-f856006ee6c&title=)

注意事项

  1. -subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=testRoot"这行可以不要,会有命令交互填写相关信息。

![](https://img-blog.csdnimg.cn/img_convert/decec5230e95a2082041a3265e4737da.webp?x-oss-process=image/format,png#clientId=u15884bc1-b34f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u9d991982&margin=[object Object]&originHeight=233&originWidth=730&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u32ba3886-4ac4-48bd-9a10-4e67ec0c2e2&title=)

  • 哈希算法不要使用sha1,因为Chrome浏览器下会提示不安全,上面都是用的sha256。
  • /etc/pki/tls/openssl.cnf文件是缺省的OpenSSL配置文件,可能环境不同路径也不同。
  • 服务器证书请求文件的国家,省,市要和CA证书一致,这个在openssl.cnf默认配置中指定了,可以修改。

解决方案
修改待用的openssl配置文件

  1. 拷贝openssl配置文件以备修改
cp /etc/pki/tls/openssl.cnf /tmp/ 

2 修改这一openssl.cnf文件
(1) 找到[ req ] 段落,添加如下配置:

 req_extentions = v3_req

image.png
(2) 添加v3_req配置信息

[ v3_req ]
# Extensions to add to a certificate request
# basicConstraints = CA:FALSE
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

(3) 添加alt_names配置信息

[ alt_names ]
DNS.1 = www.huanghe.com

注:这里填入的即为Subject Alternative Names的域名名称

创建证书

  1. 创建crt格式的自签名证书
openssl req -sha256 -newkey rsa:2048 -nodes -keyout  root.key -x509 -days 3650 -out  root.crt -config /tmp/openssl.cnf -extensions v3_req

# 填写的信息如下:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Wuhan
Locality Name (eg, city) [Default City]:Wuhan
Organization Name (eg, company) [Default Company Ltd]:huawei
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:www.huanghe.com
Email Address []:huanghe39@huawei.com

得到 root.key 私钥文件 和 root.crt 证书文件

  1. 创建服务端证书

更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》> 更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到