什么是.snk文件?我知道它代表Strongly Named Key,但所有关于它是什么以及它是如何工作的解释都在我脑海中.
关于如何使用强名称密钥以及它如何工作,是否有任何简单的解释?
微软似乎已经创建了一个认证丛林,这很难理解.
程序集签名密钥属性(.snk)
是否建议基于pfx或cer创建snk文件?(不确定它是否可能,如果它可能如何完成?)
虽然可以使用受密码保护的pfx对程序集进行签名,但它看起来并不强大,除非使用snk签名.但是snk没有密码保护.哪一个更安全?由于我是项目中唯一的开发人员,我没有多开发人员安全环境问题,但仍想知道什么是最好的方法.
非常感谢,
我正在使用Visual Studio 2008,我有一个包含多个项目的解决方案.我有一个snk来签署我的程序集,它存在于一个解决方案文件夹中.
我已将snk链接到我的每个项目,但现在当我尝试使用该链接的snk签署我的项目时,我找不到带有文件对话框的snk文件.
我错过了这一步吗?
Solution
> Solution Folder
MyKey.snk
> Project X
> _LinkedFiles
MyKey.snk (physical file doesn't appear here but shows in VS)
> ...
Run Code Online (Sandbox Code Playgroud) 我理解签署程序集背后的基本思想,但在使用Telerik或第二方DLL时遇到问题.我有一个使用我自己的.DLL的.exe,这些DLL依次使用企业库DLL和Telerik DLL.
我为我的所有项目提供了一个强大的名称.snk,但是在编译时,编译器解释说企业库DLL没有签名,这是有道理的.
我不想用te sn.exe -Vr命令关闭验证,甚至延迟签署我的项目.但那怎么会起作用呢?我很感激任何见解.
我正在尝试对tSQLt框架进行一些改进,并且大部分时间都已完成,但由于与我未接触过的证书相关的测试仍然很少失败,所以无法做到这一点:
[exec] |18|[InstallExternalAccessKeyTests].[test creates correct certificate in master] | 120|Failure|
[exec] |19|[InstallExternalAccessKeyTests].[test tSQLt can be set to EXTERNAL ACCESS after InstallExternalAccessKey executed] | 333|Failure|
[exec] |20|[InstallExternalAccessKeyTests].[test tSQLtExternalAccessKey install data is signed with same key as tSQLt.clr] | 10|Failure|
Run Code Online (Sandbox Code Playgroud)
失败的错误是:
Expected: %publickeytoken=8c9a92de0f9c7794,%
Actual: tsqltclr, version=1.0.7216.13228, culture=neutral, publickeytoken=8d3f4bf59e4c22fd, processorarchitecture=msil
Run Code Online (Sandbox Code Playgroud)
我将尝试描述我的安装过程。
我使用以下指南安装了此框架源。但是之后我无法启动该项目,因为它失败并出现以下错误,并且整个问题的解决都在该SO帖子中完成:
[exec]
C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets(2482,5):错误MSB3325:无法导入以下密钥文件:tSQLtOfficialSigningKey.pfx。密钥文件可能受密码保护。若要更正此问题,请尝试再次导入证书或使用以下密钥容器名称将证书手动安装到强名称CSP:VS_KEY_C20B79DE0583A5C1 [E:\ Source \ tSQLt \ tSQLtCLR \ tSQLtCLR \ tSQLtCLR.csproj] [exec]
C:\ Windows \ …
如果我想使.NET程序集可用作COM服务器,我必须添加一组属性,然后使用regasm它将其注册为COM服务器.
如果在regasm使用/codebasekey 运行时未使用强名称对程序集进行签名,则会显示一条RA0000警告,指出程序集可能会干扰同一台计算机上的其他程序集,并且我应该使用强名称对其进行签名,但是注册成功,它甚至可以正常工作.
AFAIK强名称旨在防止所谓的DLL地狱.但COM也是为了防止DLL地狱.如果我更改任何暴露给COM的接口,我必须更改GUID或至少保持二进制兼容性.因此,使用强名称进行签名似乎没有添加任何有用的东西 - 没有什么能阻止我破坏COM接口,然后用相同的密钥对签名并拥有完整的DLL地狱.
在COM暴露的.NET程序集中,使用强名称签名有什么用?
我的产品需要能够生成.snk文件(不需要在系统上安装Microsoft SDK).我可以生成一个工作的SNK文件,但是在指定密码时我似乎无法使其工作.谁能给我一些指示?这是我到目前为止:
internal static void CreateKeyPairFile(string fileName, int keySize, string password)
{
if ((keySize % 8) != 0)
{
throw new CryptographicException("Invalid key size. Valid size is 384 to 16384 mod 8. Default 1024.");
}
CspParameters parms = new CspParameters();
parms.KeyNumber = 2;
if (null != password)
{
var passwordString = new System.Security.SecureString();
foreach (char c in password)
{
passwordString.AppendChar(c);
}
parms.Flags = CspProviderFlags.UseUserProtectedKey;
parms.KeyPassword = passwordString;
}
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(keySize, parms);
byte[] array = provider.ExportCspBlob(!provider.PublicOnly);
using (FileStream …Run Code Online (Sandbox Code Playgroud) 我目前正在设置我的.net库,使用强类型键进行签名.我正在使用.snk文件在每个解决方案的基础上签署我的dll.因此,对于每个解决方案,它都有自己的.snk文件.这是正确的做法吗?例如,我有一个类库,它从解决方案中的每个项目输出几个不同的dll,每个都使用.snk键进行签名.
我的问题围绕着源控件中密钥的存储.当我为每个版本分支我的代码时.应该关键:
A.存在于分支之外而不是分支 - 确保每个分支的相同密钥B.存在于分支内但对于每个分支是相同的C.存在于分支内并且针对每个分支进行更改D.其他(请注明)
建议好吗?
也可以通过将以下内容放在SolutionInfo文件中来签署dll,或者有其他选择吗?
[assembly: AssemblyKeyFile("<<absolute path>>\\MyKey.snk")]
Run Code Online (Sandbox Code Playgroud) 自从使用Visual Studio 2015以来,正在发生构建错误.在Visual Studio 2015中构建时很少发生这种情况.在TeamCity中构建时,这种情况经常发生.
[Visual Studio 2015中的错误]
http://i.stack.imgur.com/hKbbe.png
[TeamCity中的错误]
Visual Studio 2013 - 在编译时开始收到错误:"错误签名程序集 - 未知错误(8013141c)".很少有项目使用snk文件签名.它曾经用于编译并且已经生产了很长一段时间.
snk ×10
c# ×5
.net ×4
strongname ×4
assemblies ×2
pfx ×2
com ×1
cryptography ×1
gac ×1
msbuild ×1
regasm ×1
sql-server ×1
teamcity ×1
tsqlt ×1