mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	* fix duplicated imports of api/core/v1 * fix duplicated imports of client-go/kubernetes * fix duplicated imports of rest code * change import name to more reasonable
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
Copyright 2019 The Kubernetes Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto"
 | 
						|
	cryptorand "crypto/rand"
 | 
						|
	"crypto/rsa"
 | 
						|
	"crypto/x509"
 | 
						|
	"crypto/x509/pkix"
 | 
						|
	"encoding/pem"
 | 
						|
	"math"
 | 
						|
	"math/big"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/pkg/errors"
 | 
						|
 | 
						|
	certutil "k8s.io/client-go/util/cert"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	certificateBlockType = "CERTIFICATE"
 | 
						|
	rsaKeySize           = 2048
 | 
						|
	duration365d         = time.Hour * 24 * 365
 | 
						|
)
 | 
						|
 | 
						|
// NewPrivateKey creates an RSA private key
 | 
						|
func NewPrivateKey() (*rsa.PrivateKey, error) {
 | 
						|
	return rsa.GenerateKey(cryptorand.Reader, rsaKeySize)
 | 
						|
}
 | 
						|
 | 
						|
// EncodeCertPEM returns PEM-endcoded certificate data
 | 
						|
func EncodeCertPEM(cert *x509.Certificate) []byte {
 | 
						|
	block := pem.Block{
 | 
						|
		Type:  certificateBlockType,
 | 
						|
		Bytes: cert.Raw,
 | 
						|
	}
 | 
						|
	return pem.EncodeToMemory(&block)
 | 
						|
}
 | 
						|
 | 
						|
// NewSignedCert creates a signed certificate using the given CA certificate and key
 | 
						|
func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) {
 | 
						|
	serial, err := cryptorand.Int(cryptorand.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)
 | 
						|
}
 |