Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式检查NuGet包中的Authenticode文件_C#_.net_Nuget_Signing_Authenticode - Fatal编程技术网

C# 以编程方式检查NuGet包中的Authenticode文件

C# 以编程方式检查NuGet包中的Authenticode文件,c#,.net,nuget,signing,authenticode,C#,.net,Nuget,Signing,Authenticode,在使用NuGet API安装NuGet软件包时,是否有方法检查其内部的dll文件 情景: 我希望c#/.net应用程序能够在运行时使用NuGet包进行自我更新。因为这显然是相当危险的,我想验证一下包是否来自我期望的源代码 问题: NuGet不支持包签名。这里有一篇文章论述了这一问题: 到目前为止我所做的: 构建一个空项目 对dll文件进行签名(signtool Sign/t/a“\app.dll”) 从中创建NuGet包(NuGet spec add.dll,NuGet pack.\app.dl

在使用NuGet API安装NuGet软件包时,是否有方法检查其内部的dll文件

情景:

我希望c#/.net应用程序能够在运行时使用NuGet包进行自我更新。因为这显然是相当危险的,我想验证一下包是否来自我期望的源代码

问题:

NuGet不支持包签名。这里有一篇文章论述了这一问题:

到目前为止我所做的:

  • 构建一个空项目
  • 对dll文件进行签名(signtool Sign/t/a“\app.dll”)
  • 从中创建NuGet包(NuGet spec add.dll,NuGet pack.\app.dll.nuspec)
  • NuGet包中的dll文件现在已签名,我可以将其上载到NuGet repo

    这是我的申请代码:

    public static void installPackage(string packageId, string connectionString, string path){
            IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(connectionString);
    
            PackageManager packageManager = new PackageManager(repo, path);
    
            packageManager.InstallPackage(packageId);
        }
    
    示例如下所示:

    目前我能想到的唯一可能的解决方案是使用NuGetAPI中的下载包函数,解压缩下载的包,然后进行检查和安装。遗憾的是,我在API中找不到任何提示,说明安装过程可以在这两个步骤中完成

    或者,我可以使用PGP创建分离的签名,对NuGet包本身进行签名,并使用分离的签名对NuGet包进行检查。然而,这导致了同样的问题,首先能够下载软件包

    如果有任何提示,我将不胜感激!多谢各位

    ---更新---

    我想我已经找到了一种使用NuGet和PGP签名进行包验证的方法。我正在做以下工作:

  • 从NuGet服务器获取可用NuGet的列表(我正在使用Nexus)
  • 标记要安装的文件
  • 该软件包提供了一个下载链接:

    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(<connectionString>);
    
    DataServicePackage package = (DataServicePackage) repo.FindPackage(packageId);
    String downloadUrl = package.DownloadUrl.AbsoluteUri;
    
    IPackageRepository repo=PackageRepositoryFactory.Default.CreateRepository();
    DataServicePackage=(DataServicePackage)repo.FindPackage(packageId);
    字符串downloadUrl=package.downloadUrl.AbsoluteUri;
    
  • 下载软件包并存储在磁盘上:

  • 使用(var client=new WebClient()){
    client.UseDefaultCredentials=true;
    client.Credentials=新网络凭据(,);
    var content=client.DownloadData(downloadUrl);
    使用(MemoryStream MemoryStream=新的MemoryStream(内容)){
    FileStream fs=newfilestream(,FileMode.CreateNew);
    memoryStream.CopyTo(fs);
    fs.Close();
    }
    }
    
  • 从其他服务器下载分离的签名
  • 验证分离的签名和下载的nupkg(我使用了BouncyCastle)
  • 如果验证成功:
  • 使用文件存储为新存储库的目录,然后从那里安装软件包
  • //初始化本地存储库
    字符串路径=;
    IPackageRepository localRepo=PackageRepositoryFactory.Default.CreateRepository(路径);
    var packages=repo.GetPackages();
    //初始化包管理器
    PackageManager PackageManager=新的PackageManager(localRepo,路径);
    //安装
    packageManager.InstallPackage();
    
    使用这种方法仍然可以对NuGet包中的文件进行身份验证


    很高兴听到你们对这个解决方案的看法。谢谢

    简单地检查软件包中的DLL可能不是最安全的选择,因为恶意文件可能会添加到软件包中,从而危害您的意图/机器。NuGet团队正在致力于允许对包进行作者签名。在这个过程中,您将有
    NuGet.exe sign
    NuGet.exe verify
    命令。你可以阅读更多关于它的文章。详细规格见-和


    更新- NuGet团队已经完成了包签名和验证的实现。现在,您可以按照所述对包进行签名,并按照所述验证包的完整性(以及其他内容)


    您可以阅读有关技术规格的信息。

    您的博客文章链接指向404。然而,我已经读到,有一个计划用asp.net 5实现包签名-这仍然留下了在两者之间做什么的问题。谢谢你指出这一点。我已经更新了博客帖子链接。