我使用的是Linux。该平台是一个开发容器,因此底层操作系统可能会有所不同。
我正在使用
dotnet build
来编译 .csproj
项目。 (.csproj
是新的sdk格式。)
我需要对生成的程序集进行强命名。但是,我只有一个受密码保护的
.pfx
文件(而且我知道密码)。
如何将该
.pfx
文件转换为 dotnet
工具可以在 Linux 上消化的内容?
似乎不支持直接用
.pfx
签名。看来我需要一个不受密码保护的.snk
文件。然而,在花了几个小时使用 Google 和 ChatGPT 后,我似乎无法找到一种方法来创建包含 .snk
文件中的公钥和私钥的 .pfx
文件。我仍然不确定 .snk
文件是否是正确的方法。
这里有人能帮我解决这个问题吗?再次强调,这是 Linux,不是 Windows。在 Windows 上这会很容易(呃)。
平台:
如果需要,可以添加其他开源工具。
输入:
something.cs
something.csproj
aPasswordProtected.pfx
输出:
流程:
.csproj
文件中引用转换后的文件。dotnet build
创建未签名的程序集。事后使用其他工具对程序集进行签名。此时我也不关心安全问题。让我们先让它工作起来。然后我们就可以思考如何安全地存储不受保护的密钥文件。
明白了。创建
.snk
文件需要一个中间步骤来制作 .pem
文件(无需密码)。这是 PowerShell 脚本:
& openssl pkcs12 -in "$pfxFilePath" -out "$pemFilePath" -nodes -passin pass:$pfxPassword
$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$pemContent = Get-Content -Path "$pemFilePath" -Raw
$rsa.ImportFromPem($pemContent.ToCharArray())
$keyPair = $rsa.ExportCspBlob($true)
[System.IO.File]::WriteAllBytes($snkFilePath, $keyPair)
这个
.snk
文件您可以直接在您的.csproj
文件中引用,如下所示:
<PropertyGroup>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>$(snkFilePath)</AssemblyOriginatorKeyFile>
</PropertyGroup>
将 $snkFilePath 传递到
dotnet
,如下所示(在 PowerShell 中):
& dotnet build /p:snkFilePath=$snkFilePath