Hur man skapar certifikat för Swish
Jag implementerade nyligen Swish-betalningar på esignering.se och medan själva implementationen var tämligen simpel (flödet påminner något om PayPals) så kan certifikaten ställa till det lite.
Medan det är egentligen en ganska snabb process så är det lite klurigt att hitta bra och relevant information om vilka nycklar som hör ihop – så en liten snabbguide är på sin plats.
Denna guiden är för macOS specifikt. I Swish-portalen tillhandahåller de ett flöde för Windows, dock så kan jag inte svara på hur SSL och annat funkar på den plattformen och/eller om det är någon skillnad på metoderna för macOS.
Steg 1 – Skaffa Swish Handel
Ett steg innan vi kommer till certifikaten dock: det första man kanske stöter på är skillnaden mellan Swish Handel och Swish Företag.
För båda varianterna får man ett Swish-nummer man kan använda, dock är det med Swish Handel man får tillgång till Swish-portalen för att hämta ut certifikat som man kan använda i sina integrationer. Notera också att bankerna tar premium för Handeln, antingen genom dyrare månadskostnader eller högre transaktionsavgift – men det är en artikel en annan dag.
Så kontakta din bank, säg att det är Swish Handel du är ute efter, fyll i blanketten "Ansökan om certifikatansvarig" och så hjälper de dig vidare.
Steg 2 – Generera Swish-certifikat
När du äntligen har fått tillgång till Swish-portalen så är det dags att börja jobba med certifikaten.
På macOS, börja med att skapa en CSR (Certificate Signing Request) genom appen Certificate Assistant (Keychain -> Certificate Assistant -> Create a Certificate From a Certificate Authority).
Ange din e-postadress och sedan ditt Swish-nummer som "Common Name".
Gå vidare till Swish-portalen – portal.swish.nu/company – välj att skapa nytt certifikat och ladda upp din CSR. Där efter spottas det ut en .pem-fil med dina unika certifikat som du ska ladda ner.
Steg 3 – Extrahera .key
Vi börjar med att exportera vår privata nyckel ifrån steg 2 – den skapades i samband med vår CSR och ska finnas i Keychain (se efter under Login -> Keys, där ska det finnas en "private key" med ditt Swish-nummer). Välj exportera och sätt ett lösenord.
Ut kommer en p12-fil, ifrån denna extraherar vi vår privata nyckel;
1openssl pkcs12 -nocerts -in 123xxxxxxx.p12 -out private.key
1openssl pkcs12 -nocerts -in 123xxxxxxx.p12 -out private.key
Där 123xxxxxxx.p12
är namnet på din nyss exporterade nyckel ur keychain. Du kommer att bli ombed att ange ditt lösenord ett par gånger.
Du har nu ännu en fil – private.key
som innehåller din krypterade nyckel:
1-----BEGIN ENCRYPTED PRIVATE KEY-----2MbyPnwyOhRF23b9AENfJokVFBbFBzZLWRQOwbfS1CwAKWI9DS2zcjN3lwwxcyU8O3[...]4KWI9DS2zcjN3FBzZLWRQOwbfS1CwAlwwxcyU8OMbyPnwyOhRF23b9AENfJokVFBb5-----END ENCRYPTED PRIVATE KEY-----
1-----BEGIN ENCRYPTED PRIVATE KEY-----2MbyPnwyOhRF23b9AENfJokVFBbFBzZLWRQOwbfS1CwAKWI9DS2zcjN3lwwxcyU8O3[...]4KWI9DS2zcjN3FBzZLWRQOwbfS1CwAlwwxcyU8OMbyPnwyOhRF23b9AENfJokVFBb5-----END ENCRYPTED PRIVATE KEY-----
Steg 4 - Skapa en bundle
Alternativ 1 – .pem och .key
Nu ska vi äntligen slå ihop nyckeln med certifikaten ifrån Swish. Det görs enklast med cat
kommandot:
1cat private.key swish_certificate_202203011000.pem \2> swish_123xxxxxxx.pem
1cat private.key swish_certificate_202203011000.pem \2> swish_123xxxxxxx.pem
Där swish_123xxxxxxx.pem
är vad du vill att din färdiga nyckel ska heta, swish_certificate_202203011000.pem
är certifikaten ifrån Swish och private.key
din nyss extraherade private nyckel.
swish_123xxxxxxx.pem
är den enda filen du behöver ha kvar. Notera då att det är lösenordet för din privata nyckel (ifrån steg 3) som används för certifikatet.
Alternativ 2 - .p12
Även i detta alternativet ska vi slå ihop nyckeln med certifikaten från Swish, men på ett litet annat vis. Du blir även här tillfrågad om ett skapa ett lösenord, se till att spara det på en säker plats, du behöver den sedan när du ska använda din bundle;
1openssl pkcs12 -export -out swish_123xxxxxxx.p12 \2-in swish_certificate_202203011000.pem -inkey private.key
1openssl pkcs12 -export -out swish_123xxxxxxx.p12 \2-in swish_certificate_202203011000.pem -inkey private.key
Där swish_123xxxxxxx.p12
är vad du vill att din färdiga nyckel ska heta, swish_certificate_202203011000.pem
är certifikaten ifrån Swish och private.key
din nyss extraherade private nyckel.
Har du gjort rätt har du nu alltså en slutgiltig fil swish_123xxxxxxx.p12
, som kombinerar din privata nyckel med certifikaten ifrån Swish. Det fina med detta tillvägagångssättet är att Root/CA (Certificate Authority)-certifikaten är inkluderade, du behöver alltså endast använda denna filen för distribution och i dina anrop emot Swish via exempelvis cURL.
Övriga filer (private.key
, .p12-filen som exporterades ifrån Keychain samt .pem-filerna ifrån Swish) behövs inte längre och kan säkert raderas ifrån disk.
Steg 5 – Testa
Då det endast är certifikaten vi vill testa kan vi skicka skräpdata via cURL och se så att certifikatet kan parse:as korrekt. Då bör du få tillbaka en HTTP 422 i stil med:
1[2 {3 "errorCode":"PA01",4 "errorMessage":"Parameter is not correct.",5 "additionalInformation":null6 }7]
1[2 {3 "errorCode":"PA01",4 "errorMessage":"Parameter is not correct.",5 "additionalInformation":null6 }7]
Alltså att anropet gick fram, men 123
inte är ett giltigt betalnings-ID.
Om du har gjort något fel på vägen kommer du istället få ett cURL och/eller SSL-fel i stil med curl: (56) LibreSSL SSL_read: error:06FFF064
, curl: (58) could not parse PKCS12 file
, curl: (58) unable to set private key file
eller liknande.
Kika på cURL-exemplena här nedanför och välj beroende på vilken typ av certifikat du använder (byt ut password
och swish_123xxxxxxx
till dina egna uppgifter):
.pem
1curl -s -S -i --cert ./swish_123xxxxxxx.pem:password --cert-type pem \2--header "Content-Type:application/json" \3https://cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests/123
1curl -s -S -i --cert ./swish_123xxxxxxx.pem:password --cert-type pem \2--header "Content-Type:application/json" \3https://cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests/123
.p12
1curl -s -S -i --cert ./swish_123xxxxxxx.p12:password --cert-type p12 \2--header "Content-Type:application/json" \3https://cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests/123
1curl -s -S -i --cert ./swish_123xxxxxxx.p12:password --cert-type p12 \2--header "Content-Type:application/json" \3https://cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests/123
Hoppas att denna lilla guiden har varit till nytta. Frågor eller kommentarer? @olssonm är jag på Twitter.