自签SSL证书实现笔记

应用使用TLS加密传输已是目前IT行业心照不宣的标准了,然而我们通常使用的证书都是通过商用CA机构签名的。有没有一种不花钱的方式呢?比如,我们应用仅针对于内网。答案那是当然,穷人自有穷人家的玩法。

安装cffssl 工具

第1步 下载工具

curl -s -L -o /usr/local/bin/cfssl https://dl.vqiu.cn/package/tarball/cfssl/cfssl_linux-amd64
curl -s -L -o /usr/local/bin/cfssljson https://dl.vqiu.cn/package/tarball/cfssl/cfssljson

第2步 添加执行权限

chmod +x /usr/local/bin/{cfssl,cfssljson}

创建CA 公钥和私钥

第1步: 创建目录

mkdir cfssl
cd cfssl

第2步: 创建ca-csr.json 文件,填入CA相关信息

cat > ca-csr.json <<EOF
{
    "CN": "Gitee CA",
    "key": {
      "algo": "rsa",
      "size": 2048
    },
    "names": [
      {
        "C": "CN",
        "ST": "Guangdong",
        "L": "Guangzhou",
        "O": "vqiu co.,Ltd",
        "OU": "IT Department"
      }
    ]
  }
EOF

可以使用以下命令来来查询

cfssl print-defaults config
cfssl print-defaults csr

第3步: 基于ca-csr.json文件来创建CA公钥与私钥。

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

第4步: 创建包含签名和配置文件详细信息的ca-config.json。这将用于创建可用于设置基于SSL/TSL的身份验证的服务器或客户端证书。

cat > ca-config.json <<EOF 
 {
    "signing": {
      "default": {
        "expiry": "8760h"
      },
      "profiles": {
        "web-servers": {
          "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
          ],
          "expiry": "8760h"
        }
      }
    }
  }
EOF

注意: 时限为1年

创建 SSL/TLS 证书

如创建1个域名为good.vqiu.cn的SSL/TLS证书。

第1步: 创建 server-csr.json

cat > server-csr.json <<EOF
 {
    "CN": "good.vqiu.cn",
    "hosts": [
        "*.vqiu.cn"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Guangdong"
            "L": "Guangzhou",
            "O": "Vqiu co.,Ltd"
        }
    ]
}
EOF

**第2步:**使用ca创建 SSL/TLS证书

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=web-servers \
  server-csr.json | cfssljson -bare server

CA证书并入到操作系统

RHEL/CentOS

# echo "Vqiu self-sign CA" >>tls-ca-bundle.pem
# cat ca.pem  >> /etc/pki/tls/certs/ca-bundle.crt 

Debian/Ubuntu

为了条目清晰--后续可以轻松地跟踪,创建一个对应的CA子目录

# mkdir /usr/local/share/ca-certificates/vqiu-CA

将证书复制对CA子目录

# cp ca.pem /usr/local/share/ca-certificates/vqiu-CA/ca.crt

执行update-ca-certificates,将看到以下输出

# sudo update-ca-certificates --fresh
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

若需要删除添加的CA证书,删除你自定义的根 CA 证书文件后,执行如下命令:

sudo update-ca-certificates --fresh

Alpine

Dockerfile写法

FROM alpine:latest
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY ./ca.pem /usr/local/share/ca-certificates/gitee-CA.crt
RUN update-ca-certificates --fresh

常用测试命令

查看证书逾期

openssl x509 -in xx.crt -noout -dates

查看证书的对应的DNS

cat server.pem | openssl x509 -text | grep DNS

查看证书信息

openssl x509 -text -in server.pem -noout

使用openssl 查看证书链信息

openssl s_client -connect xxx:443 |tee logfile

使用curl(带CA证书) 测试

 curl --cacert ca.pem --resolv 鉴发的证书域名:443:解析的IP  https://鉴发的证书域名