Sunday, 28 August 2016

Digitally signing a webpage using self signed certificate in asp.net

Digital Signature

Digitally Signing a Web page as the name implies signing a webpage using digital certificate for maintaining the authenticity of the page. The most common use of a digital certificate is to verify that a user sending a message is who he or she claims to be, and to provide the receiver with the means to encode a reply. We can either use self-signed certificate or the certificate issued by Certificate authority (CA). The CA issues an encrypted digital certificate containing the applicant’s public key and a variety of other identification information. The CA makes its own public key readily available through print publicity or perhaps on the internet. Both self-signed and CA signed certificates provide encryption for data in motion. A CA-signed certificate also provide authentication – a level of assurance that the site is what it reports to be, and not an impostor website.

Implementation


Step 1: Here I am using Self-signed certificate for signing the webpage. So first step will be to create the Self-signed certificate. Open IIS Manager by going to start and type inetmgr to open IIS. Choose server certificate and click create self-signed certificate in the action pane.
IIS Manager

Create Self Signed Certificate

Step 2: export the certificate, double click on your certificate, go to details and choose copy to file. Export the private keys, otherwise we are going to face key not found error.
Save Certificate
Export Private keys
Choose personal information exchange
Set password for your certificate
Give name to your pfx file
Complete the certificate wizard
Step 3: place your certificate in the certificate store. Open Microsoft management console by going to start and type mmc.
Go to file and choose add/remove snap in option. Choose Certificates add and click ok. Choose the location where you want to save the certificate
Microsoft Management console
Choose My user Account Locally or Computer Account when on Server
Step 4: go to Personal folder, right click to import the certificate in the certificate store. Choose the certificate which you want to import
import the certificate
Choose the Certificate
password the certificate
Place the certificate in the Store
Complete the import process
Step 5: export the certificate, which we are going to verify the digital signature. Follow the same steps as discussed above.
Export the Certificate
Export the Certificate
Name your Certificate and complete the process
Step 6: now certificate is created and placed in the certificate store, now is the time to use in our program.

In aspx file: in designing page we are placing the code to show, whether document is digitally signed or not.

<div>
            <asp:Label ID="lblHeading" runat="server" Text="Digital signature"></asp:Label><br />
            <br />
            <asp:Panel runat="server" BorderWidth="1" BorderColor="Black" Width="250">
                <asp:Label runat="server" ID="lblSigned" ></asp:Label><br />
                <asp:Label ID="lbltext" runat="server"></asp:Label>
            </asp:Panel>
        </div>


In aspx.cs file: in code file, we are signing and verifying the signature.

     protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            // Sign text
            byte[] signature = Sign("DigitalSign", "CN=789rain");
           
            //Verify Text
            if (Verify("DigitalSign", signature, @"E:\search\Digital Signature\DigitalSignature.cer"))
            {
                lblSigned.Text = "Digitally Signed By :";
                lbltext.Text = "Sanjeet";
            }
            else
            {
                lbltext.Text = "ERROR: Signature not valid!";
            }
        }
        catch (Exception ex)
        {
            lbltext.Text = "EXCEPTION: " + ex.Message;
        }
    }

    static byte[] Sign(string text, string certSubject)
    {
        // Access Personal (MY) certificate store of current user
        X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        my.Open(OpenFlags.ReadOnly);


        // Find the certificate we’ll use to sign           
        RSACryptoServiceProvider csp = null;
        foreach (X509Certificate2 cert in my.Certificates)
        {
            if (cert.Subject.Contains(certSubject))
            {
                // We found it.
                // Get its associated CSP and private key
                csp = (RSACryptoServiceProvider)cert.PrivateKey;
            }
        }
        if (csp == null)
        {
            throw new Exception("No valid cert was found");
    // Hash the data
        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        // Sign the hash
        return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    }
    protected bool Verify(string text, byte[] signature, string certPath)
    {
        // Load the certificate we’ll use to verify the signature from a file
        X509Certificate2 cert = new X509Certificate2(certPath);
        RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;


        // Hash the data
        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);


        // Verify the signature with the hash
        return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), signature);
    }

Step 7: if certificate is valid and signed text is verified than signature signed by Sanjeet will be shown otherwise Invalid certificate will be shown
Valid Certificate Message

0 comments:

Post a Comment