jetbra-certificate 纯go版本

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

6 个赞

感谢大佬!

首帖就这有质量 :+1:
欢迎佬友 :clap: