mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-30 10:10:21 +00:00
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)
|
||
|
}
|