Pregunta

¿Cómo puedo estar seguro de que estoy accediendo a los Certificados de mi tarjeta inteligente y no formar mi almacén de certificados personales en c #? y ¿Cómo puedo hacer que mi RSACryptoProvider a utilizar mi clave privada del certificado de tarjeta inteligente?

gracias

Wally

¿Fue útil?

Solución

A veces, especialmente si no está usando por defecto el nombre del contenedor de claves en la tarjeta inteligente (recomendado por Microsoft), los certificados no se copian al almacén de certificados local. La solución es utilizar la API de cifrado para acceder a la llave con KP_CERTIFICATE, construir certificado partir de los datos recuperados, y asignarle una nueva RSACryptoServiceProvider construido utilizando su propio nombre de contenedor de claves.

El pseudo código C # sigue:

int reti = CryptoApi.CryptGetUserKey(_hprovider, keytype, ref userKey);

if (reti)
{
    reti =CryptoApi.CryptGetKeyParam(_userKey, KP_CERTIFICATE, ref  pbdata, ref pwddatalen, 0);
}

if (reti || pwddatalen>0)
{
    byte[] data = new byte[pwddatalen];
    ret  = CryptoApi.CryptGetKeyParam(_userKey, KP_CERTIFICATE, data, ref pwddatalen, 0);
    if (ret) 
    {
        X509Certificate2 c = new X509Certificate2(data);
        X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint, c.Thumbprint, validonly);
        store.Close();

        if (col.Count != 1) 
        {
            //not found in store - CSP didn't copy it
            c.PrivateKey = PrivateKey(keytype);
            return c;
        }
        else
        {
            return col[0];
        }
    }
}


private RSACryptoServiceProvider PrivateKey (KeyType keytype)
{
    CspParameters csparms = new CspParameters();
    csparms.KeyContainerName = _containerName;
    csparms.ProviderName = _provider;
    csparms.ProviderType = 1;
    csparms.Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey;
    csparms.KeyNumber = (int)keytype;

    return new RSACryptoServiceProvider(csparms);
}

Otros consejos

Usted tendrá que ir a través de su proveedor de servicios de cifrado (CSP) para su tarjeta inteligente. En Windows (2000, XP y Vista) cada vez que inserte su tarjeta inteligente en un lector de tarjeta inteligente todos los certificados en que se propogated a su almacén de certificados personales. La clave privada se mantiene en su tarjeta inteligente. Lo que esto significa es que si usted utiliza su certificado (por ejemplo, para firmar digitalmente un e-mail) a continuación, se le pedirá que inserte la tarjeta inteligente. Si su tarjeta inteligente requiere un PIN, se le pedirá a la entrada de la misma. La razón de esto es que no hay un solo lugar para aplicaciones para buscar certificados de usuario, el almacén de certificados personales, por lo que las aplicaciones no tienen que ser reescrito sólo para manejar certificados de tarjetas inteligentes.

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