专栏首页大龄程序员的人工智能之路搭建个人国密CA(Certification Authority)

搭建个人国密CA(Certification Authority)

在SSL/TLS/HTTPS通信中,证书虽然不是TLS/SSL协议的一部分,却是HTTPS非常关键的一环,网站引入证书才能避免中间人攻击。证书涉及了很多密码学知识,理解证书后,再深入理解TLS/SSL协议,效果会更好。

在前面一篇文章《搭建国密SSL开发测试环境》中,我们制作了一个自签名证书。通常情况下,用作调试简单的客户端/服务器端通信,足够了。然而,现实世界的证书要复杂的多,涉及到CA、证书链、证书的撤销等多种场景。如果我们要实现一个完善的SSL/TLS/HTTPS就需要把这些场景考虑进去,这时仅仅靠自签名证书是不够的。

我们也可以通过CA申请证书,对于个人开发者而言,成本比较高。比如从网上找到的国密证书价格,一年好几千元到几万的都有:

国密证书参考价格

那有没有办法自己制作证书呢?答案是可以的。本文将探讨使用GmSSL制作国密证书,包括制作自签名根证书,并使用根证书签发证书。这样在开发中可以调试证书链的处理流程。

本文所使用的方法在Ubuntu 16.04上验证通过,在其它linux发行版本上,可能命令需要稍微做一些调整。关于国密SSL环境,请参考:

搭建国密SSL开发测试环境

现实世界的CA是分级管理的,层级可以有多层。本文简单起见,只模拟到三级CA管理,具体来说:

Root CA -> Server CA -> Server

Root CA为一级CA,拥有根CA证书,Server CA为二级CA,其CA证书由Root CA签发,Server为最终的用户,其证书由Server CA签发。当然,Root CA也可以直接给Server签发证书,这里是为了演示CA层级需要而做的这样的假定。

制作根CA证书

1. 生成SM2私钥:

gmssl ecparam -genkey -name sm2p256v1 -text -out rootkey.pem

根证书的私钥保存在rootkey.pem中,请妥善保存。

2. 创建证书请求:

$ gmssl req -new -key rootkey.pem -out rootreq.pem
You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [CN]:State or Province Name (full name) [Some-State]:HubeiLocality Name (eg, city) []:WuhanOrganization Name (eg, company) [Internet Widgits Pty Ltd]:mogowebOrganizational Unit Name (eg, section) []:mogowebCommon Name (e.g. server FQDN or YOUR name) []:mogoweb.comEmail Address []:mogoweb@gmail.com
Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []:

上面的命令会要求提供一些信息,因为证书是自签名证书,只用于开发测试,所以填写什么内容无关紧要。

3.创建一个 certext.ext 文本文件,内容为:

[ v3_ca ]basicConstraints = CA:true[ usr_cert ]subjectAltName = DNS:localhost

注意:相比上一篇文章,这个文件多增加了 "CA:true" 这个扩展,用于指定所签发的证书是否CA证书。

4. 生成证书:

$ gmssl x509 -req -days 365 -in rootreq.pem -signkey rootkey.pem -extfile certext.ext -extensions v3_ca -out rootcert.pemSignature oksubject=C = CN, ST = Hubei, L = Wuhan, O = mogoweb, OU = mogoweb, CN = mogoweb.com, emailAddress = mogoweb@gmail.comGetting Private key

注意:上面的命令行参数多了一个 -extensions v3_ca 参数,指定使用上面 certext.ext 文件 v3_ca 节的扩展项。

5. 将key和证书合到一个文件中

注意: 这个步骤并非必要,只是为了开发和调试方便。在实际部署时,私钥需要小心保存,绝不能和证书一起分发出去!

$ cat rootcert.pem rootkey.pem > root.pem

签发 Server CA 证书

和上面的步骤一样,这里直接把命令总结一下:

$ gmssl ecparam -genkey -name sm2p256v1 -text -out serverCAkey.pem$ gmssl req -new -key serverCAkey.pem -out serverCAreq.pem$ gmssl x509 -req -days 365 -in serverCAreq.pem -extfile certext.ext -extensions v3_ca -CA root.pem -CAkey root.pem -CAcreateserial -out serverCAcert.pem$ cat serverCAcert.pem serverCAkey.pem rootcert.pem > serverCA.pem

