Morse's Site
1036 字
5 分钟
Golang 证书工具使用简介 - cfssl
2021-02-28

cfssl配置分类#

  • client certificate(客户端证书): 用于通过服务器对客户端进行身份验证。例如etcdctl,etcd代理或Docker客户端。
  • server certificate(服务端证书): 由服务器使用,并由客户端验证服务器身份。例如docker服务器或kube-apiserver。
  • peer certificate(对等证书): etcd集群成员以两种方式相互通信时使用对等证书。

安装#

> go get github.com/cloudflare/cfssl/cmd/...

如何使用#

初始化CA(certificate authority)#

mkdir ~/cfssl
cd ~/cfssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

配置CA选项#

现在,我们可以在ca-config.json配置文件中配置签名选项。默认选项包含以下预配置字段:

  • profileswww 具有server auth(服务器身份验证)(TLS Web服务器身份验证)X509 V3扩展名的www和具有客户机身份验证(TLS Web客户端身份验证)X509 V3扩展名的客户端
  • expiry: 具有默认值8760h(或365天)

为了达到合规性,让我们将wwwprofiles重命名为server,使用server auth(服务器身份验证)和client auth(客户端身份验证)扩展名创建peer其他对等配置文件,并将有效期设置为43800h(5年):

{
    "signing": {
        "default": {
            "expiry": "43800h"
        },
        "profiles": {
            "server": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

您还可以修改ca-csr.json证书签名请求(CSRSigning Request)

{
    "CN": "My own CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "US",
            "L": "CA",
            "O": "My Company Name",
            "ST": "San Francisco",
            "OU": "Org Unit 1",
            "OU": "Org Unit 2"
        }
    ]
}

使用以上参数生成CA:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

你将获取以下文件:

ca-key.pem
ca.csr
ca.pem
  • 请妥善保管ca-key.pem文件。使用此密钥可以在您的CA中创建任何种类的证书。
  • * .csr文件未在我们的示例中使用。

生成服务器证书#

cfssl print-defaults csr > server.json

服务器证书最重要的值是Common Name(公用名: CN)和Hosts(主机)。我们必须替换它们,例如:

    "CN": "coreos1",
    "hosts": [
        "192.168.122.68",
        "ext.example.com",
        "coreos1.local",
        "coreos1"
    ],

现在我们准备生成server certificate(服务器证书)和private key(私钥):

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server

您将获得以下文件:

server-key.pem
server.csr
server.pem

生成对等证书#

cfssl print-defaults csr > member1.json

替换CN和hosts的值, 如:

    "CN": "member1",
    "hosts": [
        "192.168.122.101",
        "ext.example.com",
        "member1.local",
        "member1"
    ],

现在我们准备生成member1证书和私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer member1.json | cfssljson -bare member1

你可以得到以下文件:

member1-key.pem
member1.csr
member1.pem

对每个etcd成员主机名重复这些步骤。

生成客户端证书#

cfssl print-defaults csr > client.json

对于客户端证书,我们可以忽略主机值,而仅将通用名称(CN)设置为客户端值:

...
    "CN": "client",
    "hosts": [""],
...

生成客户端证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client

您将得到以下文件:

client-key.pem
client.csr
client.pem

TLDR(Too Long; Didn’t Read)总结

  • 下载cfssl二进制文件
sudo curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
sudo curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
sudo chmod +x /usr/local/bin/cfssl*
  • 创建存储证书的文件夹
mkdir ~/cfssl
cd ~/cfssl
  • 生成CA和证书
echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | cfssl gencert -initca - | cfssljson -bare ca -
echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","server auth","client auth"]}}}' > ca-config.json
export ADDRESS=192.168.122.68,ext1.example.com,coreos1.local,coreos1
export NAME=server
echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME
export ADDRESS=
export NAME=client
echo '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME
  • 验证数据
openssl x509 -in ca.pem -text -noout
openssl x509 -in server.pem -text -noout
openssl x509 -in client.pem -text -noout

注意点#

  • 不要将ca-key.pem放入容器Linux配置(Container Linux Config)中,建议将其存储在安全的地方。此密钥允许生成尽可能多的证书。
  • 确保密钥文件安全。不要忘记设置适当的文件权限,即chmod 0600 server-key.pem
  • 此TLDR示例中的证书具有服务器身份验证和客户端身份验证X509 V3扩展,您可以将它们与服务器和客户端的身份验证一起使用。
  • 您也可以自由为通配符*地址生成密钥和证书。他们可以在任何机器上工作。这将简化证书常规,但会增加安全风险。

更多信息#

有关其他示例,请查看以下文档:

Golang 证书工具使用简介 - cfssl
https://fuwari.vercel.app/posts/golang/cfssl/
作者
Morse Hsiao
发布于
2021-02-28
许可协议
CC BY-NC-SA 4.0