This commit is contained in:
parent
1790c48009
commit
c6c2bdbe4a
|
|
@ -5,20 +5,32 @@ import (
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"crypto/x509"
|
||||||
"encoding/asn1"
|
"encoding/asn1"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"license-server/storage"
|
||||||
"math/big"
|
"math/big"
|
||||||
)
|
)
|
||||||
|
|
||||||
var privateKey *ecdsa.PrivateKey
|
var privateKey *ecdsa.PrivateKey
|
||||||
|
|
||||||
func init() {
|
// 显式从 main 传入 DB,保证先建库再读写
|
||||||
var err error
|
func InitCrypto(db storage.Database) {
|
||||||
privateKey, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
// 1. 读取
|
||||||
if err != nil {
|
if pem, ok := db.GetPrivateKey(); ok {
|
||||||
panic(err)
|
if der, err := base64.StdEncoding.DecodeString(pem); err == nil {
|
||||||
|
if key, err := x509.ParseECPrivateKey(der); err == nil {
|
||||||
|
privateKey = key
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// 2. 不存在或解析失败 → 重新生成并落库
|
||||||
|
key, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
||||||
|
der, _ := x509.MarshalECPrivateKey(key)
|
||||||
|
db.SavePrivateKey(base64.StdEncoding.EncodeToString(der))
|
||||||
|
privateKey = key
|
||||||
|
}
|
||||||
|
|
||||||
// ecdsaSignature 是 ASN.1 编码中使用的结构体
|
// ecdsaSignature 是 ASN.1 编码中使用的结构体
|
||||||
type ecdsaSignature struct {
|
type ecdsaSignature struct {
|
||||||
|
|
|
||||||
1
main.go
1
main.go
|
|
@ -9,6 +9,7 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
db := storage.InitDB()
|
db := storage.InitDB()
|
||||||
|
license.InitCrypto(db)
|
||||||
app := fiber.New()
|
app := fiber.New()
|
||||||
|
|
||||||
app.Post("/api/license/generate", license.GenerateLicenseHandler(db))
|
app.Post("/api/license/generate", license.GenerateLicenseHandler(db))
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
)
|
)
|
||||||
|
|
@ -11,7 +13,13 @@ type Database struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitDB() Database {
|
func InitDB() Database {
|
||||||
db, _ := sql.Open("sqlite3", "./license.db")
|
const dbPath = "/root/database/license.db"
|
||||||
|
|
||||||
|
// 确保目录存在
|
||||||
|
_ = os.MkdirAll(filepath.Dir(dbPath), 0700)
|
||||||
|
|
||||||
|
db, _ := sql.Open("sqlite3", dbPath)
|
||||||
|
|
||||||
db.Exec(`CREATE TABLE IF NOT EXISTS activations (
|
db.Exec(`CREATE TABLE IF NOT EXISTS activations (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
machine_id TEXT UNIQUE,
|
machine_id TEXT UNIQUE,
|
||||||
|
|
@ -23,6 +31,13 @@ func InitDB() Database {
|
||||||
machine_id TEXT UNIQUE,
|
machine_id TEXT UNIQUE,
|
||||||
license TEXT
|
license TEXT
|
||||||
)`)
|
)`)
|
||||||
|
|
||||||
|
/* ➊ 额外表:持久化私钥(仅一行) */
|
||||||
|
db.Exec(`CREATE TABLE IF NOT EXISTS private (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
key TEXT
|
||||||
|
)`)
|
||||||
|
|
||||||
return Database{db}
|
return Database{db}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,3 +64,14 @@ func (d Database) SaveGenerated(machineID string, licenseText string) {
|
||||||
d.db.Exec("INSERT OR REPLACE INTO generations(machine_id, license) VALUES (?, ?)",
|
d.db.Exec("INSERT OR REPLACE INTO generations(machine_id, license) VALUES (?, ?)",
|
||||||
machineID, licenseText)
|
machineID, licenseText)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===== 新增两个工具方法 ===== */
|
||||||
|
func (d Database) GetPrivateKey() (string, bool) {
|
||||||
|
row := d.db.QueryRow("SELECT key FROM private WHERE id = 1")
|
||||||
|
var key string
|
||||||
|
return key, row.Scan(&key) == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d Database) SavePrivateKey(key string) {
|
||||||
|
d.db.Exec("INSERT OR REPLACE INTO private(id, key) VALUES (1, ?)", key)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue