7

Closed

omogućiti dohvat certifikata po nečemu drugom osim po nazivu certifikata

description

u situaciji kada imam serversku obradu fiskalizacije za više firmi , u certificate storu se nalazi više FISKAL 1 certifikata ali su oni od različitih firmi ... dakle bilo bi dobro kada bi se omogućio dohvat po npr. OIB-u iz zaglavlja certifikata
Closed Oct 11, 2016 at 11:23 AM by nrasinec

comments

pweigand wrote Dec 13, 2012 at 6:25 AM

Ova funkcija traži po certifikat thumbprintu, to je ipak SHA hash koji jedinstveno obilježava svaki certifikat pa mi zgleda najbolje njega za koristiti, a lako ga je pročitati iz "internet options -> certificates" propertya na certifikatu:

public static X509Certificate2 DohvatiCertifikatBySHA(string ShaHash, StoreLocation storeLocation, StoreName storeName)
    {
        X509Certificate2 certificate = null;
        X509Store certificateStore = new X509Store(storeName, storeLocation);
        certificateStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        ShaHash = ShaHash.Replace(" ", "");
        foreach (X509Certificate2 item in certificateStore.Certificates)
        {
            if (item.Thumbprint.Equals(ShaHash, StringComparison.InvariantCultureIgnoreCase))
            {
                certificate = item;
                break;
            }
        }
        return certificate;
    }
Uglavnom to možete iskoristit u svojoj .Net aplikaciji na npr:
X509Certificate2 cert = null;
if (String.IsNullOrEmpty(org.CertTimestamp))
{
cert = Potpisivanje.DohvatiCertifikat("FISKAL 1");
}
else { cert = CertHelper.DohvatiCertifikatBySHA(org.CertTimestamp); }
if (cert == null)
{
MessageBox.Show("Certifikat nije moguće pronaći!");
return;
}
XmlDocument doc = cis.PosaljiPoslovniProstor(poslovniProstor, cert);

Naravno, primjenite u svojem riješenju kako vam odgovara...

kkovac wrote Dec 13, 2012 at 12:45 PM

hvala Vajgande , budem probao

wrote Dec 15, 2012 at 1:20 PM

wrote Dec 15, 2012 at 8:58 PM

t0p51 wrote Dec 18, 2012 at 11:42 AM

Thumbprint nije rješenje, jer če se promjeniti kad pretekne valid datum certifikata. Pravo rješenje bi bilo, da se provjerava naziv i OIB u Subjectu certifikata, kako je rekao kkovac.

wrote Dec 18, 2012 at 11:42 AM

pweigand wrote Dec 18, 2012 at 12:22 PM

@t0p51 Naravno ako to smatraš problemom, samo si ovu petlju stavi da ti for-each umjesto item.thumbprint uzme item.Subject koji sadrži HRxxxxxxxxxx (x = oib) pa će ti dati ono što ti treba.

Samo u tvom slučaju moraš obavezno stari cert maknuti iz stora jer neznam koji će biti redoslijed kojim će for-each proći kroz collection certova. Dok god ti starei ostane u storeu potencijalno će se on uzeti umjesto novoga.

MS-ovi i sl alati poput signtool-a za potpisivanje assemblya uglavnom traže ili name ili thumbprint pa se meni nekako thumbprint sviđa jer znam točno što ću dobiti i teoretski kao i da ne postoji šansa da se nađe još jedan cert s istim hashom.

Evo još par odgovora od meni pametnijih (valjda) kako jedinstveno prepoznati user certifikat: http://stackoverflow.com/questions/5290571/which-parts-of-the-client-certificate-to-use-when-uniquely-identifying-users

wrote Feb 22, 2013 at 1:08 AM

wrote Sep 27, 2013 at 10:52 AM

nrasinec wrote Oct 4, 2016 at 7:37 AM

sugestija acero: (http://fiskalizacija.codeplex.com/discussions/658083#post1484937)

Mislim da je promjena bila samo u dohvaćanju certifikata, ako se dobro sjećam mislim da je problem bio šta više certifikata od različitih firmi mogu imati isti subject npr. “FISKAL 1” i certifikat može biti pod user account-om ili computer account-om pa su moje dodatne procedure za dohvat certifikata izgledale ovako:
public static X509Certificate2 DohvatiCertifikat(string certificateIssuer, string certificateSerialNumber)
{
    X509Certificate2 certificate = null;
    certificate = DohvatiCertifikat(certificateIssuer, certificateSerialNumber, StoreLocation.CurrentUser, StoreName.My);
    if (certificate == null)
    {
        certificate = DohvatiCertifikat(certificateIssuer, certificateSerialNumber, StoreLocation.LocalMachine, StoreName.My);
    }
    return certificate;
}

public static X509Certificate2 DohvatiCertifikat(string certificateIssuer, string certificateSerialNumber, StoreLocation storeLocation, StoreName storeName)
{
    X509Certificate2 certificate = null;
    X509Store certificateStore = new X509Store(storeName, storeLocation);
    certificateStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
    foreach (X509Certificate2 item in certificateStore.Certificates)
    {
        if (item.Issuer.ToLower().Contains(certificateIssuer.ToLower()))
        {
            string itemSerialNumber = item.SerialNumber.Trim().ToUpperInvariant();
            string certificateSerialNumberTemp = certificateSerialNumber.Replace(" ", "").Trim().ToUpperInvariant();
            if (itemSerialNumber.Equals(certificateSerialNumberTemp))
            {
                certificate = item;
                break;
            }
        }
    }
    return certificate;
}

wrote Oct 4, 2016 at 7:37 AM

wrote Oct 11, 2016 at 11:23 AM

wrote Oct 11, 2016 at 11:23 AM