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

Dmi*_*sev 8 sql-server snk pfx tsqlt

我正在尝试对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 \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets(2482,5):错误MSB3321:导入密钥文件“ tSQLtOfficialSigningKey.pfx”被取消。[E:\ Source \ tSQLt \ tSQLtCLR \ tSQLtCLR \ tSQLtCLR.csproj]

为了解决这个问题,我为每个项目创建了没有密码的新密钥:

在此处输入图片说明

我看到它创建了snk文件,而不是原始文件pfx。之后,我尝试再次运行该构建,但由于上面提到的错误而失败。

Vig*_*r A 0

如此处所述

\n

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

\n

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

\n
\n

无法导入以下密钥文件:mykey.pfx。密钥文件可能受\n密码保护。若要更正此问题,请尝试再次导入证书或使用以下密钥容器名称将证书\n手动安装到强名称 CSP:VS_KEY_C1D3ACB8FBF1AGK4

\n
\n

解决方案1:

\n

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

\n
sn -i "c:\\Pathtofile\\.pfx" VS_KEY_C1D3ACB8FBF1AGK4\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

解决方案2:

\n
    \n
  • 打开项目属性。

    \n
  • \n
  • 单击签名部分。

    \n
  • \n
  • 其中写着\xe2\x80\x98选择一个强名称密钥文件:\xe2\x80\x99,从下拉框中重新选择当前值

    \n
  • \n
  • Visual Studio 现在将提示您输入密码。输入它。您可能会收到另一条错误消息:\n\xe2\x80\x9d尝试引用不存在的令牌\xe2\x80\x9d > 您可以忽略此消息。

    \n
  • \n
  • 单击\xe2\x80\x98更改密码\xe2\x80\x9d按钮

    \n
  • \n
  • 在所有三个框中输入原始密码,然后单击“确定”。如果你\xe2\x80\x99d想改变

    \n
  • \n
  • 您的密码(或者如果您的旧密码不\xe2\x80\x99 不满足复杂性要求),您现在就可以这样做。

    \n
  • \n
  • 对项目中的每个关键文件重复此操作。\n保存项目并进行重建。

    \n
  • \n
\n

解决方案3:

\n

从 slproweb.com 获取适用于 Windows 的 openssl 副本,或者使用 Linux 机器,因为他们几乎都有它。\n运行以下命令以导出到密钥文件

\n
\n

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

\n

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

\n
\n

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

\n

解决方案 4:

\n

此问题的最终解决方案是放弃 Visual Studio 进行签名,转而使用Signtool

\n

更新答案

\n

您的 TFS 生成服务帐户似乎没有访问生成代理计算机上的signingKey.pfx 所需的权限。\n请先确保您在生成代理计算机上拥有此文件。

\n

然后按照以下步骤操作:

\n
    \n
  1. 使用本地构建服务帐户登录构建代理(最好具有管理员权限)

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

    \n
  4. \n
  5. 键入命令sn \xe2\x80\x93i signingKey.pfx VS_KEY_EFCA4C5B6DFD4B4F(确保使用错误消息中出现的键名称)

    \n
  6. \n
  7. 当提示输入密码时,输入 pfx 文件的密码

    \n
  8. \n
  9. 然后重建它

    \n
  10. \n
\n

笔记:如果您没有以管理员身份运行 Visual Studio,也请尝试这样做。

\n

更多细节可以参考 Brandon Manchester的回答 Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected'

\n