package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"crypto/x509/pkix"
"encoding/pem"
"fmt"
"log"
"math/big"
"os"
"time"
)
func main() {
privKey, err := rsa.GenerateKey(rand.Reader, 4096)
if err != nil {
log.Fatal("密钥生成失败: ", err)
}
template := &x509.Certificate{
SerialNumber: randomSerial(),
Subject: pkix.Name{
CommonName: "jetbra-from-2024-04-13",
},
// Issuer: pkix.Name{
// CommonName: "JetProfile CA",
// },
NotBefore: time.Now().Add(-24 * time.Hour),
NotAfter: time.Now().Add(3650 * 24 * time.Hour),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
BasicConstraintsValid: true,
IsCA: false,
SignatureAlgorithm: x509.SHA256WithRSA,
}
issuerTemplate := &x509.Certificate{
Subject: pkix.Name{
CommonName: "JetProfile CA",
},
}
certDER, err := x509.CreateCertificate(rand.Reader, template, issuerTemplate, &privKey.PublicKey, privKey)
if err != nil {
log.Fatal("证书创建失败: ", err)
}
if err := writeFiles(privKey, certDER); err != nil {
log.Fatal("文件写入失败: ", err)
}
if err := generateVerificationResult(); err != nil {
log.Fatal("验证失败: ", err)
}
log.Println("操作成功完成")
}
func writeFiles(privKey *rsa.PrivateKey, certDER []byte) error {
// 写入私钥
privFile, err := os.Create("jetbra.key")
if err != nil {
return err
}
defer privFile.Close()
if err := pem.Encode(privFile, &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(privKey),
}); err != nil {
return err
}
// 写入证书
certFile, err := os.Create("jetbra.pem")
if err != nil {
return err
}
defer certFile.Close()
return pem.Encode(certFile, &pem.Block{
Type: "CERTIFICATE",
Bytes: certDER,
})
}
func generateVerificationResult() error {
// 读取证书
cert, err := readCert("jetbra.pem")
if err != nil {
return err
}
// 读取根证书
rootCert, err := readCert("root_certificate.pem")
if err != nil {
return err
}
// 执行验证计算
x := new(big.Int).SetBytes(cert.Signature)
y := 65537
z := rootCert.PublicKey.(*rsa.PublicKey).N
r := new(big.Int).Exp(x, big.NewInt(int64(y)), cert.PublicKey.(*rsa.PublicKey).N)
// 写入结果文件
return os.WriteFile("power.txt", []byte(fmt.Sprintf(
"EQUAL,%d,%d,%d->%d", x, y, z, r,
)), 0644)
}
func readCert(filename string) (*x509.Certificate, error) {
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
block, _ := pem.Decode(data)
if block == nil {
return nil, fmt.Errorf("无效的PEM格式")
}
return x509.ParseCertificate(block.Bytes)
}
func randomSerial() *big.Int {
serial, _ := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128))
return serial
}
jetbra-server-go 直接集成所有插件,并支持增量更新 - 开发调优 - LINUX DO
jetbra-server-go 用golang 重复造个轮子吧 - 开发调优 - LINUX DO