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

8cdiaqws  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(112)

我正在开发一个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);

不知道是什么原因。如果任何人有关于应用程序服务需要的任何额外配置的信息,这将对我有很大的帮助。太感谢你了!
在Azure环境中使用SignMessageMessage方法

mxg2im7a

mxg2im7a1#

尝试如下代码更改:

// 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”替换为证书的实际指纹。

相关问题