首页 > 解决方案 > 如何使用证书保护 .Net Core 应用程序以进行试用

问题描述

这个想法是在 .Net Core 应用程序中放置一个定时炸弹(它是测试版/试用版,不是完全可用的产品,从法律的角度来看是可以的)。

我想使用 X509 证书来实现这一点,但很难理解它是如何工作的以及需要做什么。

到目前为止,使用 OpenSSL,我创建了一个私钥(我们称之为 trial.key):

openssl genrsa -des3 -out trial.key 2048

,然后使用 -days 参数 (trial.pem) 和密码“password”创建证书:

openssl req -x509 -new -nodes -key trial.key -sha256 -days 4 -out trial.pem

然后结束 trial.cert:

openssl x509 -outform der -in trial.pem -out trial.crt

我将 trial.crt 添加到应用程序并在启动时检查日期:

private static void CheckTrialCert()
{
    var trialCert = new X509Certificate2(Path.Combine("Certificates", "trial.crt"), "password");

    if (trialCert.NotAfter < DateTime.Now)
    {
        Environment.Exit(0);
    };
}

问题是用户可以在磁盘上找到 trial.crt 并用自己创建的证书替换它,没有时间限制(假设他知道密码)并使用该应用程序。

在这里可以做什么?有没有办法可以在应用程序中对私钥进行硬编码并检查 trial.crt 是否已使用我的私钥签名?

标签: asp.net-coresslopensslx509certificatex509certificate2

解决方案


您可以尝试将证书直接嵌入代码中。但是,这不会阻止知识渊博的用户滥用您的限制。.NET 应用程序可以轻松反编译,可以使用 ildasm.exe 等工具跟踪和修改逻辑。换句话说,您要完成的工作是针对未受过教育的用户。

要更难地进行反编译,您可以使用 .NET 混淆工具。但是它们有一些副作用,例如损坏的异常堆栈跟踪。考虑到可能的负面影响,您需要在安全性、可维护性和实施成本之间找到平衡点。

但是,考虑到这一切,请记住,没有 100% 抵抗的解决方案,任何应用程序都可以被破解,问题在于破解它的成本。


推荐阅读