FAQ |
Kalender |
|
2016-02-15, 13:05 | #1 | ||
|
|||
Nykomling
|
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. |
||
Svara med citat |
2016-02-15, 13:15 | #2 | ||
|
|||
Nykomling
|
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); Tack för de tips jag fått och hoppas att mina tillägg kan ha hjälpt någon. |
||
Svara med citat |
2016-02-15, 13:34 | #3 | ||
|
|||
Nykomling
|
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
|
||
Svara med citat |
2016-02-18, 13:08 | #4 | |||
|
||||
Mycket flitig postare
|
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. |
|||
Svara med citat |
2016-02-20, 16:34 | #5 | |||
|
||||
Mycket flitig postare
|
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.. |
|||
Svara med citat |
2016-02-20, 22:02 | #6 | ||
|
|||
Har WN som tidsfördriv
|
Lägg till denna innan anropet:
Kod:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; |
||
Svara med citat |
2016-02-21, 07:59 | #7 | |||
|
||||
Mycket flitig postare
|
||||
Svara med citat |
2016-02-29, 10:09 | #8 | ||
|
|||
Nykomling
|
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(); } |
||
Svara med citat |
2016-03-03, 09:01 | #9 | |||
|
||||
Mycket flitig postare
|
Citat:
|
|||
Svara med citat |
2017-06-14, 10:30 | #10 | |||
|
||||
Mycket flitig postare
|
Drar igång denna tråd igen, jag har nu äntligen satt mig ner och försökt få igång Swish för handel i ett projekt igen.
Med jackjson två funktioner får jag payment anropet och status anropet att fungera localhost när jag kör i visual studio och iis express, men så fort jag lägger över allt på min Windows 2012 r2 server med vanliga IIS så får jag: System.Security.Cryptography.CryptographicExceptio n: The system cannot find the file specified Så jag undrar nu om någon har fått allt att fungera i c# asp.net mvc eller liknande på en windows server och utan att lägga installera certifkatet? Några tips? |
|||
Svara med citat |
Svara |
|
|