Kom ihåg mig?
Home Menu

Menu


Swish TLS certificate och .Net / C# kod

 
Ämnesverktyg Visningsalternativ
Oläst 2016-02-15, 12:45 #21
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
Att ssllabs.com inte "gillar" dem är nog på grund av att detta är deras testserver (om jag fattat rätt). De har nog ett ordentligt certifikat på produktionsservern.


Här är svaret jag fick från Swish:
---
Det jag ser i loggen är att vi får ett client hello sen inget mer, det betyder att antingen så är inte hela certifikatskedjan med eller så är det något fel i TLS handshake, så antingen felversion eller så blir det fel cipher suite.
Feb 11 16:39:06 lbt_bgc_a1 info tmm1[30882]: Rule /Common/pass_client_cert <CLIENT_ACCEPTED>: client IP: port=[mitt-ip-nummer]:59334; VIP=/Common/mss.swicpc.bankgirot.se_https_vs: New TCP connection to 172.31.21.185:443
---

Känns lite som att jag är ute och cyklar på djupt vatten här. Varför är de tvungna att krångla med certifikat? Kunde man inte använt id+lösen/tokens som alla andra betalleverantörer gör
SEOutanHatt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-15, 14:05 #22
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
Testade nu att läsa in certifikatet från certificate store istället för från fil och det verkar fungera.

Kod:
 string serial = "1b46f254ae99f31c";

                X509Store store = new X509Store("My", StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadOnly);

                X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, serial, true);
                X509Certificate2 certificate = certificates[0];

                req.ClientCertificates.Add(certificate);

Så nu vet vi att det fungerar, nu gäller det bara att få det att fungera vid inläsning från fil istället. För det är inte direkt skalbart att behöva importera ett cert per kund när man har flera hundra kunder.
SEOutanHatt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-15, 14:15 #23
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
Nu hittade jag felet. Blir så trött på skitfel.

Koden här https://gist.github.com/RickardPette...402d2d59552732 har endast ett fel:

Det saknas en tvåa efter "X509Certificate". På rad 48 ska alltså stå:

Kod:
X509Certificate2 cert = new X509Certificate2(path, "swish", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Lite lagom hemligt fel när det smet igenom kompilatorn också.

Tack för de tips jag fått och hoppas att mina tillägg kan ha hjälpt någon.
SEOutanHatt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-15, 14:34 #24
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
SEOutanHatt SEOutanHatt är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2012
Inlägg: 36
Hade visst fel. Trodde att när jag läste in certifikatet från fil så behövde jag inte ha det i cert store, men när jag tog bort det från cert store så slutade det att fungera. Tillbaka till ritbordet med andra ord
SEOutanHatt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-18, 14:08 #25
RickardPs avatar
RickardP RickardP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 515
RickardP RickardP är inte uppkopplad
Mycket flitig postare
RickardPs avatar
 
Reg.datum: Jun 2004
Inlägg: 515
Låter som du SEOutanHatt kommit lika långt som mig förutom att jag fick det att fungera läsa från fil i en console app i windows men när jag gjort om till ASP.NET MVC projekt under iis så hittar den inte certifikatet så jag tror det har med rättigheter att göra.

Däremot inte haft tid att kolla vidare på detta.

Kommer du på en lösning så säg gärna till.
RickardP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-20, 17:34 #26
RickardPs avatar
RickardP RickardP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 515
RickardP RickardP är inte uppkopplad
Mycket flitig postare
RickardPs avatar
 
Reg.datum: Jun 2004
Inlägg: 515
Jag har kommit så långt att den verkar hitta certifikatet och privat nyckeln men sen säger servern ifrån av någon anledning.

Har hittat något som aktiverae .Net trace log så här står det i den:


System.Net Information: 0 : [11852] SecureChannel#14193427 - Certificate is of type X509Certificate2 and contains the private key.
System.Net Information: 0 : [11852] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Information: 0 : [11852] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = ae84607320:579f591360, targetName = mss.swicpc.bankgirot.se, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [11852] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=1788, returned code=ContinueNeeded).
System.Net Information: 0 : [11852] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = ae84607320:579f591360, targetName = mss.swicpc.bankgirot.se, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [11852] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=IllegalMessage).
System.Net Error: 0 : [11852] Exception in HttpWebRequest#4095822:: - The request was aborted: Could not create SSL/TLS secure channel..
System.Net Error: 0 : [11852] Exception in HttpWebRequest#4095822::EndGetRequestStream - The request was aborted: Could not create SSL/TLS secure channel..
RickardP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-20, 23:02 #27
jayzee jayzee är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2008
Inlägg: 1 089
jayzee jayzee är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2008
Inlägg: 1 089
Lägg till denna innan anropet:

Kod:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
jayzee är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-21, 08:59 #28
RickardPs avatar
RickardP RickardP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 515
RickardP RickardP är inte uppkopplad
Mycket flitig postare
RickardPs avatar
 
Reg.datum: Jun 2004
Inlägg: 515
Citat:
Ursprungligen postat av jayzee Visa inlägg
Lägg till denna innan anropet:

Kod:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Hjälpte inte och det var en av grejerna som gjorde att jag kom vidare tidigare var att sätta Tls11 då deras server kör TLS 1.1
RickardP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-02-29, 11:09 #29
jackjson jackjson är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2016
Inlägg: 2
jackjson jackjson är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2016
Inlägg: 2
Digrad affärssystem bjuder på en lösning

