自建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
请登录后发表评论
注册