从源代码运行tSQLt项目失败,由于公共令牌不匹配。

9

我正在尝试对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|

失败的错误是:

Expected: %publickeytoken=8c9a92de0f9c7794,%
Actual: tsqltclr, version=1.0.7216.13228, culture=neutral, publickeytoken=8d3f4bf59e4c22fd, processorarchitecture=msil

我会尝试描述我的安装过程。
我使用以下指南安装了这个框架的源代码。然而,之后我无法启动项目,因为它出现了以下错误,并且整个问题解决过程都在SO帖子中完成:
为了解决这个问题,我已经为每个项目创建了没有密码的新密钥:

[exec]
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2482,5): error MSB3325: 无法导入以下密钥文件: tSQLtOfficialSigningKey.pfx。密钥文件可能受到密码保护。 要纠正此问题,请尝试重新导入证书或手动安装证书到 Strong Name CSP, 并使用以下密钥容器名称:VS_KEY_C20B79DE0583A5C1 [E:\Source\tSQLt\tSQLtCLR\tSQLtCLR\tSQLtCLR.csproj] [exec]
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2482,5): error MSB3321: 导入密钥文件“tSQLtOfficialSigningKey.pfx”已取消。 [E:\Source\tSQLt\tSQLtCLR\tSQLtCLR\tSQLtCLR.csproj]

要通过此问题,我已为每个项目创建了没有密码的新密钥:

enter image description here

我发现它创建了snk文件,而不是原始的pfx。之后我尝试再次运行构建,但出现了上述错误。


为什么要使用 tsql 框架呢?它会在你的数据库代码中包含很多代码,还有很多 SQL CLR 函数。我曾经尝试在两个大型项目中使用它,但都失败了。最好的方法是使用 .net 或/和 SQL 创建自己的测试,并通过某些工具执行它们以实现并行执行。 - gotqn
我不太确定你具体在说什么。那里只有几个SQL CLR函数。此外,它非常稳定,“失败严重”听起来很奇怪。甚至Redgate也将此框架纳入了他们的产品中。你可以搜索一下,会发现这是目前最好的单元测试框架。 - Dmitrij Kultasev
我知道它是最好的,但并不好。我已经使用过它很多次,并参加了一些在线演示,请求增强等,但最终我还是自己创建了测试。我的建议是 - 不要依赖这个框架。 - gotqn
我已经使用它多年了,它总是对我很有效,在大型项目中也一样。 - Dmitrij Kultasev
1个回答

0

如下所述这里

在构建Microsoft Visual Studio 2008-2015项目时,可能会出现以下错误。

错误: 无法导入以下密钥文件:mykey.pfx。密钥文件可能受到密码保护。

无法导入以下密钥文件:mykey.pfx。密钥文件可能受到密码保护。要纠正此问题,请尝试重新导入证书或手动使用以下密钥容器名称将证书安装到Strong Name CSP:VS_KEY_C1D3ACB8FBF1AGK4

解决方案1:

单击“开始”>“所有程序”>“Microsoft Visual Studio”>“Visual Studio 工具”>“Visual Studio命令提示符”。输入以下命令

sn -i "c:\Pathtofile\.pfx" VS_KEY_C1D3ACB8FBF1AGK4

注意:使用参数 -i 的 sn.exe,将密钥对安装到名为的密钥容器中。重新导入PFX 文件到 Visual Studio。

解决方案2:

  • 打开项目属性。

  • 点击签名部分。

  • 在“选择一个强名称密钥文件:”处,重新选择下拉框中的当前值

  • Visual Studio 现在会提示你输入密码。输入它。您可能会收到另一个错误消息:“尝试引用不存在的令牌”>您可以简单地忽略此消息。

  • 点击“更改密码”按钮

  • 在三个框中输入原始密码,然后单击“确定”。如果您想更改

  • 您的密码(或者如果旧密码不符合复杂性要求),现在可以这样做。

  • 对于项目中的每个密钥文件都重复此操作。 保存您的项目并进行重建。

解决方案3:

在 slproweb.com 上获取 Windows 版本的 OpenSSL,或者使用 Linux 系统,因为它们几乎都有 OpenSSL。

运行以下命令将其导出到密钥文件:

openssl pkcs12 -in certfile.pfx -out backupcertfile.key

openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key

然后在项目属性中可以使用 PFX 文件。

解决方案 4:

这个问题的最终解决方案是放弃使用 Visual Studio 进行签名,改用 Signtool

更新的答案:

似乎您的 TFS 构建服务帐户没有访问构建代理机器上的 signingKey.pfx 所需的权限。首先确保您在构建代理机器上拥有此文件。

然后按照以下步骤操作:

  1. 本地构建服务账户(最好拥有管理员权限)登录构建代理服务器

  2. 打开 Visual Studio 命令提示符并导航到存储密钥的目录

  3. 键入命令sn -i signingKey.pfx VS_KEY_EFCA4C5B6DFD4B4F(确保使用错误消息中出现的密钥名称)

  4. 提示输入密码时,键入 pfx 文件的密码

  5. 然后重新构建它

注意:如果您没有将 Visual Studio 作为管理员运行,请尝试这样做。

更多详细信息请参考 Brandon Manchester 的答案无法导入密钥文件“blah.pfx”-错误“The keyfile may be password protected”


@DmitrijKultasev 您可以简单地打开“项目”->“属性”->“签名”,然后取消选中“签署 ClickOnce 清单”复选框。 - Vignesh Kumar A
1
您的情况中提供的所有解决方案都需要密码,而我没有密码。签署 ClickOnce 清单未选中并已禁用。我正在尝试在本地完成所有操作,因此不存在权限问题(我已尝试以管理员身份运行此命令行)。 - Dmitrij Kultasev
如果你在谈论Visual Studio,那么它是2017年的版本。 - Dmitrij Kultasev
1
有7个步骤,指出“在所有三个框中输入原始密码,然后单击确定。如果您想更改密码(或者旧密码不符合复杂性要求),现在可以这样做。”正如我已经说明的那样,我没有密码。 - Dmitrij Kultasev
1
在那个例子中,作者知道密码而我不知道。 - Dmitrij Kultasev
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接