介绍

  • OpenSSL是开源的SSL(Secure Sockets Layer)实现,SSL 是一个安全协议,为基于 TCP 的应用层提供安全链接,其目标是保证两个应用间通信的保密性和可靠性
  • CFSSL 是 CloudFlare 公司的一个 PKI 工具包,提供了命令行工具和一个 HTTP API 服务器用于签名、验证和捆绑 SSL 证书

本文将对OpenSSL和CFSSL的使用进行介绍

OpenSSL

OpenSSL主要提供如下功能:

  • 对称加密算法(如DES)
  • 非对称加密算法(如RSA)
  • 信息摘要算法(如MD5)
  • 证书管理(如CA)

配置文件位置

/etc/pki/tls/openssl.cnf

对称加密

1) 加密

$ openssl enc -aes-256-ecb -a -in ./test1 -out ./test2 -k kulong520

2) 解密

$ openssl enc -aes-256-ecb -d -a -in ./test2 -out ./test3 -k kulong520
  • -a 表示使用base64
  • -d 表示解密
  • -k 表示加密密码
  • test1表示原始文件,test2表示加密后的文件,test3表示解密后的文件(与test1应该一模一样)

非对称加密

1) 生成私钥

$ openssl genrsa -out allen.key 2048

2) 提取公钥

$ openssl rsa -in allen.key -pubout > allen.public

信息摘要

$ openssl passwd -1 "rootroot"
$1$GXlfA2B0$rU/d.JX6qjNfudAIkya8M.

注: 生成的字符串可以放到/etc/passwd文件中,直接设置用户的密码

证书管理

1) 生成CA证书

  • 生成私钥
$ mkdir -p demoCA/{private,certs,crl,newcerts}
$ openssl genrsa -out demoCA/private/cakey.pem 2048`
  • 生成自签证书
$ openssl req -new -nodes -x509 -key demoCA/private/cakey.pem -days 3650 -out demoCA/cacert.pem \
        -subj "/C=CN/ST=Jiangsu/L=Nanjing/O=SkyData/OU=platform/CN=$IP/emailAddress=yilong.ren@sky-data.cn"
  • 创建用于签名证书的相关文件
$ touch demoCA/{index.txt,serial,crlnumber}
$ echo "01" > demoCA/serial`

参数说明:

  • req: X.509 Certificate Signing Request (CSR) Management.
  • -x509: this option outputs a self signed certificate instead of a certificate reques
  • -nodes: if this option is specified then if a private key is created it will not be encrypted.
  • CN: Common Name
  • C: Country
  • ST: State
  • L: Locality
  • O: Organization Name
  • OU: Organization Unit Name
  • $IP: replace with IP Addr

2) 生成CSR和CA签名

  • 生成私钥
$ mkdir -p mycrt
$ openssl genrsa -out mycrt/allen.key 2048`
  • 申请CSR
$ openssl req -new -key mycrt/allen.key -out mycrt/allen.csr \
        -subj "/C=CN/ST=Jiangsu/L=Nanjing/O=SkyData/OU=platform/CN=$IP/emailAddress=yilong.ren@sky-data.cn"`
  • 使用CA签署
$ openssl ca -in mycrt/allen.csr -out mycrt/allen.crt -days 3650 -batch`
  • 查看证书信息
$ openssl x509 -noout -text -in mycrt/allen.crt

CFSSL

生成证书步骤如下:

1) ca 配置文件

$ cat json/ca-config.json
{
    "signing": {
        "default": {
            "expiry": "43800h"
        },
        "profiles": {
            "server": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            },
            "client": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "43800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

2) ca csr 配置文件

$ cat json/ca-csr.json
{
  "CN": "etcd",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Nanjing",
      "O": "SkyData",
      "OU": "Platform"
    }
  ]
}

3) 申请机器的 csr 配置文件

$ cat json/my_csr.json
{
  "CN": "${hostname}",
  "hosts": [
    "${hostname}",
    "${node_ip}"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "Jiangsu",
      "L": "Nanjing",
      "O": "SkyData",
      "OU": "Platform"
    }
  ]
}

4) 生成CA证书

$ cfssl gencert -initca json/ca-csr.json  | cfssljson -bare cert_dir/ca

注: 会生成ca.csr, ca-key.pem, ca.pem 三个文件

5) 生成证书

$ cfssl gencert -ca=$cert_dir/ca.pem \
                -ca-key=$cert_dir/ca-key.pem \
                -config=json/ca-config.json \
                -profile=$profile json/etcd-csr.json | cfssljson -bare $cert_dir/$profile

注: $profile需要替换为server,或peer,或client

参考