Kubeadm1.14 證書調整

kubeadm部署的kubernets證書一直都是個詬病,默認都只有一年有效期,kubeadm 1.14.x安裝後有部分證書仍是一年有效期,但個別證書已修改成10年有效期,但對咱們使用來講,一年有效期仍是一個比較的坑,須要進行調整。

修改kubeadm 1.14.x源碼,調整證書過時時間

kubeadm1.14.x 安裝事後crt證書以下所示

/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/front-proxy-ca.crt         #10年有效期
/etc/kubernetes/pki/ca.crt                     #10年有效期
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/front-proxy-client.crt     #10年有效期
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/ca.crt                #10年有效期
/etc/kubernetes/pki/etcd/peer.crt              #10年有效期
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/apiserver-kubelet-client.crt

如上所示,除了標註說明的證書爲10年有效期,其他都是1年有效期,咱們查看下原先調整證書有效期的源碼,克隆kubernetes 源碼,切換到1.14.1 tag 查看:
代碼目錄: staging/src/k8s.io/client-go/util/cert/cert.gohtml

const duration365d = time.Hour * 24 * 365

func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
    now := time.Now()
    tmpl := x509.Certificate{
        SerialNumber: new(big.Int).SetInt64(0),
        Subject: pkix.Name{
            CommonName:   cfg.CommonName,
            Organization: cfg.Organization,
        },
        NotBefore:             now.UTC(),
        //這裏已經調整爲10年有效期
        NotAfter:              now.Add(duration365d * 10).UTC(),
        KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
        BasicConstraintsValid: true,
        IsCA:                  true,
    }

    certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key)
    if err != nil {
        return nil, err
    }
    return x509.ParseCertificate(certDERBytes)
}

如上所示,經過NewSelfSignedCACert這個方法簽發的證書都默認爲10年有效期了,但這個隻影響部分證書,但這樣還沒知足咱們的需求,個別證書的有效期調整,在通過對源碼的分析後,找到了以下的邏輯:git

發現部分證書是經過NewSignedCert這個方法簽發,而這個方法簽發的證書默認只有一年有效期,查看代碼邏輯:
代碼: cmd/kubeadm/app/util/pkiutil/pki_helpers.goapi

const duration365d = time.Hour * 24 * 365

func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) {
    serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64))
    if err != nil {
        return nil, err
    }
    if len(cfg.CommonName) == 0 {
        return nil, errors.New("must specify a CommonName")
    }
    if len(cfg.Usages) == 0 {
        return nil, errors.New("must specify at least one ExtKeyUsage")
    }

    certTmpl := x509.Certificate{
        Subject: pkix.Name{
            CommonName:   cfg.CommonName,
            Organization: cfg.Organization,
        },
        DNSNames:     cfg.AltNames.DNSNames,
        IPAddresses:  cfg.AltNames.IPs,
        SerialNumber: serial,
        NotBefore:    caCert.NotBefore,
        // 只有一年有效期
        NotAfter:     time.Now().Add(duration365d).UTC(),
        KeyUsage:     x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
        ExtKeyUsage:  cfg.Usages,
    }
    certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey)
    if err != nil {
        return nil, err
    }
    return x509.ParseCertificate(certDERBytes)
}

至此,調整NewSignedCert這個方法,從新進行編譯,將證書有效期調整爲你想要的任什麼時候間。app

如何從新編譯kubeadm源碼,請參考以前的文章,連接以下:Kubeadm證書過時時間調整code

kubeadm 1.14 離線安裝教程

k8s 1.14.x 離線一鍵安裝包教程&&地址: kubernetes 1.14 離線安裝地址

原文連接server

相關文章
相關標籤/搜索