Pregunta

Estoy intentando establecer el nombre descriptivo del certificado durante el proceso de solicitud / aceptación del certificado. Entiendo que esto es una propiedad de Microsoft Store en lugar del certificado y me pregunto qué técnica .net / c # podría usarse para configurarlo.

¿Fue útil?

Solución 2

Así que aquí hay un ejemplo de línea de comando de cómo hacer esto. Necesita CAPICOM de Microsoft que envuelve la CryptoAPI.

El nombre descriptivo es una propiedad del almacén de certificados en lugar del certificado, por lo que este código importa un certificado al almacén de certificados y establece el nombre amistoso al hacerlo.

El código toma dos parámetros: la ruta al archivo cert y el nombre descriptivo que desea establecer.

Código: -

using System;

using System.Collections.Generic;

using System.Text;

using CAPICOM;

using System.Collections;

using System.Runtime.InteropServices;


namespace CertTool

{

    class Program
    {
        const uint CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x20000;
        const int CAPICOM_PROPID_FRIENDLY_NAME = 11;
        const int CAPICOM_ENCODE_BINARY = 1;

        static private String _currStoreName = "My";
        static private String _FriendlyName = "Not Set";
        static private String _CertPath = "C:\\test.cer";
        static StoreClass _oCurrStore;
        static ExtendedPropertyClass _friendlyProp;
        static CertificateClass _certificate;
        static ExtendedProperties _extendedProp;

        static void Main(string[] args)
        {
            try
            {
                //Friendly name Argument
                if (args.Length > 0)
                {
                    _FriendlyName = args[0];
                }
                //Certpath argument
                if (args.Length > 1) 
                {
                    _CertPath = args[1];
                }
                //Set and open the Store
                _oCurrStore = new StoreClass();
                _oCurrStore.Open(
                    CAPICOM_STORE_LOCATION.CAPICOM_LOCAL_MACHINE_STORE,
                    _currStoreName,
                    CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY |
                    CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
                //Call the import certificate function
                importCert();
            }
            catch(Exception ex){
                Console.WriteLine(ex.Message);
                Console.WriteLine(args[0]);
            }
        }
        //Function import the certificate to the machine store and sets the friendly name
        static bool importCert()
        {
            try
            {
                //Create Certificate Object
                _certificate = new CertificateClass();
                //Load the certificate into the obejct from file
                _certificate.Load(_CertPath, "", CAPICOM_KEY_STORAGE_FLAG.CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_KEY_LOCATION.CAPICOM_LOCAL_MACHINE_KEY);
                //Create extended property Class for friendly name
                _friendlyProp = new ExtendedPropertyClass();
                _friendlyProp.PropID =  CAPICOM_PROPID.CAPICOM_PROPID_FRIENDLY_NAME;
                _friendlyProp.set_Value(CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY, _FriendlyName);

                //Add extendedProp on cert object
                _extendedProp = _certificate.ExtendedProperties();
                //Set extendded prop to friendly name object
                _extendedProp.Add(_friendlyProp);
                _oCurrStore.Add(_certificate);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(_CertPath);
                return true;
            }
        }
    }
}

Otros consejos

Utilice X509Certificate2.FriendlyName. Sin embargo, debe exportar el certificado como PFX / PKCS # 12:

X509Certificate2 certificate = new X509Certificate2(...);
certificate.FriendlyName = "MyName";
File.WriteAllBytes(path, certificate.Export(X509ContentType.Pkcs12));

Ok, encontré una respuesta a eso aquí:

Hola,

Por favor, eche un vistazo a esto para verificar si se adapta a sus necesidades:

Cuando ejecute el código .net en el entorno X64, recibirá el siguiente mensaje de error.

" Falló: se recuperó la fábrica de clases COM para el componente con CLSID .... "

Por ejemplo, en el lado del servidor de Exportación / Importación de CMS Código .net = " ExportSiteContentIncremental (...) Error: la recuperación de la fábrica de clase COM para el componente con CLSID {CA0752B3-021C-4F99-82E3-2C0F19C5E953} falló debido a lo siguiente error: 80040154. "

SOLUCIÓN DE TRABAJO:

La solución alternativa posible es modificar la plataforma de su proyecto de 'Cualquier CPU' a 'X86' (en Propiedades del proyecto, Destino de construcción / plataforma)

ROOTCAUSE

El Interop VSS es un ensamblaje administrado que utiliza el Marco de 32 bits y la dll contiene un objeto COM de 32 bits. Si ejecuta esta DLL de COM en un entorno de 64 bits, aparecerá el mensaje de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top