[C#] Valideer eigen CA root certificaat

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 09-06 08:38
Voor een project heb ik eigen certificaten gegenereerd. Nu faalt de controle in C# omdat mijn CA root certificate niet geaccepteerd is. Via internet heb ik gevonden dat ik via de X509Chain klasse zelf de chain kan opbouwen, en opnieuw kan valideren. Alleen accepteert deze niet een eigen CA Root certificate. Daarvoor moet je weer handmatig door de gehele chain gaan en controleren.

Uiteindelijk heb ik dit stukje code kunnen schrijven om de chain te kunnen controleren. Ik ben benieuwd of ik dingen gemist heb of niet. Let niet teveel op schoonheid van code oid, het is puur nog een proof of concept.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        private static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            X509Certificate2 root = new X509Certificate2("ca.cer");
            X509Certificate2 cert = new X509Certificate2(certificate);

            chain.Reset();
            chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreRootRevocationUnknown;
            chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
            chain.ChainPolicy.ExtraStore.Add(root);

            if (chain.Build(cert) == false)
            { // errors occured: unable to check any or all certificates of the chain
                bool chainHasErrors = false; // Assume no errors as of yet

                foreach (X509ChainStatus status in chain.ChainStatus)
                {
                    switch (status.Status)
                    {
                        case X509ChainStatusFlags.NoError:
                            chainHasErrors |= false;
                            break;
                        case X509ChainStatusFlags.UntrustedRoot:
                            { // Untrusted Root error can happen when user has not installed our CA in their CA Root Certificate Store.
                                // We check if the CA-ROOT certificate is indeed our CA root certificate.

                                bool RootOk = false;
                                foreach (X509ChainElement el in chain.ChainElements)
                                {
                                    if (RootOk == true)
                                    { // Our CA is expected to be the Root(=last) certificate.. It's not!
                                        RootOk = false;
                                        break;
                                    }
                                    if (root.Thumbprint == el.Certificate.Thumbprint)
                                    {
                                        RootOk = true;
                                    }
                                }
                                chainHasErrors |= !RootOk;
                            }
                            break;
                        default: // no other errors are expected
                            // @todo: Might want to log the information here to a file if errors were found!
                            chainHasErrors |= true;
                            break;
                    }
                }
                return !chainHasErrors;
            }
            return true;
        }


De client logica is als volgt (in hoeverre het interessant is):

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            X509Certificate2 cert = new X509Certificate2("client.p12");
            
            txtLog.Text=  txtLog.Text.Insert(0, "Created client certificate!\r\n");


            TcpClient client = new TcpClient("127.0.0.1", 7331);

            txtLog.Text = txtLog.Text.Insert(0, "Connected!\r\n");

            SslStream test = new SslStream(client.GetStream(),false,ValidateServerCertificate,CertificateSelectionCallback);

            txtLog.Text = txtLog.Text.Insert(0, "SSL Stream started. !\r\n");

            test.AuthenticateAsClient("What_is_targethost", new X509CertificateCollection(new []{cert}), System.Security.Authentication.SslProtocols.Default, false);

            txtLog.Text = txtLog.Text.Insert(0, "Authenticate as client!!\r\n");

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat is nou eigenlijk concreet je vraag? Want het is niet helemaal de bedoeling dat je een stuk code dumpt en dat wij het dan gaan "Debuggen".

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Xsion
  • Registratie: Oktober 2000
  • Laatst online: 12-07 23:29
crl/ocsp checks?

Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 09-06 08:38
Woy schreef op woensdag 30 januari 2013 @ 15:55:
Wat is nou eigenlijk concreet je vraag? Want het is niet helemaal de bedoeling dat je een stuk code dumpt en dat wij het dan gaan "Debuggen".
Y IT NO WORK!?!

nee geintje. Volgens mij zitten er geen veiligheidsrisico's meer in deze code, maar ik heb niet super veel ervaring met de PKI infrastructuur. Is deze code veilig, en niet ( / moeilijk) te misbruiken?

De code werkt dus wel, de vraag is dus of de code ook daadwerkelijk veilig is. En een "ja" of een "nee, omdat" of een "probeer deze test eens" zijn dan allemaal welkome antwoorden ;)
Bedankt voor de tip! Hier had ik niet aan gedacht, ga ik naar kijken.

[ Voor 6% gewijzigd door ChessSpider op 30-01-2013 16:02 ]


Acties:
  • 0 Henk 'm!

Anoniem: 295631

Door wie / wat wordt je CA root certificaat niet geaccepteerd?
Hoe veilig is je software wanneer je een niet geaccepteerd certificaat gebruikt?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Anoniem: 295631 schreef op donderdag 31 januari 2013 @ 09:52:
Door wie / wat wordt je CA root certificaat niet geaccepteerd?
Hoe veilig is je software wanneer je een niet geaccepteerd certificaat gebruikt?
Een self-signed certificaat is natuurlijk in principe even veilig als een certificaat dat door een TTP gesigned is. Het is alleen naar de buitenwereld toe minder zeker dat jij dat certificaat daadwerkelijk gemaakt hebt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 09-06 08:38
Anoniem: 295631 schreef op donderdag 31 januari 2013 @ 09:52:
Door wie / wat wordt je CA root certificaat niet geaccepteerd?
chain.build() geeft de UntrustedRoot foutmelding, zelfs als je de CA toevoegt aan de ExtraStore (regel 9 in geplaatste script). Daarom kijk ik op regel 22 of die foutmelding "verwacht" is of niet. Grappig is dat op veel voorbeelden die ik vond er alleen een controle plaatsvind of de Subject klopt, of gewoon dat altijd alle certificaten wordt geaccepteerd. Aangezien de Subject zelf ingevuld kan worden, en zomaar alle certificaten accepteren, niet echt handig is, heb ik bovenstaande code geschreven.

Volgens mij klopt hij op deze manier, en is het veilig. Maar omdat er dus zo weinig goede informatie te vinden is, vraag ik het hier nog een keer.
Hoe veilig is je software wanneer je een niet geaccepteerd certificaat gebruikt?
zie boven

[ Voor 0% gewijzigd door ChessSpider op 31-01-2013 13:33 . Reden: domme foutjes in tekst ]


Acties:
  • 0 Henk 'm!

  • __fred__
  • Registratie: November 2001
  • Laatst online: 10-07 07:28
Wat is veilig he... Je zegt niet waartegen. Je laadt je root certificaat gewoon uit een bestand. Als je die weet te vervangen als aanvaller, kun je daarna met je eigen server verbinden. Theoretisch zou je ook een collision kunnen genereren als je de thumbprint weet en je md5 thumbprints gebruikt. Dat verwacht ik niet, maar zorg wel dat je hashing mechanisme SHA1 is. En hoe publiek is je code? Decompile en compile is zo gebeurd natuurlijk.
Pagina: 1