Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MSBuild cannot sign a ClickOnce manifest using a temporary key (errors MSB3326 and MSB3321)

I am trying to build a ClickOnce Windows Forms project (.NET 3.5 / Visual Studio 2010) on a Windows Server computer. (In an effort to automate the build process with Hudson CI.)

For signing the ClickOnce manifest I created a temporary key in Visual Studio, temp.pfx. I can successfully build and deploy the project from Visual Studio on my workstation. But when running MSBuild on the server I get the following error messages:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9): error MSB3326: Cannot import the following key file: . The key file may be password protected. To correct this, try to import the certificate again or import the certificate manually into the current user's personal certificate store. [C:.hudson\jobs[...].csproj]

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9): error MSB3321: Importing key file "temp.pfx" was canceled. [C:.hudson\jobs[...].csproj]

I tried all of the following questions and answers without luck:

  • Stack Overflow question Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected'

    => In my case, the error message does not indicate a name of a certificate store but says "the current user's personal certificate store" instead.

    => Even when trying the accepted answer with "Personal" as the container name (sn -i temp.pfx personal), it fails to parse the key:

    Failed to parse the PKCS#12 blob in ALiS_TemporaryKey.pfx -- An internal error o ccurred.

  • Stack Overflow question Using MSBuild to sign ClickOnce or assembly results in error MSB3321

    => I tried the accepted answer, but the key file cannot be imported because "Either the user profile is not accessible or the private key that you are importing might require a cryptographic service provider that is not installed on your system"

    => The same happens if I try to import the file by double-clicking it in Windows Explorer (RobinDotNet's suggestion)

  • Stack Overflow question Signing assemblies with PFX files in MSBuild, Team Build, and TFS

    => The OP of that question was unsuccessful with the above two answers, too, but unfortunately not even the answers that he got would help me:

    Log in as the user that runs MSBuild on the build machine, manually invoke MSBuild, and then type in the password when prompted.

    => I logged in and ran msbuild myproject.sln but it would not even prompt me for the password.

    What finally fixed it for me was making the account under which TFS Build service runs an administrator on the local machine.

    => The account that runs Hudson (more precisely: Tomcat) already is a local administrator. I tried to run MSBuild from a "Run As Administrator" command line even and would get the same error messages still.


Update: I tried to open the solution in Visual Studio on the same server and build it. I get the same error. When I try to re-import the PFX file in the project properties' Signing tab, it tells me "invalid password". If I try to import the very same file in the very same solution in Visual Studio on my workstation and provide the very same password, it is accepted.

Update 2: If I take an old temporary key which I had generated with Visual Studio 2008, it can be successfully imported in the certificate store of our server; any temporary keys I newly create with Visual Studio 2010 cannot be imported.

Update 3: I was able to create a new "temporary key" in Visual Studio on the server and use it both on the server as well as on my workstation for signing the ClickOnce manifest. I only cannot make up a reasonable explanation for it - both computers are 64-bit, and I am using Visual Studio 2010 on both. Both have the v3.5 and v4 (4.0.30319) .NET framework installed. My workstation is a Windows 7 Professional, and the server is a Windows Server 2008 R2 Standard.

like image 208
chiccodoro Avatar asked Jun 22 '12 12:06

chiccodoro


1 Answers

Copy the PFX file over to the machine you are doing the builds on. Double-click on it, and install it in the certificate manager on the machine. Be sure you are logged into the account used to do the builds.

Other suggestions/questions: Do you have the right version of .NET installed on the machine? Do you have privileges to write to the certificate store on that machine?

If you open the Visual Studio project, go to the project properties and try to create a new certificate, does it work? It should create a PFX file and add it to the project. And can you see it in the certificate store (menu Start/certmgr.msc)?

like image 189
RobinDotNet Avatar answered Oct 05 '22 22:10

RobinDotNet