请注意,我使用的是 SHA512,但 SHA256 将适用于以下示例:
“指定的算法无效”我花了很长时间才弄清楚,我几乎尝试了所有方法。
第 1 步 - 证书必须是 SHA512 并使用支持 SHA512 的 CSP(加密服务提供商)。以下是 CSP 及其功能的列表。如果您寻找 SHA512,您会找到“Microsoft Enhanced RSA and AES Cryptographic Provider”。默认情况下生成证书不使用它(至少在 Windows 中),因此您必须在创建证书时指定它。
如果您使用 openssl 创建证书,您可以使用下面的选项 -CSP 设置正确的 CSP 以使其正常工作。如果您有现有的 pfx,可以使用 openssl 将其转换为 PEM 文件,然后再转换回 pfx 以添加选项。
创建私钥和证书 - 此步骤将询问您问题、州、地区等。
openssl req -x509 -nodes -sha512 -newkey rsa:2048 -keyout 512key.pem -out 512cert.pem -days 3650
使用 Microsoft 增强型 RSA 和 AES 加密提供程序创建 PFX 文件以导入您的证书存储:
openssl pkcs12 –export –in 512cert.pem –inkey 512key.pem –CSP “Microsoft Enhanced RSA and AES Cryptographic Provider” –out 512pfx.pfx
第 2 步: 支持 Gonzalo Gallotti 将链接发布到帮助我的代码段。我评论了我的代码以显示每个步骤在做什么。注意:如果没有步骤 1 中所述的正确生成的证书,此代码将无法工作
public void GetCertificate() {
// Get the Machine Cert Store
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
string alg = CryptoConfig.MapNameToOID("SHA512");
// Open the cert store
store.Open(OpenFlags.ReadWrite);
// Loop through each certificate within the store
foreach (X509Certificate2 myCert in store.Certificates)
{
// Get the certificate we are looking for
if (myCert.IssuerName.Name.Contains("CN=YourSite"))
{
// Check if the certificate has a private key
if (myCert.HasPrivateKey)
{
// Get your custom signature as a string
string mySignature = GetSignatureString();
// Convert signature to byte array
byte[] originalData = Encoding.UTF8.GetBytes(mySignature);
// Create RSA provider from private key
RSACryptoServiceProvider rsaProvider = (RSACryptoServiceProvider)myCert.PrivateKey;
// Sign the signature with SHA512
byte[] signedSignature = signedSignature = rsaProvider.SignData(originalData, alg);
if (rsaProvider.VerifyData(originalData, alg, signedSignature))
{
// Signature is verified Do Stuff
}
else
{
throw new Exception("The data does not match the signature.");
}
}
}
}
}