如何通过证书保护.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
相关产品推荐
相关产品推荐

