首页 > 解决方案 > 证书固定 - 用于许可证分发的公钥/私钥

问题描述

我正在尝试分发应用程序 - 并且需要添加软件许可证才能让用户使用该应用程序。我需要在许可证中分发一些有关授权的信息(仅使用公钥/私钥时效果很好)

伪步骤

  1. 生成公钥/私钥
  2. 在代码中嵌入公钥
  3. 使用编码创建许可证
  4. 分发许可证文件
  5. 应用程序使用嵌入式公钥验证许可证

6.问题(使用证书验证公钥的来源)

实际步骤:

1. 生成公钥/私钥

openssl genrsa -out private_key.pem 3072
openssl rsa -in "private_key.pem -pubout -out public_key.pem

2 - 5 然后将私钥嵌入代码中,并读取许可证文件,如(代码来自此处):

func VerifyAndExtractPayload(publicKey *rsa.PublicKey, str string) (interface{}, error) {
    var err error

    str = strings.TrimSpace(str)

    if !strings.HasPrefix(str, header) || !strings.HasSuffix(str, footer) {
        return nil, errors.New("invalid license key")
    }

    b64 := strings.Replace(str[len(header):len(str)-len(footer)], "\n", "", -1)

    var l license
    b, err := base64.StdEncoding.DecodeString(b64)
    licenseBuffer := bytes.Buffer{}
    licenseBuffer.Write(b)
    licenseDecoder := gob.NewDecoder(&licenseBuffer)
    if err = licenseDecoder.Decode(&l); err != nil {
        return nil, err
    }

    hashed := sha256.Sum256(l.Payload)

    if err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], l.Signature); err != nil {
        return nil, err
    }

    var payload interface{}
    payloadBuffer := bytes.Buffer{}
    payloadBuffer.Write(l.Payload)
    payloadDecoder := gob.NewDecoder(&payloadBuffer)
    if err = payloadDecoder.Decode(&payload); err != nil {
        return nil, err
    }

    return payload, nil
}

然后我意识到也许我应该使用证书固定,所以没有人可以替换公钥。

伪代码:

  1. 使用私钥生成根证书
  2. 嵌入证书
  3. 像上面一样生成许可证
  4. 从证书中读取公钥
  5. 应用程序使用嵌入式公钥验证许可证

问题:

  1. 如何验证从证书中读取公钥?
  2. 公钥现在是否经过验证?

标签: goopensslcertificatex509certificate

解决方案


推荐阅读