需要注意第三个命令多了 -CA 和 -CAkey 参数,表示使用根证书签名。因为上面的步骤中,我们把key和证书合成了一个文件,所以这两个参数值给的同一个文件。

签发 Server 证书

和上面的步骤一样,这里直接把命令总结一下:

$ gmssl ecparam -genkey -name sm2p256v1 -text -out serverkey.pem$ gmssl req -new -key serverkey.pem -out serverreq.pem$ gmssl x509 -req -days 365 -in serverreq.pem -extfile certext.ext -extensions usr_cert -CA serverCA.pem -CAkey serverCA.pem -CAcreateserial -out servercert.pem$ cat servercert.pem serverkey.pem serverCAcert.pem rootcert.pem > server.pem

注意: 第三个命令的 -extensions 给的参数值为 usr_cert ,对应的是 certext.ext 文件 usr_cert 节的扩展项,通常需要给定服务器的DNS名。

这样,生成的 server.pem 包含了根证书、Server CA证书和Server证书,包含了完整的证书链,可以投入测试使用了。

再次声明: 将key和证书打包在一起,只是为了开发和调试方便。在实际部署时,私钥需要小心保存,绝不能和证书一起分发出去!

问题

1. 自签名证书出错

-Error with certificate at depth: 0 err 18:self signed certificate

原因:CA证书的 Organization Name 值和所签发的证书的 Organization Name 值相同。

解决方法:重新制作server证书,注意其 Organization Name 值不要和Server CA证书相同。

2. 无效的CA证书

-Error with certificate at depth: 1 err 24:invalid CA certificate

原因:CA证书的 CA:true 扩展属性没加上 解决方法:重新制作root和Server CA证书,注意 CA:true 扩展属性

本文分享自微信公众号 - 云水木石(ourpoeticlife),作者:陈正勇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 啥?双证书?

    国密标准对于SSL通信定义得不是很清楚,所能依仗的标准只有《GMT 0024-2014 SSL VPN 技术规范》。在文档中提到,国密TLS需要有签名证书和加密...

    云水木石
  • 详解国密SSL ECC_SM4_SM3套件

    国密算法最好的应用场景应该是SSL/TLS通信,然而国密文档中并没有单独规范SSL/TLS协议,我们能参考的只有《GM/T 0024-2014 SSL VPN ...

    云水木石
  • 当微信小程序遇上TensorFlow:Server端实现补充

    在前面一篇文章《当微信小程序遇上TensorFlow:Server端实现》中,我们探讨了微信小程序server端的实现。今天在调试微信小程序时才发现一个问题,那...

    云水木石
  • OpenSSL - 利用OpenSSL自签证书和CA颁发证书

    Aichen
  • HTTPS静态服务搭建过程详解

    HTTPS服务对于一个前端开发者来说是一个天天打招呼的老伙计了,但是之前我跟HTTPS打交道的场景一直是抓包,自己没有亲自搭建过HTTPS服务,对HTTPS的底...

    用户1217459
  • Linux基于OpenSSL实现私有CA构建

    前言 随着互联网的迅猛发展,网络通信已经成为传递信息的主要途径。而通信时的数据传输大部分却是明 文传输的,在网络这个不安全的环境下,如果没有一套数据加密机制,就...

    小小科
  • Docker Data Center系列(五)- 使用自定义的TLS安全认证

    commonName(CN)设置为UCP(DTR)所在主机名或FQDN。也可以设置为一个泛域名(*.yourcompany.com),其它都使用默认值。

    羽客
  • H3C PKI 概述

        PKI( Public Key Infrastructure,公钥基础设施)是一个利用公开密钥理论和技术来实现并提供信息安全服务的具有通用性的安全基础设...

    py3study
  • 浅谈Openssl与私有CA搭建

    随着网络技术的发展、internet的全球化,信息共享程度被进一步提高,各种基于互联网的应用如电子政务、电子商务日益增多并愈加被人们工作和生活依赖。但是,由于...

    小小科
  • Go代码打通HTTPs

    TL;DR 手工创建CA证书链,手写代码打通HTTPs的两端 HTTPs最近是一个重要的话题,同时也是一个有点难懂的话题。所以网上有大量的HTTPs/TLS/S...

    李海彬

扫码关注云+社区

领取腾讯云代金券