使用 CloudFlare 的 PKI 工具集 cfssl 来创建证书
这里使用已经配置好的docker环境
docker run -it --entrypoint /bin/bash --name cfssl_TSL cfssl/cfssl:1.5.0
mkdir production_tsl
cd production_tsl
- CA的profiles配置
- profiles: 可以定义多个 profile,分别指定不同的过期时间、使用场景等参数,在签名证书时使用某个 profile;
- signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
- key encipherment:表示密钥用法为密钥加密
- server auth: 服务端证书,表示 client 可以用该 CA 对 server 提供的证书进行验证;
- client auth: 客户端证书,表示 server 可以用该 CA 对 client 提供的证书进行验证
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"docker": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
- CA证书请求文件
cat > ca-csr.json << EOF
{
"CN": "Docker",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Company Name",
"OU": "develop"
}
],
"ca": {
"expiry": "87600h"
}
}
EOF
- 首先我们需要创建一个 CA 证书,后续利用它去生成其他证书。
- 生成CA 及ca-key
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cat > server-csr.json << EOF
{
"CN": "Docker Server",
"hosts": [
"127.0.0.1",
"you server ip",
"you server hostname"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Company Name",
"OU": "develop"
}
]
}
EOF
- 签发server证书与key
cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile docker server-csr.json | cfssljson -bare server
- 客户端证书
- 客户端证书的配置中除了没有 hosts 字段,其他与生成服务端证书一样。
cat > client-csr.json << EOF
{
"CN": "Docker Client",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "Company Name",
"OU": "develop"
}
]
}
EOF
cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile docker client-csr.json | cfssljson -bare client
- 权限 各种key自己可读:
chmod -v 0400 ca-key.pem server-key.pem client-key.pem
- 权限 外证书任何人都可以读:
chmod -v 0444 ca.pem server.pem client.pem
- 拷贝所有文件到当前目录
docker cp cfssl_TSL://workdir/production_tsl .