cfssl(Certificate Signing and Fabrication Facility)是一个用于生成和管理 X.509 证书的开源工具。它由 Cloudflare 开发,并已成为 Kubernetes 和 Docker 等项目的标准工具。
实验准备:
cfssl工具(https://github.com/cloudflare/cfssl/releases) 发布地址
下载三个东西:
cfssl_<版本>_linux_amd64
cfssl-certinfo_<版本>_linux_amd64
cfssljson_<版本>_linux_amd64
本次使用1.6.5版本演示
安装cfssl
将实验准备的三个文件(我下载到了/tmp/cfssl目录中)移动到系统路径
cd /tmp/cfssl
chmod 755 cfssl*
sudo mv cfssl_1.6.5_linux_amd64 /usr/bin/cfssl
sudo mv cfssljson_1.6.5_linux_amd64 /usr/bin/cfssljson
sudo mv cfssl-certinfo_1.6.5_linux_amd64 /usr/bin/cfssl-certinfo
cfssl version
创建根CA
根CA(Root Certificate Authority)是一个信任链中的顶级证书颁发机构,用于签署和颁发其他证书的根证书。也就是说我们的证书都是由CA证书颁发机构创建的,安不安全在于你的电脑是否信任这个机构颁发的证书。打个比方就是你有一个计算机证书,它是由工信部颁发的,那么大家因为信任工信部,所以认可你的证书,认为你有操作计算机的资质,反过来,自签证书就相当于你自己作为工信部给自己签发计算机证书,那么别人认不认呢?当然不认了!但是你可以给别人宣传说,你这个证书和别的地方发的含金量是一样的,(假设他人相信了),那么你这个证书就是有用的。
那么下面我们就开始创立一个自己的工信部
创建申请根ca的csr文件
vim ca-csr.json
{
"CN":"myrootca",
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"JiangSu",
"ST":"NanJing",
"O":"organization",
"OU":"DEV"
}
]
}
下面是对于配置文件字段的一些解释,可以先不管,后续需要改的时候再参考。
CN (Common Name): 证书的公共名称,通常用于RFC 2818中定义的HTTP Over TLS时的主机名检查。对于CA证书,这通常是一个组织的名称或描述。
key: 这描述了要生成的公钥/私钥对的类型和大小。
algo: 选择算法,例如rsa或ecdsa。
size: 密钥的大小,例如2048位对于RSA。
names: 这部分提供了证书中的可分辨名称的其他部分。包括:
C (Country): 国家
L (Locality): 地区或城市
ST (State or Province): 省或州
O (Organization): 组织名
OU (Organizational Unit): 组织单元名,例如部门
CA配置文件
CA配置文件,描述了证书的有效期、用途等
主要是在后续使用自己创建的CA证书签发其他证书的时候会使用到,与根CA生成无关,可以提前打印出来。
创建命令:cfssl print-defaults config >ca.config
可以通过命令 cfssl print-defaults config 打印出来cfssl默认的配置
如下所示
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
创建根CA
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
执行上面的命令会生成三个文件
ca.csr #ca证书的请求文件,由ca-csr.json转化而来
ca.pem #cfssl 生成的根证书私钥
ca-key.pem # cfssl 生成的证书
其中证书是可以公开的,但是私钥一定不能泄露。
签发网站证书
现在有个一域名为cert.nobinobita.com的网站需要ssl证书,那么你可使用刚才生成的ca证书签发一个证书给他。
创建csr(证书请求文件)
可以通过一下命令生成csr的模板
cfssl print-defaults csr >tmp-csr.json
根据需要修改,根据我上面的需求我的修改如下:
vim nobita-csr.json
{
"CN": "cert.nobinobita.com",
"hosts": [
"cert.nobinobita.com"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "JiangSu",
"ST": "NanJing",
"O": "nobita",
"OU": "DEV"
}
]
}
签发证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca.config -profile=www nobita-csr.json |cfssl-json -bare cert.nobinobita.com
会生成
cert.nobinobita.com.csr 证书申请文件
cert.nobinobita.com-key.pem 证书私钥
cert.nobinobita.com.pem 证书
到此你已经使用cfssl创建根CA并自己签发了一个证书。
cert.nobinobita.com.pem 和cert.nobinobita.com-key.pem 是一对,现在就可以配置到nginx上面了。这里不赘述如何在nginx上配置ssl证书。
关于浏览器不安全提示
等你将nginx上的网站配置好你自签的证书后,你通过浏览器访问,你会发现:咦?为什么还是不安全的连接?
浏览器:“这是哪个机构发的证书,我的名单中没有这个机构,我不认识啊,我不认识的一律不安全!”
那么怎么解决呢?
请搜索:如何将自建CA证书导入系统受信任的根证书颁发机构列表。
ps:pem证书无法导入直接安装到windows,改拓展名为crt即可。
还不快抢沙发