Controller for certificate enrollment (Windows Store apps)

Shows code that implements a System.Web.Mvc controller for serving certificates.

Banking app web service for certificate enrollment

The Windows Store app for banking requires a web service that provides a certificate from a trusted authority.

The following code example shows how to implement a System.Web.Mvc controller that serves a Personal Information Exchange (PFX) certificate.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CERTCLILib;

namespace BankServer.Controllers
{
    public class EnrollmentController : Controller
    {
        internal abstract class Constants
        {
            // Constants for property IDs
            public const int CR_PROP_CAXCHGCERT = 15;
            //const int ants for data types and indexed status
            public const int PROPTYPE_BINARY = 0x3;
            //Constants for binary flags
            public const int CV_OUT_BASE64 = 0x1;
            public const int CR_DISP_ERROR = 0x1;
            public const int CR_DISP_DENIED = 0x2;
            public const int CR_DISP_ISSUED = 0x3;
            public const int CR_DISP_UNDER_SUBMISSION = 0x5;
            public const int CR_IN_BASE64HEADER = 0;
            public const int CR_IN_BASE64 = 0x1;
            public const int CR_IN_BINARY = 0x2;
            public const int CR_IN_ENCODEANY = 0xff;
            public const int CR_IN_FORMATANY = 0x00;
            public const int CR_IN_ROBO = 0x00200000;
            public const int CR_IN_PKCS10 = 0x100;
            public const int CR_IN_PKCS7 = 0x300;
            public const int CR_IN_CMC = 0x400;
            public const int CR_IN_FORMATMASK = 0xff00;

            public const int CR_IN_CLIENTIDNONE = 0x00400000;
            public const int CR_IN_CONNECTONLY = 0x00800000;

            public const int CR_OUT_BASE64HEADER = 0x0;
            public const int CR_OUT_BASE64 = 0x1;
            public const int FR_PROP_FULLRESPONSE = 1;  // Binary
        }

        [HttpPost]
        public JsonResult Submit(string username, string password, string request)
        {
            const string CAConfig = "Devt-StandAloneCA.enrolldev.nttest.microsoft.com\\enrolldev-Devt-StandAlone-CA";

            ICertRequest CertRequest = new CCertRequest();

            CertRequest.Submit(Constants.CR_IN_ENCODEANY,
                               request,
                               "",
                               CAConfig);

            string certificate = 
          CertRequest.GetCertificate(Constants.CR_OUT_BASE64);

            var result = new JsonResult();
            result.Data = new { certificate = certificate };
            return result;
        }

    [HttpPost]
    public JsonResult GetPFX(string username)
        {
            // IX509Enrollment EnrollObj = new CX509Enrollment();
            // EnrollObj.InitializeFromTemplateName(X509CertificateEnrollmentContext.ContextUser, "User");
            // EnrollObj.Enroll();
            // string pfx = EnrollObj.CreatePFX("1111", 0, EncodingType.XCN_CRYPT_STRING_BASE64HEADER);  
      string password = "1111";
      string friendlyName = "My WoodGrove Bank Certificate";
      string pfx = "-----BEGIN CERTIFICATE-----" +
"MIIOvwIBAzCCDnsGCSqGSIb3DQEHAaCCDmwEgg5oMIIOZDCCAd0GCSqGSIb3DQEH"+
"AaCCAc4EggHKMIIBxjCCAcIGCyqGSIb3DQEMCgECoIHMMIHJMBwGCiqGSIb3DQEM"+
"AQMwDgQIJ+Nwezsdl8sCAgfQBIGoaMEnoOeeyN09o99ySQDkqkf9xYIJMjINMWMQ"+
"FN4GywQMF7vULdpPMyia91gu0yfrRZqTgZyNkmitqhZC1J3GkeNp1t+ZS14in2Ga"+
"G8BD95U6W73CmQuSOME4V58b97KhmMcss6HTxnM1EPNIrJcVao7n7XGzXVTJ1xC4"+
"N2U9WJuVLd90tsy72dNSLEIU/XWKe5ZAtU1k0GC/W9gTu0DatRtUPk+M4SRvMYHj"+
"MBMGCSqGSIb3DQEJFTEGBAQBAAAAMF0GCSsGAQQBgjcRATFQHk4ATQBpAGMAcgBv"+
"AHMAbwBmAHQAIABTAG8AZgB0AHcAYQByAGUAIABLAGUAeQAgAFMAdABvAHIAYQBn"+
"AGUAIABQAHIAbwB2AGkAZABlAHIwbQYJKoZIhvcNAQkUMWAeXgBsAGUALQB1AHMA"+
"ZQByAF8AdgAzAC0AYgA3AGQAYgAwADkAOQBmAC0AYwA3ADAAMQAtADQAZABmADIA"+
"LQA5AGQANwA1AC0AYwBkADcAMAA1ADUAYwAyAGYAMgBmADgwggx/BgkqhkiG9w0B"+
"BwagggxwMIIMbAIBADCCDGUGCSqGSIb3DQEHATAcBgoqhkiG9w0BDAEGMA4ECERM"+
"AeQ4kPTeAgIH0ICCDDhlM+J/2aOsG15J3JYx9/XyzpaHZ831/7+t8FNoQMwMceS7"+
"enQKhdl9bpFOc0vIH2MXLlckleUFAuTnZ3WDAX+Co4ojhz3SiFNop6Zbj9tfY37R"+
"EBnTdhOgBsoZtI7gEWV6wT0tkaVnGo4Ya3jp9JRGSogCqaS2BeOqws7hYN7bxlXi"+
"DArm8K35qI882kOE8UlwB3STwJ66cA/BvMvpakTaP/5FShodnxoVjZr+fyDdqsIL"+
"rCGFh+rafjYw5PMMnHFfpoZyY9QWamY/gQTEo8DWHUusElRHGOusiUED+8mrE8qs"+
"TvarLyopuY+59V05GXFp+vBJFLMZwnIohpG33jnyIQr2KP8usLPlQQb+mQBojBPU"+
"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"+
"-----END CERTIFICATE-----";

            var result = new JsonResult();
            result.Data = new { 
          pfx = pfx, 
          friendlyName = friendlyName, 
          password = password
        };
            return result;
        }
    }
}

System.Security.Cryptography.X509Certificates

System.Web.Mvc

CertificateEnrollmentManager

PasswordVault

Working with certificates

Creating a Windows Store app for banking

Create a Windows Store app for banking: resources

 

 

Build date: 6/11/2013