证书登录校验

This commit is contained in:
TsMask
2023-08-24 15:04:23 +08:00
parent a21ce30a7b
commit 11c3c7f89d
3 changed files with 48 additions and 29 deletions

View File

@@ -7,6 +7,7 @@ import (
"omc/core/db"
"omc/core/utils"
"omc/handle/model"
"time"
"github.com/aceld/zinx/zlog"
)
@@ -31,27 +32,36 @@ func UserLogin(name, passwd string) error {
// CMCALogin 验证随机码
// content "user:seqNo" 组合的字符
// signatureBase64 签名数据base64编码
func CMCALogin(name, publicKeyStr, content, signatureBase64 string) error {
func CMCALogin(name, carCertificate, content, signatureBase64 string) error {
// 用户名密码校验
var user model.User
err := db.Client.Model(&model.User{}).Where("account_id=?", name).First(&user).Error
if err != nil {
zlog.Ins().ErrorF("Password Login[%s]:%s", name, err)
return errors.New("无效用户")
return errors.New("无效OMC用户")
}
if user.AccountId != name {
return fmt.Errorf("用户名错误 %s", name)
}
// 公钥
publicKeyPEM := fmt.Sprintf("-----BEGIN RSA PUBLIC KEY-----\n %s \n-----END RSA PUBLIC KEY-----", publicKeyStr)
// 解析公钥
publicKey, err := utils.ParsePKCS1PublicKey(publicKeyPEM)
// 解析证书信息
certificate, err := utils.ParseCert(carCertificate)
if err != nil {
zlog.Ins().ErrorF("publicKeyPEM Login[%s]:%s", name, err)
return fmt.Errorf("解析公钥失败")
zlog.Ins().ErrorF("ParseCert Login[%s]:%s", name, err)
return fmt.Errorf("解析证书失败")
}
// 判断证书到期时间
if time.Now().After(certificate.NotAfter) {
zlog.Ins().ErrorF("certificate Not After Now time Login[%s]:%s", name, err)
return errors.New("证书已过期")
}
// 判断证书持有人
if certificate.Subject.CommonName != name {
zlog.Ins().ErrorF("certificate Subject CommonName Login[%s]:%s", name, err)
return errors.New("用户与证书持有人不匹配")
}
// 解码base64得到签名字节串
@@ -62,7 +72,7 @@ func CMCALogin(name, publicKeyStr, content, signatureBase64 string) error {
}
// 验证签名
valid := utils.VerifySignature(publicKey, []byte(content), signature)
valid := utils.VerifySignature(certificate.PublicKey, []byte(content), signature)
if valid {
return nil
}