使用CFSSL自签网站证书

分享 2024-07-15

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目录中)移动到系统路径
lsdownload.png

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

cfsslversion.png

创建根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
执行上面的命令会生成三个文件
genca.png

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
csr-tmp.png
根据需要修改,根据我上面的需求我的修改如下:
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

gencert.png

会生成

 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即可。


本文由 nobinobita 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论