You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过证书保护.NET Core试用版应用并防范证书篡改?

解决.NET Core试用版证书时间限制被绕过的问题

你的思路方向是对的——但硬编码私钥是个非常糟糕的主意,私钥一旦被反编译提取,用户就能直接签发绕过时间限制的证书了。正确的做法是验证试用证书是否由你专属的根CA(证书颁发机构)签发,同时检查有效期,这样用户替换的自制证书因为没有你的根CA签名会被拒绝。

核心原理

我们需要建立一个「根CA证书 → 签发试用证书」的信任链:

  • 你自己生成一个根CA私钥和证书(这个私钥绝对不能发布,要妥善保管)
  • 用这个根CA来签发有效期4天的试用证书(也就是用户拿到的trial.crt)
  • 把根CA的公钥证书(不是私钥)嵌入到应用中作为信任锚
  • 启动时,同时验证两个点:试用证书的有效期,以及试用证书是否由你的根CA签发

具体操作步骤

1. 生成专属根CA(仅你自己操作,绝不对外发布)

# 生成根CA私钥(保密!不要给用户)
openssl genrsa -out rootCA.key 2048

# 生成根CA证书(有效期10年,自己保存)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt

2. 用根CA签发试用证书

首先生成试用证书的请求文件:

openssl req -new -nodes -key trial.key -out trial.csr

然后用根CA签署这个请求,生成带有效期的试用证书:

openssl x509 -req -in trial.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out trial.crt -days 4 -sha256

这个trial.crt就是你分发给用户的试用证书。

3. 嵌入根CA公钥到应用中

把rootCA.crt添加到你的.NET Core项目里,设置文件属性为嵌入式资源(右键文件 → 属性 → 生成操作 → 嵌入式资源),这样证书会被打包到程序集里,用户无法直接替换。

4. 修改验证代码,增加签名校验

替换你原来的CheckTrialCert方法,同时验证证书链和有效期:

using System.Reflection;
using System.Security.Cryptography.X509Certificates;

private static void CheckTrialCert()
{
    try
    {
        // 加载嵌入的根CA证书
        var assembly = Assembly.GetExecutingAssembly();
        // 注意替换成你的命名空间+证书路径,比如"YourApp.Certificates.rootCA.crt"
        using var rootCaStream = assembly.GetManifestResourceStream("YourAppNamespace.Certificates.rootCA.crt");
        if (rootCaStream == null)
        {
            Environment.Exit(0);
            return;
        }
        var rootCaCert = new X509Certificate2(rootCaStream);

        // 加载用户目录下的试用证书
        var trialCertPath = Path.Combine(AppContext.BaseDirectory, "Certificates", "trial.crt");
        var trialCert = new X509Certificate2(trialCertPath);

        // 构建证书链,验证试用证书是否由根CA签发
        using var chain = new X509Chain();
        chain.ChainPolicy.CustomTrustStore.Add(rootCaCert);
        chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
        chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // 试用版可跳过吊销检查

        // 验证证书有效性+有效期
        var isChainValid = chain.Build(trialCert);
        var isNotExpired = trialCert.NotAfter > DateTime.Now;

        if (!isChainValid || !isNotExpired)
        {
            Console.WriteLine("试用已过期或证书无效");
            Environment.Exit(0);
        }
    }
    catch
    {
        // 任何异常都直接退出,防止绕过
        Environment.Exit(0);
    }
}

额外安全与合规建议

  • 绝对不要硬编码私钥:私钥是信任链的核心,一旦泄露等于给用户开了后门。
  • 混淆保护应用:用.NET混淆工具(比如ConfuserEx)对程序集进行混淆,防止反编译提取根CA证书后模仿签发。
  • 添加自定义证书字段:签发试用证书时可以添加自定义扩展(比如应用唯一标识),验证时额外检查这个字段,增加破解难度。
  • 法律条款先行:技术手段只是辅助,务必在试用协议中明确时间限制和违规后果,确保合规性。

内容的提问来源于stack exchange,提问作者beribazoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:02:33