System.Security.Cryptography.Pkcs 的 ComputeSignature 方法适用于 localhost,但不适用于 Azure 应用服务

The ComputeSignature method of System.Security.Cryptography.Pkcs works on localhost but not on an azure app service

提问人:fernando rodriguez 提问时间:9/12/2023 更新时间:10/4/2023 访问量:16

问:

我正在开发一个 c# Web API。我添加了一个类库来连接到外部 Web 服务。要登录到该资源,将执行以下方法:

        /// <summary>
        /// Firma mensaje
        /// </summary>
        /// <param name="messageBytes">Bytes del mensaje</param>
        /// <param name="signerCertificate">Certificado usado para firmar</param>
        /// <returns>Bytes del mensaje firmado</returns>
        /// <remarks></remarks>
        public static byte[] SignMessageBytes(byte[] messageBytes, X509Certificate2 signerCertificate)
        {
            const string ID_FNC = "[FirmaBytesMensaje]";
            try
            {
                // Pongo el mensaje en un objeto ContentInfo (requerido para construir el obj SignedCms)
                var contentInfo = new ContentInfo(messageBytes);
                var signedCms = new SignedCms(contentInfo);

                // Creo objeto CmsSigner que tiene las caracteristicas del firmante
                var cmsSigner = new CmsSigner(signerCertificate)
                {
                    IncludeOption = X509IncludeOption.EndCertOnly
                };

                if (VerboseMode) Console.WriteLine(ID_FNC + "***Firmando bytes del mensaje...");
                // Firmo el mensaje PKCS #7
                signedCms.ComputeSignature(cmsSigner);

                if (VerboseMode) Console.WriteLine(ID_FNC + "***OK mensaje firmado");
                // Encodeo el mensaje PKCS #7.
                return signedCms.Encode();
            }
            catch (Exception ex)
            {
                throw new Exception(ID_FNC + "***Error al firmar: " + ex.Message);
            }
        }

这在本地主机环境中完美运行。但是,当我将其发布到 Azure 应用服务时,它失败并出现以下错误: 在行中The system cannot find the file specified.

signedCms.ComputeSignature(cmsSigner);

不知道原因可能是什么。如果有人有关于应用服务所需的任何额外配置的信息,那将对我有很大帮助。非常感谢!

获取 SignMessageBytes 方法以在 Azure 环境中工作

C# .NET Web 服务 SOAP 后端

评论


答:

0赞 الرحمن الرحیم 10/4/2023 #1

尝试如下代码更改:

// Find the certificate by thumbprint
X509Certificate2Collection certs = store.Certificates.Find(
    X509FindType.FindByThumbprint,
    "your-thumbprint",
    false
);

if (certs.Count > 0)
{
    X509Certificate2 signerCertificate = certs[0];
    // Continue with signing using signerCertificate
}
else
{
    throw new Exception("Certificate not found.");
}

将“your-thumbprint”替换为证书的实际指纹。