Come proteggere una class library rendendola accessibile ai soli assembly firmati

Così come il più noto attributo StrongNameIdentityPermission che autorizza solo gli Assembly con un dato strong name a richiamare una library (tutta intera, solo alcune classi o solo alcuni metodi) c'è anche l'attributo PublisherIdentityPermission che autorizza in base al certificato (X.509 v.3 Software Publisher's Certificate) dell'assembly chiamante.

I tool di .NET makecert.exe, cert2spc.exe e permettono di creare un certificato di test e la relativa chiave privata necessaria a creare un Assembly ed il tool signcode.exe permette infine di firmare l'assembly chiamante con il certificato. Ad esempio: 

    makecert -sv CertPrivateKey.pvk Cert.cer
    cert2spc Cert.cer Cert.spc
    signcode /spc Cert.spc /v CertprivateKey.pvk AssemblyChiamante.exe

Il seguente codice è sufficiente per dare l'autorizzazione a richiamare il metodo Class1.MetodoProtetto() ai soli Assembly firmati con Cert.cer (N.B. rispetto alla sicurezza vale quanto già detto
qui):

[sysPrm.PublisherIdentityPermission(sysPrm.SecurityAction.LinkDemand, CertFile=@"Cert.cer")]
public void MetodoProtetto() 
{
      // ...

Il seguente codice invece permette di accedere in maniera programmatica al certificato dell'Assembly chiamante:

sysSecPol.Publisher pub = null;
foreach (object item in sysRfl.Assembly.GetCallingAssembly().Evidence)
{
      pub = item
as sysSecPol.Publisher;
      
if (pub != null) {
            Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}"
               
,cert.GetEffectiveDateString()
                ,cert.GetExpirationDateString()
                ,cert.GetIssuerName()
                ,cert.GetKeyAlgorithm()
                ,cert.GetPublicKeyString()
                ,cert.GetSerialNumberString()
                ,cert.GetFormat()
                ,cert.GetCertHashString()
            
);
           break;
      }
}

Mentre il certificato con cui viene firmato l'Assemly è un X.509 v.3, il certificato che mi risulta nella firma dell'Assembly è un X.509 v.2 e quindi non sono disponibili l'attributo ExpirationDate con il quale sarebbe possibile porre un ulteriore vincolo sulla data di validità del certificato.

Print | posted @ Thursday, January 26, 2006 6:58 PM

Comments have been closed on this topic.