// validateCSR validates the signature and formatting of a base64-wrapped, // PEM-encoded PKCS#10 certificate signing request. If this is invalid, we must // not accept the CSR for further processing. func validateCSR(obj *certificates.CertificateSigningRequest) error { csr, err := certutil.ParseCSR(obj) if err != nil { return err } // check that the signature is valid err = csr.CheckSignature() if err != nil { return err } return nil }
func (cc *CertificateController) maybeAutoApproveCSR(csr *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, error) { // short-circuit if we're not auto-approving if cc.approveAllKubeletCSRsForGroup == "" { return csr, nil } // short-circuit if we're already approved or denied if approved, denied := getCertApprovalCondition(&csr.Status); approved || denied { return csr, nil } isKubeletBootstrapGroup := false for _, g := range csr.Spec.Groups { if g == cc.approveAllKubeletCSRsForGroup { isKubeletBootstrapGroup = true break } } if !isKubeletBootstrapGroup { return csr, nil } x509cr, err := certutil.ParseCSR(csr) if err != nil { utilruntime.HandleError(fmt.Errorf("unable to parse csr %q: %v", csr.Name, err)) return csr, nil } if !reflect.DeepEqual([]string{"system:nodes"}, x509cr.Subject.Organization) { return csr, nil } if !strings.HasPrefix(x509cr.Subject.CommonName, "system:node:") { return csr, nil } if len(x509cr.DNSNames)+len(x509cr.EmailAddresses)+len(x509cr.IPAddresses) != 0 { return csr, nil } csr.Status.Conditions = append(csr.Status.Conditions, certificates.CertificateSigningRequestCondition{ Type: certificates.CertificateApproved, Reason: "AutoApproved", Message: "Auto approving of all kubelet CSRs is enabled on the controller manager", }) return cc.kubeClient.Certificates().CertificateSigningRequests().UpdateApproval(csr) }