From 40ed5bc5a6720a1e68324e528560509759ecd646 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Sat, 15 Dec 2018 03:46:21 +0000 Subject: [PATCH] =?UTF-8?q?loadbalancercertificates:=20=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E8=AF=81=E4=B9=A6fingerprint=E5=AD=97=E6=AE=B5=E5=90=8D?= =?UTF-8?q?=E5=92=8C=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/initdb.go | 1 + pkg/compute/models/loadbalancer_const.go | 5 +++ .../models/loadbalancercertificates.go | 45 ++++++++++++++++++- pkg/mcclient/models/loadbalancers.go | 2 +- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/pkg/compute/models/initdb.go b/pkg/compute/models/initdb.go index 9b13ae81c4..698fde796e 100644 --- a/pkg/compute/models/initdb.go +++ b/pkg/compute/models/initdb.go @@ -16,6 +16,7 @@ func InitDB() error { StorageManager, SecurityGroupManager, NetworkManager, + LoadbalancerCertificateManager, } { err := manager.InitializeData() if err != nil { diff --git a/pkg/compute/models/loadbalancer_const.go b/pkg/compute/models/loadbalancer_const.go index 9367ca626d..e7b31ac0df 100644 --- a/pkg/compute/models/loadbalancer_const.go +++ b/pkg/compute/models/loadbalancer_const.go @@ -101,6 +101,11 @@ var LB_ACL_TYPES = validators.NewChoices( LB_ACL_TYPE_WHITE, ) +const ( + LB_TLS_CERT_FINGERPRINT_ALGO_SHA1 = "sha1" + LB_TLS_CERT_FINGERPRINT_ALGO_SHA256 = "sha256" +) + const ( LB_TLS_CERT_PUBKEY_ALGO_RSA = "RSA" LB_TLS_CERT_PUBKEY_ALGO_ECDSA = "ECDSA" diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index c2531f9b37..0c0e5ac254 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -2,12 +2,16 @@ package models import ( "context" + "crypto/sha256" "crypto/x509" + "encoding/hex" + "encoding/pem" "fmt" "strings" "time" "yunion.io/x/jsonutils" + "yunion.io/x/log" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -47,7 +51,7 @@ type SLoadbalancerCertificate struct { PublicKeyAlgorithm string `create:"optional" list:"user" update:"user"` PublicKeyBitLen int `create:"optional" list:"user" update:"user"` SignatureAlgorithm string `create:"optional" list:"user" update:"user"` - FingerprintSha256 string `create:"optional" list:"user" update:"user"` + Fingerprint string `create:"optional" list:"user" update:"user"` NotBefore time.Time `create:"optional" list:"user" update:"user"` NotAfter time.Time `create:"optional" list:"user" update:"user"` CommonName string `create:"optional" list:"user" update:"user"` @@ -107,7 +111,7 @@ func (man *SLoadbalancerCertificateManager) validateCertKey(ctx context.Context, data.Set("public_key_algorithm", jsonutils.NewString(certPubKeyAlgo)) data.Set("public_key_bit_len", jsonutils.NewInt(int64(certV.PublicKeyBitLen()))) data.Set("signature_algorithm", jsonutils.NewString(cert.SignatureAlgorithm.String())) - data.Set("fingerprint_sha256", jsonutils.NewString(certV.FingerprintSha256String())) + data.Set("fingerprint", jsonutils.NewString(LB_TLS_CERT_FINGERPRINT_ALGO_SHA256+":"+certV.FingerprintSha256String())) return data, nil } @@ -119,6 +123,43 @@ func (man *SLoadbalancerCertificateManager) ValidateCreateData(ctx context.Conte return man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data) } +func (man *SLoadbalancerCertificateManager) InitializeData() error { + // initialize newly added null certificate fingerprint column + q := man.Query().IsNull("fingerprint") + lbcerts := []SLoadbalancerCertificate{} + if err := q.All(&lbcerts); err != nil { + return err + } + for i := range lbcerts { + lbcert := &lbcerts[i] + fp := lbcert.Fingerprint + if fp != "" { + continue + } + if lbcert.Certificate == "" { + continue + } + { + p, _ := pem.Decode([]byte(lbcert.Certificate)) + c, err := x509.ParseCertificate(p.Bytes) + if err != nil { + log.Errorf("parsing certificate %s(%s): %s", lbcert.Name, lbcert.Id, err) + continue + } + d := sha256.Sum256(c.Raw) + fp = LB_TLS_CERT_FINGERPRINT_ALGO_SHA256 + ":" + hex.EncodeToString(d[:]) + } + _, err := man.TableSpec().Update(lbcert, func() error { + lbcert.Fingerprint = fp + return nil + }) + if err != nil { + return err + } + } + return nil +} + func (lbcert *SLoadbalancerCertificate) AllowPerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { return false } diff --git a/pkg/mcclient/models/loadbalancers.go b/pkg/mcclient/models/loadbalancers.go index 7f7358f4fa..d3032d70be 100644 --- a/pkg/mcclient/models/loadbalancers.go +++ b/pkg/mcclient/models/loadbalancers.go @@ -133,7 +133,7 @@ type LoadbalancerCertificate struct { PublicKeyAlgorithm string PublicKeyBitLen int SignatureAlgorithm string - FingerprintSha256 string + Fingerprint string NotBefore time.Time NotAfter time.Time CommonName string