summaryrefslogtreecommitdiff
path: root/cloud
diff options
context:
space:
mode:
authorShelley-BaoYue <baoyue2@huawei.com>2023-12-09 17:09:00 +0800
committerShelley-BaoYue <baoyue2@huawei.com>2023-12-15 11:12:00 +0800
commit6be7475fa25478626132f8613868ff9730931698 (patch)
treea54654a3bc3e4844356130d3968f47b863e1261c /cloud
parentMerge pull request #5278 from fisherxu/fix-slack (diff)
downloadkubeedge-6be7475fa25478626132f8613868ff9730931698.tar.gz
change the edgecert subject
Signed-off-by: Shelley-BaoYue <baoyue2@huawei.com>
Diffstat (limited to 'cloud')
-rw-r--r--cloud/pkg/cloudhub/servers/httpserver/server.go31
1 files changed, 23 insertions, 8 deletions
diff --git a/cloud/pkg/cloudhub/servers/httpserver/server.go b/cloud/pkg/cloudhub/servers/httpserver/server.go
index 0104c8045..1ae061770 100644
--- a/cloud/pkg/cloudhub/servers/httpserver/server.go
+++ b/cloud/pkg/cloudhub/servers/httpserver/server.go
@@ -36,6 +36,7 @@ import (
hubconfig "github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/config"
"github.com/kubeedge/kubeedge/common/constants"
+ "github.com/kubeedge/kubeedge/common/types"
)
// StartHTTPServer starts the http service
@@ -86,9 +87,10 @@ func EncodeCertPEM(cert *x509.Certificate) []byte {
// edgeCoreClientCert will verify the certificate of EdgeCore or token then create EdgeCoreCert and return it
func edgeCoreClientCert(request *restful.Request, response *restful.Response) {
+ nodeName := request.Request.Header.Get(types.NodeNameKey)
if cert := request.Request.TLS.PeerCertificates; len(cert) > 0 {
- if err := verifyCert(cert[0]); err != nil {
- klog.Errorf("failed to sign the certificate for edgenode: %s, failed to verify the certificate", request.Request.Header.Get(constants.NodeName))
+ if err := verifyCert(cert[0], nodeName); err != nil {
+ klog.Errorf("failed to sign the certificate for edgenode: %s, failed to verify the certificate", nodeName)
response.WriteHeader(http.StatusUnauthorized)
if _, err := response.Write([]byte(err.Error())); err != nil {
klog.Errorf("failed to write response, err: %v", err)
@@ -101,12 +103,12 @@ func edgeCoreClientCert(request *restful.Request, response *restful.Response) {
if verifyAuthorization(response, request.Request) {
signEdgeCert(response, request.Request)
} else {
- klog.Errorf("failed to sign the certificate for edgenode: %s, invalid token", request.Request.Header.Get(constants.NodeName))
+ klog.Errorf("failed to sign the certificate for edgenode: %s, invalid token", nodeName)
}
}
// verifyCert verifies the edge certificate by CA certificate when edge certificates rotate.
-func verifyCert(cert *x509.Certificate) error {
+func verifyCert(cert *x509.Certificate, nodeName string) error {
roots := x509.NewCertPool()
ok := roots.AppendCertsFromPEM(pem.EncodeToMemory(&pem.Block{Type: certutil.CertificateBlockType, Bytes: hubconfig.Config.Ca}))
if !ok {
@@ -119,7 +121,20 @@ func verifyCert(cert *x509.Certificate) error {
if _, err := cert.Verify(opts); err != nil {
return fmt.Errorf("failed to verify edge certificate: %v", err)
}
- return nil
+ return verifyCertSubject(cert, nodeName)
+}
+
+func verifyCertSubject(cert *x509.Certificate, nodeName string) error {
+ if cert.Subject.Organization[0] == "KubeEdge" && cert.Subject.CommonName == "kubeedge.io" {
+ // In order to maintain compatibility with older versions of certificates
+ // this condition will be removed in KubeEdge v1.18.
+ return nil
+ }
+ commonName := fmt.Sprintf("system:node:%s", nodeName)
+ if cert.Subject.Organization[0] == "system:nodes" && cert.Subject.CommonName == commonName {
+ return nil
+ }
+ return fmt.Errorf("request node name is not match with the certificate")
}
// verifyAuthorization verifies the token from EdgeCore CSR
@@ -177,12 +192,12 @@ func signEdgeCert(w http.ResponseWriter, r *http.Request) {
r.Body = http.MaxBytesReader(w, r.Body, constants.MaxRespBodyLength)
csrContent, err := io.ReadAll(r.Body)
if err != nil {
- klog.Errorf("fail to read file when signing the cert for edgenode:%s! error:%v", r.Header.Get(constants.NodeName), err)
+ klog.Errorf("fail to read file when signing the cert for edgenode:%s! error:%v", r.Header.Get(types.NodeNameKey), err)
return
}
csr, err := x509.ParseCertificateRequest(csrContent)
if err != nil {
- klog.Errorf("fail to ParseCertificateRequest of edgenode: %s! error:%v", r.Header.Get(constants.NodeName), err)
+ klog.Errorf("fail to ParseCertificateRequest of edgenode: %s! error:%v", r.Header.Get(types.NodeNameKey), err)
return
}
usagesStr := r.Header.Get("ExtKeyUsages")
@@ -199,7 +214,7 @@ func signEdgeCert(w http.ResponseWriter, r *http.Request) {
klog.V(4).Infof("receive sign crt request, ExtKeyUsages: %v", usages)
clientCertDER, err := signCerts(csr.Subject, csr.PublicKey, usages)
if err != nil {
- klog.Errorf("fail to signCerts for edgenode:%s! error:%v", r.Header.Get(constants.NodeName), err)
+ klog.Errorf("fail to signCerts for edgenode:%s! error:%v", r.Header.Get(types.NodeNameKey), err)
return
}