mirror of https://github.com/kubernetes/kops.git
157 lines
4.0 KiB
Go
157 lines
4.0 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 pki
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/x509"
|
|
"crypto/x509/pkix"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
"k8s.io/klog/v2"
|
|
)
|
|
|
|
func PkixNameToString(name *pkix.Name) string {
|
|
seq := name.ToRDNSequence()
|
|
var s bytes.Buffer
|
|
for _, rdnSet := range seq {
|
|
for _, rdn := range rdnSet {
|
|
if s.Len() != 0 {
|
|
s.WriteString(",")
|
|
}
|
|
key := ""
|
|
t := rdn.Type
|
|
if len(t) == 4 && t[0] == 2 && t[1] == 5 && t[2] == 4 {
|
|
switch t[3] {
|
|
case 3:
|
|
key = "cn"
|
|
case 5:
|
|
key = "serial"
|
|
case 6:
|
|
key = "c"
|
|
case 7:
|
|
key = "l"
|
|
case 10:
|
|
key = "o"
|
|
case 11:
|
|
key = "ou"
|
|
}
|
|
}
|
|
if key == "" {
|
|
key = t.String()
|
|
}
|
|
s.WriteString(fmt.Sprintf("%v=%v", key, rdn.Value))
|
|
}
|
|
}
|
|
return s.String()
|
|
}
|
|
|
|
var keyUsageStrings = map[x509.KeyUsage]string{
|
|
x509.KeyUsageDigitalSignature: "KeyUsageDigitalSignature",
|
|
x509.KeyUsageContentCommitment: "KeyUsageContentCommitment",
|
|
x509.KeyUsageKeyEncipherment: "KeyUsageKeyEncipherment",
|
|
x509.KeyUsageDataEncipherment: "KeyUsageDataEncipherment",
|
|
x509.KeyUsageKeyAgreement: "KeyUsageKeyAgreement",
|
|
x509.KeyUsageCertSign: "KeyUsageCertSign",
|
|
x509.KeyUsageCRLSign: "KeyUsageCRLSign",
|
|
x509.KeyUsageEncipherOnly: "KeyUsageEncipherOnly",
|
|
x509.KeyUsageDecipherOnly: "KeyUsageDecipherOnly",
|
|
}
|
|
|
|
func keyUsageToString(u x509.KeyUsage) []string {
|
|
var usages []string
|
|
|
|
for k, v := range keyUsageStrings {
|
|
if (u & k) != 0 {
|
|
usages = append(usages, v)
|
|
}
|
|
}
|
|
|
|
// TODO: Detect if there are other flags set?
|
|
return usages
|
|
}
|
|
|
|
func parseKeyUsage(s string) (x509.KeyUsage, bool) {
|
|
for k, v := range keyUsageStrings {
|
|
if v == s {
|
|
return k, true
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
var extKeyUsageStrings = map[x509.ExtKeyUsage]string{
|
|
x509.ExtKeyUsageAny: "ExtKeyUsageAny",
|
|
x509.ExtKeyUsageServerAuth: "ExtKeyUsageServerAuth",
|
|
x509.ExtKeyUsageClientAuth: "ExtKeyUsageClientAuth",
|
|
x509.ExtKeyUsageCodeSigning: "ExtKeyUsageCodeSigning",
|
|
x509.ExtKeyUsageEmailProtection: "ExtKeyUsageEmailProtection",
|
|
x509.ExtKeyUsageIPSECEndSystem: "ExtKeyUsageIPSECEndSystem",
|
|
x509.ExtKeyUsageIPSECTunnel: "ExtKeyUsageIPSECTunnel",
|
|
x509.ExtKeyUsageIPSECUser: "ExtKeyUsageIPSECUser",
|
|
x509.ExtKeyUsageTimeStamping: "ExtKeyUsageTimeStamping",
|
|
x509.ExtKeyUsageOCSPSigning: "ExtKeyUsageOCSPSigning",
|
|
x509.ExtKeyUsageMicrosoftServerGatedCrypto: "ExtKeyUsageMicrosoftServerGatedCrypto",
|
|
x509.ExtKeyUsageNetscapeServerGatedCrypto: "ExtKeyUsageNetscapeServerGatedCrypto",
|
|
}
|
|
|
|
func extKeyUsageToString(u x509.ExtKeyUsage) string {
|
|
s := extKeyUsageStrings[u]
|
|
if s == "" {
|
|
klog.Warningf("Unhandled ExtKeyUsage: %v", u)
|
|
s = fmt.Sprintf("ExtKeyUsage:%v", u)
|
|
}
|
|
return s
|
|
}
|
|
|
|
func parseExtKeyUsage(s string) (x509.ExtKeyUsage, bool) {
|
|
for k, v := range extKeyUsageStrings {
|
|
if v == s {
|
|
return k, true
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
// BuildTypeDescription extracts the type based on the certificate extensions
|
|
func BuildTypeDescription(cert *x509.Certificate) string {
|
|
var options []string
|
|
|
|
if cert.IsCA {
|
|
options = append(options, "CA")
|
|
}
|
|
|
|
options = append(options, keyUsageToString(cert.KeyUsage)...)
|
|
|
|
for _, extKeyUsage := range cert.ExtKeyUsage {
|
|
options = append(options, extKeyUsageToString(extKeyUsage))
|
|
}
|
|
|
|
sort.Strings(options)
|
|
s := strings.Join(options, ",")
|
|
|
|
for k, v := range wellKnownCertificateTypes {
|
|
if v == s {
|
|
s = k
|
|
}
|
|
}
|
|
|
|
return s
|
|
}
|