徒手实现一个自建CA – 作者:qixingyue

自建CA 的意义:

1. 省钱,抛开 let’s encrypt 各大云厂商提供的免费证书不说,一个域名一个ssl证书的费用大致在  1000 多*** / 年 , 如果你有不少域名都需要支持 https (当然全站https 以后是必然趋势 ), 光证书这块就是一笔不少的费用了。 

2. 安全。 对于一些不需要全部用户访问的系统(比如企业邮箱,企业erp 等) ,使用自建的CA 签发的证书,就可以把自己的站点保护起来。 大众的浏览器不会有我们自建CA 的根证书,有些浏览器直接就拒绝访问了。 自建CA 的根证书也就添加了一层防护。

3. 安全+ 。对于及其敏感的系统,可以实现证书双端加密。 这样, 必须同时拥有 自建CA 根证书, 客户端证书  这两个证书才可以访问我们的应用。 

4. 方便扩展 。 系统是我们自己写的,所以,可以添加 N 多 自定义的功能,自己实现一个 ACME 协议分发 证书也未尝不可。 

5. 其他 应用。 自建CA 作为一个 企业内部安全的基础,铺开服务可以让内部的系统安全性提升一个等级。 

项目简介:

项目地址:  https://github.com/v1xingyue/wingCA 

项目使用 golang 完成代码编写。 基本实现思路介绍如下: 

1. 使用 crypto/rsa 生成 rsa 对应的公钥私钥相关功能

2. 使用 crypto/x509 生成相应的证书及其他一些文件

3. 使用cobra 完成命令的基本框架

基本使用:

1. 下载代码,并完成编译:

代码目录下包含makefile , 可以编译生成 linux mac 两个系统下的可执行文件。

2. 生成根证书:

ζ  ./wingCA init –confirm                                                                                                         [54cfc84] 

2020/06/06 17:10:17 Begin Init Root CA

2020/06/06 17:10:17 Your CA Name Info :  CN=ArkRootCA,O=Ryan Ark Center,POSTALCODE=061219,STREET=NoWhere Road 9\+3/4 Site Corner,L=Beijing,ST=Beijing,C=CN

2020/06/06 17:10:17 current crt serial number :  10001

2020/06/06 17:10:18 Your CA Root Have Been Put  ./ssl/root/rootCA.crt 

3. 使用自建CA 签发一个域名对应的证书:

ζ ./wingCA issue –type site –common a.b.ssl.com.cn –email [email protected] –ip 127.0.0.1 –ip 10.41.13.133 –site a.b.ssl.com.cn –site “*.d.ssl.com.cn” –site localhost

2020/06/06 17:12:00 Issue Site : 

 Names :  [a.b.ssl.com.cn *.d.ssl.com.cn localhost] 

ips: [127.0.0.1 10.41.13.133] 

email: [email protected] 

commonName: a.b.ssl.com.cn

2020/06/06 17:12:00 ..

2020/06/06 17:12:00 127.0.0.1 127.0.0.1

2020/06/06 17:12:00 10.41.13.133 10.41.13.133

2020/06/06 17:12:00 current crt serial number :  10002

2020/06/06 17:12:00 Issue Success !

Cert Path : ./ssl/site/a.b.ssl.com.cn.crt 

 Key Path : ./ssl/private/a.b.ssl.com.cn.key

4. 签发一对客户端证书,用来双端证书认证

ζ ./wingCA issue –type client –email [email protected] –withp12 –password super                                              [54cfc84] 

2020/06/06 17:12:45 Issue Client : 

 email :  [email protected]  common name :  xingyue

2020/06/06 17:12:45 current crt serial number :  10003

2020/06/06 17:12:45 Issue Success !

Cert Path : ./ssl/client/xingyue.crt 

 Key Path : ./ssl/private/xingyue.key

2020/06/06 17:12:45 Make p12 file 

2020/06/06 17:12:45 p12 file path :  ./ssl/p12/xingyue.p12

5. 启用一个双端认证的站点:

ζ ./wingCA sample –common a.b.ssl.com.cn –double                                                                                [54cfc84] 

2020/06/06 17:14:04 start sample site ->  a.b.ssl.com.cn  startDouble ->  true

2020/06/06 17:14:04  validate command : 

2020/06/06 17:14:04 curl -v –cert ssl/client/xingyue.crt –key ssl/private/xingyue.key https://127.0.0.1

2020/06/06 17:14:04  Start Double validate site …

6. curl 命令测试:

curl -v –cacert ssl/root/rootCA.crt  –cert ssl/client/xingyue.crt –key ssl/private/xingyue.key https://127.0.0.1

*   Trying 127.0.0.1…

* TCP_NODELAY set

* Connected to 127.0.0.1 (127.0.0.1) port 443 (#0)

* ALPN, offering h2

* ALPN, offering http/1.1

* successfully set certificate verify locations:

*   CAfile: ssl/root/rootCA.crt

  CApath: none

* TLSv1.2 (OUT), TLS handshake, Client hello (1):

* TLSv1.2 (IN), TLS handshake, Server hello (2):

* TLSv1.2 (IN), TLS handshake, Certificate (11):

* TLSv1.2 (IN), TLS handshake, Server key exchange (12):

* TLSv1.2 (IN), TLS handshake, Request CERT (13):

* TLSv1.2 (IN), TLS handshake, Server finished (14):

* TLSv1.2 (OUT), TLS handshake, Certificate (11):

* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):

* TLSv1.2 (OUT), TLS handshake, CERT verify (15):

* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):

* TLSv1.2 (OUT), TLS handshake, Finished (20):

* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):

* TLSv1.2 (IN), TLS handshake, Finished (20):

* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256

* ALPN, server accepted to use h2

* Server certificate:

*  subject: CN=a.b.ssl.com.cn@1591434720

*  start date: Jun  6 09:12:00 2020 GMT

*  expire date: Sep  4 09:12:00 2020 GMT

*  subjectAltName: host “127.0.0.1” matched cert’s IP address!

*  issuer: C=CN; ST=Beijing; L=Beijing; street=NoWhere Road 9+3/4 Site Corner; postalCode=061219; O=Ryan Ark Center; CN=ArkRootCA

*  SSL certificate verify ok.

* Using HTTP2, server supports multi-use

* Connection state changed (HTTP/2 confirmed)

* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0

* Using Stream ID: 1 (easy handle 0x7feae200c800)

> GET / HTTP/2

> Host: 127.0.0.1

> User-Agent: curl/7.64.1

> Accept: */*

* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!

< HTTP/2 200 

< content-type: text/plain; charset=utf-8

< content-length: 27

< date: Sat, 06 Jun 2020 09:16:33 GMT

* Connection #0 to host 127.0.0.1 left intact

hello double validate https* Closing connection 0

结语:

至此已完成一个自建的CA , 并完成 签发客户端 站点两种证书,并完成相应的测试。 

来源:freebuf.com 2020-06-06 17:20:00 by: qixingyue

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论