Archivo de junio 2010


Cómo firmar un documento PDF desde C# con iTextSharp

Jueves, 24 jun, 2010 @ 18:40 | Por Gustavo Cantero (The Wolf) | .NET Framework, Certificados Digitales, Seguridad

Muchas veces tenemos que firmar un PDF utilizando un certificado X.509, y el iTextSharp (una excelente librería) nos puede ayudar a realizar esta tarea. Para esto les dejo un método que utilizo para hacer esto, que seguramente les va a ser de utilidad.

Para poder utilizar este código deben bajarse la librería iTextSharp (http://sourceforge.net/projects/itextsharp), y referenciar esta DLL y “System.Security” desde su proyecto.

A continuación les dejo el código:

using System;
using System.Collections;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using iTextSharp.text;
using iTextSharp.text.pdf;
using Org.BouncyCastle.X509;
using SysX509 = System.Security.Cryptography.X509Certificates;

/// <summary>
/// Helper para el firmado de PDFs con la librería iTextSharp
/// </summary>
public static class PDF
{
    /// <summary>
    /// Firma un documento
    /// </summary>
    /// <param name="Source">Documento origen</param>
    /// <param name="Target">Documento destino</param>
    /// <param name="Certificate">Certificado a utilizar</param>
    /// <param name="Reason">Razón de la firma</param>
    /// <param name="Location">Ubicación</param>
    /// <param name="AddVisibleSign">Establece si hay que agregar la firma visible al documento</param>
    public static void SignHashed(string Source, string Target, SysX509.X509Certificate2 Certificate, string Reason, string Location, bool AddVisibleSign)
    {
        X509CertificateParser objCP = new X509CertificateParser();
        X509Certificate[] objChain = new X509Certificate[] { objCP.ReadCertificate(Certificate.RawData) };

        PdfReader objReader = new PdfReader(Source);
        PdfStamper objStamper = PdfStamper.CreateSignature(objReader, new FileStream(Target, FileMode.Create), '\0');
        PdfSignatureAppearance objSA = objStamper.SignatureAppearance;

        if (AddVisibleSign)
            objSA.SetVisibleSignature(new Rectangle(100, 100, 300, 200), 1, null);

        objSA.SignDate = DateTime.Now;
        objSA.SetCrypto(null, objChain, null, null);
        objSA.Reason = Reason;
        objSA.Location = Location;
        objSA.Acro6Layers = true;
        objSA.Render = PdfSignatureAppearance.SignatureRender.NameAndDescription;
        PdfSignature objSignature = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
        objSignature.Date = new PdfDate(objSA.SignDate);
        objSignature.Name = PdfPKCS7.GetSubjectFields(objChain[0]).GetField("CN");
        if (objSA.Reason != null)
            objSignature.Reason = objSA.Reason;
        if (objSA.Location != null)
            objSignature.Location = objSA.Location;
        objSA.CryptoDictionary = objSignature;
        int intCSize = 4000;
        Hashtable objTable = new Hashtable();
        objTable[PdfName.CONTENTS] = intCSize * 2 + 2;
        objSA.PreClose(objTable);

        HashAlgorithm objSHA1 = new SHA1CryptoServiceProvider();

        Stream objStream = objSA.RangeStream;
        int intRead = 0;
        byte[] bytBuffer = new byte[8192];
        while ((intRead = objStream.Read(bytBuffer, 0, 8192)) > 0)
            objSHA1.TransformBlock(bytBuffer, 0, intRead, bytBuffer, 0);
        objSHA1.TransformFinalBlock(bytBuffer, 0, 0);

        byte[] bytPK = SignMsg(objSHA1.Hash, Certificate, false);
        byte[] bytOut = new byte[intCSize];

        PdfDictionary objDict = new PdfDictionary();

        Array.Copy(bytPK, 0, bytOut, 0, bytPK.Length);

        objDict.Put(PdfName.CONTENTS, new PdfString(bytOut).SetHexWriting(true));
        objSA.Close(objDict);
    }

    /// <summary>
    /// Crea la firma CMS/PKCS #7
    /// </summary>
    private static byte[] SignMsg(byte[] Message, SysX509.X509Certificate2 SignerCertificate, bool Detached)
    {
        //Creamos el contenedor
        ContentInfo contentInfo = new ContentInfo(Message);

        //Instanciamos el objeto SignedCms con el contenedor
        SignedCms objSignedCms = new SignedCms(contentInfo, Detached);

        //Creamos el "firmante"
        CmsSigner objCmsSigner = new CmsSigner(SignerCertificate);

        // Include the following line if the top certificate in the
        // smartcard is not in the trusted list.
        objCmsSigner.IncludeOption = SysX509.X509IncludeOption.EndCertOnly;

        //  Sign the CMS/PKCS #7 message. The second argument is
        //  needed to ask for the pin.
        objSignedCms.ComputeSignature(objCmsSigner, false);

        //Encodeamos el mensaje CMS/PKCS #7
        return objSignedCms.Encode();
    }
}

Descargar proyecto de ejemploAquí les dejo un proyecto de ejemplo donde se pide un PDF a firmar, luego donde escribir PDF firmado y toma el primer certificado personal que posea clave privada y lo utiliza para firmar el PDF.

Espero que este código les sea de utilidad.
Suerte!

Artículos relacionados

VN:F [1.7.3_972]
Rating: 10.0/10 (1 voto cast)

Obtener lista de contactos de Gmail

Miércoles, 16 jun, 2010 @ 18:50 | Por Gustavo Cantero (The Wolf) | Interconexión y redes sociales

Cada día son más las aplicaciones y sitios que se conectan y consumen servicios de otros proveedores, como Windows Live, Gmail, Yahoo!, Facebook, Twitter, MySpace, etc., por tal motivo me pareció bueno hacer una serie de artículos para explicar cómo utilizar varios de esos servicios desde .NET.

En este primer artículo de la serie voy a explicar cómo obtener la lista de contactos de la cuenta de un usuario de Gmail utilizando su “usuario” y “contraseña”.

Para comenzar cabe mencionar que Google nos provee una API y su correspondiente librería para .NET para facilitar la utilización del servicio “Google Contacts”. Esta librería es parte del paquete “Google Data API”, y el SDK para .NET se puede descargar desde esta dirección: http://code.google.com/p/google-gdata/downloads/list.

Una vez bajado e instalado este paquete necesitamos que nuestro proyecto, el que va a leer las direcciones de correo de la libreta de direcciones del usuario, tenga la referencia a tres librerías del paquete antes bajado:

  • Google.GData.Client
  • Google.GData.Contacts
  • Google.GData.Extensions

La primera librería es la que nos permite conectarnos al servicio de Google Data, la segunda es la que nos da la posibilidad de consultar y modificar los contactos del usuario, y la última la necesitamos porque algunos tipos de datos (como el e-mail) están declarados como clases en ella.

Ahora bien, con nuestra aplicación referenciando a estas DLLs ya podemos consultar los mails, simplemente tenemos que utilizar la clase ContactsRequest la cual utiliza la clase RequestSettings para establecer el usuario y clave, luego solamente hay que leer la información obtenida. Pero como 10 líneas de código valen más que 1000 palabras, acá les dejo un método que, suministrándole un usuario y contraseña, nos devuelve la lista de contactos con su e-mail:

using System.Collections.Generic;
using Google.Contacts;
using Google.GData.Client;
using Google.GData.Extensions;

public static class GMail
{
    /// <summary>
    /// Datos de una cuenta
    /// </summary>
    public struct Account
    {
        /// <summary>
        /// Nombre de la cuenta
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// Dirección de correo de la cuenta
        /// </summary>
        public string Address { get; set; }
    }

    /// <summary>
    /// Nos devuelve la lista de contactos con su e-mail
    /// </summary>
    /// <param name="Account">Cuenta de correo del usuario</param>
    /// <param name="Password">Contraseña</param>
    /// <returns>Lista de contactos</returns>
    public static List<Account> GetContacts(string Account, string Password)
    {
        List<Account> objResult = new List<Account>();
        RequestSettings objRS = new RequestSettings("Aplicación de ejemplo", Account, Password);
        ContactsRequest objCR = new ContactsRequest(objRS);

        Feed<Contact> objFeed = objCR.GetContacts();
        foreach (Contact objContact in objFeed.Entries)
            foreach (EMail objEmail in objContact.Emails)
                objResult.Add(new Account()
                {
                    Title = objContact.Title,
                    Address = objEmail.Address
                });

        return objResult;
    }
}

Espero que les sea de utilidad.
Suerte!

VN:F [1.7.3_972]
Rating: 10.0/10 (2 votos cast)

Pósters de tecnologías y productos de Microsoft

Martes, 08 jun, 2010 @ 13:56 | Por Gustavo Cantero (The Wolf) | .NET Framework, Visual Studio

Visual Studio

Visual Studio 2010 Quick Reference Guidance
Guía de referencia rápida de Visual Studio 2010. También en español.

Visual Studio 2010 Keybinding Cards
Configuración de las teclas de Visual Studio 2010 para Visual Basic, Visual C#, Visual C++ y Visual F#.

Visual C# 2008 Keybinding Reference Poster
Configuración de las teclas de Visual Studio 2008 y Visual Studio Express para Visual C#.

Visual Basic 2008 Keybinding Reference Poster
Configuración de las teclas de Visual Studio 2008 y Visual Studio Express para Visual Basic.

Visual C++ 2008 Keybinding Reference Poster
Configuración de las teclas de Visual Studio 2008 y Visual Studio Express para Visual C++.

Visual C# 2005 Keyboard Shortcut Reference Poster
Configuración de las teclas de Visual Studio 2005 para Visual C#.

Visual Basic 2005 Keyboard Shortcut Reference Poster
Configuración de las teclas de Visual Studio 2005 para Visual Basic.

Visual C++ 2005 Keyboard Shortcut Reference Poster
Configuración de las teclas de Visual Studio 2005 para Visual C++.

.NET Framework

.NET Framework 4.0 Namespaces and Types Poster
Poster con las más importantes clases y Namespaces de .NET Framework 4.0.

.NET Framework 3.5 Common Namespaces and Types Poster
Poster con las clases y Namespaces más utilizados de .NET Framework 3.5.

.NET Framework 3.0 Namespaces and Types Poster
Poster con las clases y Namespaces más utilizados de .NET Framework 3.0.

.NET Framework 2.0 Commonly used Types and Namespaces
Poster con las clases y Namespaces más utilizados de .NET Framework 2.0.

Silverlight

Microsoft Silverlight 2 Developer Reference Poster
Poster de referencia de Silverlight 2.0

Microsoft Silverlight 1.1 Developer Reference Poster
Poster de referencia de Silverlight 1.1

BizTalk Server

BizTalk Server 2009 Runtime Architecture Poster
Detalle del flujo típico de mensajes y datos y referencias de BizTalk 2009.

BizTalk Server 2009 Capabilities Poster
Lista de las capacidades de BizTalk Server 2009.

BizTalk Server 2009 Scale-out Configurations Poster
Este póster describe las configuraciones típicas de las configuraciones y opciones de BizTalk Server 2009.

BizTalk Server 2009 Database Infrastructure Poster
Descripción de la base de datos, componentes asociados, trabajos, servicios, UI y eventos.

BizTalk Server 2009 BAM Poster
Este poster permite comprender los conceptos, procesos y gestión del BAM.

BizTalk ESB Toolkit Architecture Poster
Arquitectura del ESB Toolkit.

BizTalk Adapter Pack 2.0/WCF LOB Adapter SDK Poster
Este póster describe la funcionalidad, componentes, arquitectura y escenarios de uso/hosting de BizTalk Adapter Pack 2.0 y el WCF LOB Adapter SDK.

BizTalk Server 2006 R2 Runtime Architecture Poster
Detalle de los módulos y componentes de la arquitectura de BizTalk Server 2006 R2, junto con su flujo típico de mensajes y datos.

BizTalk Server 2006 R2 Scale-Out Configurations
Configuraciones y opciones de BizTalk Server 2006 R2.

BizTalk Server 2006 R2 Capabilities Poster
Lista de las capacidades de BizTalk Server 2006 R2.

BizTalk Server 2006 R2 Database Infrastructure Poster
Descripción de la base de datos, componentes asociados, trabajos, servicios, UI y eventos.

BAM Poster for Microsoft BizTalk Server 2006 R2
Este poster permite comprender los conceptos, procesos y gestión del BAM.

Exchange Server

Exchange Component Architecture Poster
Arquitectura y características de Microsoft Exchange Server 2007.

Windows Server

Windows Server 2008 R2 Feature Components Poster
Este póster proporciona una referencia visual de las tecnologías clave en Windows Server 2008 R2.

Windows Server 2008 R2: Hyper-V Component Architecture
Este póster proporciona una referencia visual para las tecnologías clave de comprensión en Windows Server 2008 R2 Hyper-V.

Windows Server 2008 Component Posters
Póster de componentes de Windows Server 2008, originalmente impreso en la edición de julio de 2007 de TechNet Magazine.

Windows Server 2008 Component Posters
Póster con los componentes de Windows Server 2008, originalmente impreso en el TechNet Magazine de Julio de 2007.

TechNet Magazine Active Directory Component Jigsaw Poster
Póster de Active Directory Component, originalmente impresor en el TechNet Magazine de marzo-abril de 2006.

Office

2007 Microsoft Office System Logical Architecture
Arquitectura de Office 2007.

Developer Map for the 2007 Microsoft® Office system
Mapa de desarrollo de Microsoft Office 2007,

Microsoft® Office InfoPath® 2007 Managed Object Model
Mapa con el modelo de objetos de Microsoft InfoPath 2007.

Developer Map for SharePoint® Products and Technologies
Mapa de desarrollador para SharePoint productos y tecnologías

P&P

PnP Overview Poster
Póster de introducción de patrones y prácticas

Smart Client Poster
Póster de patrones y prácticas de Smart Client

Microsoft CRM

Microsoft CRM 3.0 Logical Database Diagrams
Diagrama de la base de datos de Microsoft CRM 3.0.

Microsoft CRM 1.2 Logical Database Diagram
Diagrama de la base de datos de Microsoft CRM 1.2.

VN:F [1.7.3_972]
Rating: 0.0/10 (0 votos cast)