Te paso un ejemplo que está funcionando
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
namespace PXW_DatosAFIPLibrary.BizRules
{
/// <summary>
/// Se encarga de manipular los aspectos relativos a los
certificados del equipo
/// Permite recuperar un certificado en particuar, y firmar
documentos CMS (PKCS #7)
/// a partir de un certificado
/// </summary>
class CertMan
{
/// <summary>
/// carga el certificado
/// </summary>
/// <returns>el certificado cargado</returns>
/// <param name="file"></param>
public X509Certificate2 LoadCert(String file, String password)
{
X509Certificate2 cert = new X509Certificate2(file,password);
return cert;
}
/// <summary>
/// crea un mensaje CMS a partir de un certificado firmado
/// Es necesario contar con un certificado en el repositorio,
cuya entidad firmante
/// se encuentre en el repositorio rusted Root Certification
Authorities, además
/// el certificado a utilizar debe tener la clave privada
includida (en caso contrario este método lanza una excepción)
/// , para hacer esto se puede utilizar el opensssl creando un
certificado PKCS#12 export y crear
/// un certificado pfx a partir del .cer que suministra AFIP +
la clave privada
/// </summary>
/// <param name="data">los datos que se desean empaquetar en
el CMS</param>
/// <param name="signingCert">un certificado firmado válido</param>
/// <returns>un array de bytes PKCS #7</returns>
public byte[] Sign(byte[] data, X509Certificate2 signingCert)
{
byte[] signedBytes = null;
try
{
ContentInfo content = new ContentInfo(data);
SignedCms signedMessage = new SignedCms(content);
CmsSigner signer = new CmsSigner(signingCert);
signedMessage.ComputeSignature(signer);
signedBytes = signedMessage.Encode();
}
catch (Exception)
{
throw;
}
return signedBytes;
}
/// <summary>
/// Muestra una lista de todos los certificados
/// </summary>
public void ShowAll()
{
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadOnly);
store.Certificates.Find(X509FindType.FindBySubjectName, "",true);
foreach (X509Certificate2 cert in store.Certificates)
{
Console.WriteLine(cert.Subject);
}
}
/// <summary>
/// Abre el repositorio My (personal) de certificados y
busca una credencial determinada
/// </summary>
/// <param name="friendyName">el friendtName del certifiado
dentro del repositorio del windows</param>
/// <returns>un certificado, en caso de no encontrarlo lanza
una excepción</returns>
public X509Certificate2 GetSignerCert(String friendlyName)
{
X509Store storeMy = new X509Store(StoreName.My,
StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.ReadOnly);
X509Certificate2 retCert = new X509Certificate2();
foreach(X509Certificate2 cer in storeMy.Certificates)
{
if (cer.FriendlyName == friendlyName) retCert = cer;
}
if (retCert.FriendlyName == "") throw new
CertificateManagerException("No se encuentra el certificado en el
repositorio con el friendlyName " + friendlyName);
storeMy.Close();
return retCert;
}
}
[Serializable]
public class CertificateManagerException : Exception
{
public CertificateManagerException() { }
public CertificateManagerException(string message) : base(message) { }
public CertificateManagerException(string message, Exception
inner) : base(message, inner) { }
protected CertificateManagerException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
}
Lo que deberías hacer es llamar al método Sign y pasarle los datos que
querés firmar (el certificado lo podes firmar con el CryptoStudio) y
el certificado, hay un método GetSignedCert que recupera el
certificado del repositorio de windows (del usuario actual).
On 6/11/07, Ana Lucas <[EMAIL PROTECTED]> wrote:
Acá hay info muy completa y ejemplos
http://msdn2.microsoft.com/en-us/library/93bskf9z.aspx
Saludos,
Ana.
________________________________
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Adrian
Lasso
Enviado el: Lunes 11 de Junio de 2007 19:22
Para: [email protected]
Asunto: [puntonet] Implementación de firma digital para los datos
Colegas,
Estoy buscando información para implementar la firma digital en datos
sensibles de una aplicación.
La idea principal es que la aplicación permita firmar los registros de
tablas críticas de forma tal que se pueda detectar cuando son modificados.
Si alguno trabajo en el tema y me envía links, ejemplos, etc, serán
bienvenidos.
Desde ya muchas gracias,
Adrian
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.472 / Virus Database: 269.8.11/837 - Release Date: 06/06/2007
14:03
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.472 / Virus Database: 269.8.11/837 - Release Date: 06/06/2007
14:03