證書籤名工具 CFSSL

資源

特性

概念

安裝

  • 下載安裝linux

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
      
      sudo cp cfssl_linux-amd64 /usr/local/bin/cfssl 
      sudo cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
      sudo cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
      
      cd /usr/local/bin/ 
      
      chmod +x cfssl
      chmod +x cfssljson
      chmod +x cfssl-certinfo
  • 初始化json

    mkdir ~/cfssl
    cd ~/cfssl
    cfssl print-defaults config > ca-config.json
    cfssl print-defaults csr > ca-csr.json
  • 建立本身的內部服務使用的CA認證中心
  • 運行認證中心須要一個CA證書和相應的私鑰。後者是極其敏感的數據。任何知道私鑰的人均可以充當CA頒發證書。所以,私鑰的保護相當重要api

    #配置CA的證書生成策略
    cat << EOF > ca-config.json
    {
      "signing": {
          "default": {
              "expiry": "87600h"
          },
          "profiles": {
              "server": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "server auth"
                  ]
              },
              "client": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "client auth"
                  ]
              },
              "peer": {
                  "expiry": "87600h",
                  "usages": [
                      "signing",
                      "key encipherment",
                      "server auth",
                      "client auth"
                  ]
              }
          }
      }
    }
    EOF
    ca-config.json:能夠定義多個 profiles,分別指定不一樣的過時時間、使用場景等參數;後續在簽名證書時使用某個 profile;
    signing:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
    server auth:服務端證書;表示client能夠用該 CA 對server提供的證書進行驗證;server 由服務器使用,並由客戶端驗證服務器身份
    client auth:客戶端證書;表示server能夠用該CA對client提供的證書進行驗證;client用於經過服務器驗證客戶端。
    peer 對等證書;就是server auth、client auth都有的。成員之間共用,供它們彼此之間通訊使用
    
    #生成CA的證書和私鑰
    cat << EOF > ca-csr.json
    {
      "CN": "dudu_ca",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "dudu_ca",
          "OU": "dudu_ca"
        }
      ]
    }
    EOF
    #生成運行CA所必需的文件ca-key.pem(私鑰)和ca.pem(證書),還會生成ca.csr(證書籤名請求),用於交叉簽名或從新簽名。
    #請保持ca-key.pem文件的安全。此密鑰容許在CA中建立任何類型的證書。*.csr 文件在整個過程當中不會使用
    
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    
    #生成以下文件
    ca.csr  ca-key.pem  ca.pem
  • 生成kubernetes的證書。
  • 證書最重要的價值是通用名稱(CN)和主機(hosts)
  • 最重要的部分是CN ,這應該是您的主機名和hosts陣列,它必須包含全部的:您的本地主機名、127.0.0.一、服務器的私有IP地址(不是其面向公衆的IP)瀏覽器

    #kubernetes服務的生成策略
    cat << EOF > kubernetes-csr.json
    {
      "CN": "kubernetes",
      "hosts": [
        "127.0.0.1",
        "10.29.167.233",
        "169.169.0.1",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
          "algo": "rsa",
          "size": 2048
      },
      "names": [
          {
              "C": "CN",
              "ST": "BeiJing",
              "L": "BeiJing",
              "O": "k8s",
              "OU": "System"
          }
      ]
    }
    EOF
    #「O」:Organization,kube-apiserver 從證書中提取該字段做爲請求用戶所屬的組 (Group);
    #"CN": 字段 kube-apiserver 從證書中提取該字段做爲請求的用戶名 (User Name);瀏覽器使用該字段驗證網站是否合法
    #若是 hosts 字段不爲空則須要指定受權使用該證書的 IP 或域名列表,因爲該證書後續被 etcd 集羣和 kubernetes master 集羣使用,因此上面分別指定了 etcd 集羣、kubernetes master 集羣的主機 IP 和 kubernetes 服務的服務 IP(通常是 kue-apiserver 指定的 service-cluster-ip-range 網段的第一個IP,如 10.254.0.1。
    
    #對等證書   生成kubernetes的證書和私鑰。使用CA認證中心的私鑰和證書籤名生成機構的證書和私鑰。
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
    
     #  子節點客戶端證書
      cat << EOF > kubernetes-proxy-csr.json
      {
        "CN": "kube-proxy",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
     cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-proxy-csr.json | cfssljson -bare proxy
     
     # master 主節點api服務管理客戶端證書
     cat << EOF > kubernetes-apiserver-client-csr.json
      {
        "CN": "controllermanager",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
     cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-apiserver-client-csr.json | cfssljson -bare apiserver
    
    #生成以下文件
    kubernetes.csr  kubernetes-key.pem  kubernetes.pem
    
    #服務端證書 -profile=server 
    cfssl print-defaults csr > server-csr.json
      "CN": "coreos1",
      "hosts": [
          "192.168.122.68",
          "ext.example.com",
          "coreos1.local",
          "coreos1"
      ],
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
    
    #客戶端證書 -profile=client 客戶端證書能夠忽略hosts,只設定CN通用名
    cfssl print-defaults csr > client-csr.json
      修改
      "CN": "client",
      "hosts": [""],
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client
  • 驗證證書安全

    openssl x509 -in ca.pem -text -noout
    openssl x509 -in server.pem -text -noout
    openssl x509 -in client.pem -text -noout
    
    cfssl-certinfo -cert kubernetes.pem
  • 導入證書到系統,更新系統證書庫服務器

    update-ca-trust check   #檢查是否啓用
    update-ca-trust enable  #啓用系統共享CA存儲
    cp foo.crt /etc/pki/ca-trust/source/anchors/  #將證書複製到此目錄  具備高優先級,不會被覆蓋
    update-ca-trust extract   #最後提取更新
    
    cat foo.crt > /etc/pki/tls/certs/ca-bundle.crt   #老版本的處理方式
  • 注意事項
  • 設置全部私鑰文件權限 chmod 600 *-key.pem
  • 不要把你的ca-key.pem放入容器的Linux配置,建議將其存放在安全的地方。該密鑰容許生成儘量多的證書
  • 使用通配符*地址生成的密鑰和證書。將在任何機器上工做。它將簡化證書例程,但會增長安全風險。

經常使用操做命令

配置

功能

功能1

功能2

調試

優化

常見問題

實際應用

cat << EOF > kubernetes-csr.json
    {
      "CN": "kubernetes",
      "hosts": [
        "127.0.0.1",
        "10.29.167.233",
        "169.169.0.1",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
          "algo": "rsa",
          "size": 2048
      },
      "names": [
          {
              "C": "CN",
              "ST": "BeiJing",
              "L": "BeiJing",
              "O": "k8s",
              "OU": "System"
          }
      ]
    }
    EOF
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
    
  cat << EOF > kubernetes-client-csr.json
  {
    "CN": "controllermanager",
    "hosts": [],
    "key": {
      "algo": "rsa",
      "size": 2048
    },
    "names": [
      {
        "C": "CN",
        "ST": "BeiJing",
        "L": "BeiJing",
        "O": "k8s",
        "OU": "System"
      }
    ]
  }
  EOF
  cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-client-csr.json | cfssljson -bare apiserver
  
  cat << EOF > kube-proxy-csr.json
  {
    "CN": "kube-proxy",
    "hosts": [],
    "key": {
      "algo": "rsa",
      "size": 2048
    },
    "names": [
      {
        "C": "CN",
        "ST": "BeiJing",
        "L": "BeiJing",
        "O": "k8s",
        "OU": "System"
      }
    ]
  }
  EOF
  cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssljson -bare proxy
  
  證書轉爲瀏覽器可用的p12證書
  openssl pkcs12 -export -in apiserver.pem  -out apiserver.p12 -inkey apiserver-key.pem
相關文章
相關標籤/搜索