Kod:
private HttpWebRequest CreateSwishRequest(String url, String clientCertPath, String clientCertPass)
{
    //Basic set up
    ServicePointManager.CheckCertificateRevocationList = false;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; //Tls12 does not work

    //Load client certificates
    var clientCerts = new X509Certificate2Collection();
    clientCerts.Import(clientCertPath, clientCertPass ?? "", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

    //Assert CA certs in cert store, and get root CA
    var rootCertificate = AssertCertsInStore(clientCerts);

    var req = HttpWebRequest.Create(url) as HttpWebRequest;
    req.ClientCertificates = clientCerts;
    req.Method = "POST";
    req.ContentType = "application/json; charset=UTF-8";
    req.AllowAutoRedirect = false;
            
    //Verify server root CA by comparing to client cert root CA
    req.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => {
        var chainRootCa = chain?.ChainElements?.OfType<X509ChainElement>().LastOrDefault()?.Certificate;
        if (rootCertificate == null || chainRootCa == null)
            return false;
        return rootCertificate.Equals(chainRootCa); //Same root CA as client cert
    };

    return req;
}

private X509Certificate2 AssertCertsInStore(X509Certificate2Collection certs)
{
    //Create typed array
    var certArr = certs.OfType<X509Certificate2>().ToArray();
    //Build certificate chain
    var chain = new X509Chain();
    chain.ChainPolicy.ExtraStore.AddRange(certArr.Where(o => !o.HasPrivateKey).ToArray());
    var privateCert = certArr.FirstOrDefault(o => o.HasPrivateKey);
    if (privateCert == null)
        return null;
    var result = chain.Build(privateCert);
    //Get CA certs
    var caCerts = chain.ChainElements.OfType<X509ChainElement>().Where(o => !o.Certificate.HasPrivateKey).Select(o => o.Certificate).ToArray();
    if (caCerts == null || caCerts.Length == 0)
        return null;
    //Assert CA certs in intermediate CA store
    var intermediateStore = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser);
    intermediateStore.Open(OpenFlags.ReadWrite);
    foreach (var ca in caCerts)
    {
        if (!intermediateStore.Certificates.Contains(ca))
            intermediateStore.Add(ca);
    }
    intermediateStore.Close();
    //Return last CA in chain (root CA)
    return caCerts.LastOrDefault();
}
jackjson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-03-03, 10:01 #30
RickardPs avatar
RickardP RickardP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2004
Inlägg: 515
RickardP RickardP är inte uppkopplad
Mycket flitig postare
RickardPs avatar
 
Reg.datum: Jun 2004
Inlägg: 515
Citat:
Ursprungligen postat av jackjson Visa inlägg
Digrad affärssystem bjuder på en lösning

Kod:
private HttpWebRequest CreateSwishRequest(String url, String clientCertPath, String clientCertPass)
{
    //Basic set up
    ServicePointManager.CheckCertificateRevocationList = false;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; //Tls12 does not work

    //Load client certificates
    var clientCerts = new X509Certificate2Collection();
    clientCerts.Import(clientCertPath, clientCertPass ?? "", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

    //Assert CA certs in cert store, and get root CA
    var rootCertificate = AssertCertsInStore(clientCerts);

    var req = HttpWebRequest.Create(url) as HttpWebRequest;
    req.ClientCertificates = clientCerts;
    req.Method = "POST";
    req.ContentType = "application/json; charset=UTF-8";
    req.AllowAutoRedirect = false;
            
    //Verify server root CA by comparing to client cert root CA
    req.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => {
        var chainRootCa = chain?.ChainElements?.OfType<X509ChainElement>().LastOrDefault()?.Certificate;
        if (rootCertificate == null || chainRootCa == null)
            return false;
        return rootCertificate.Equals(chainRootCa); //Same root CA as client cert
    };

    return req;
}

private X509Certificate2 AssertCertsInStore(X509Certificate2Collection certs)
{
    //Create typed array
    var certArr = certs.OfType<X509Certificate2>().ToArray();
    //Build certificate chain
    var chain = new X509Chain();
    chain.ChainPolicy.ExtraStore.AddRange(certArr.Where(o => !o.HasPrivateKey).ToArray());
    var privateCert = certArr.FirstOrDefault(o => o.HasPrivateKey);
    if (privateCert == null)
        return null;
    var result = chain.Build(privateCert);
    //Get CA certs
    var caCerts = chain.ChainElements.OfType<X509ChainElement>().Where(o => !o.Certificate.HasPrivateKey).Select(o => o.Certificate).ToArray();
    if (caCerts == null || caCerts.Length == 0)
        return null;
    //Assert CA certs in intermediate CA store
    var intermediateStore = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser);
    intermediateStore.Open(OpenFlags.ReadWrite);
    foreach (var ca in caCerts)
    {
        if (!intermediateStore.Certificates.Contains(ca))
            intermediateStore.Add(ca);
    }
    intermediateStore.Close();
    //Return last CA in chain (root CA)
    return caCerts.LastOrDefault();
}
Tackar, hade fått det att lira genom att installera root certifikatet på servern men detta kommer ju hjälpa så man slipper den biten.
RickardP är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 05:00.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017