MinSkatt är stängd fram till på tisdagen den 18 november klockan 8.00 på grund av en systemuppdatering. Vi beklagar besväret som detta orsakar. Läs mer
Exempel på förnyelse av certifikat och skapande av underskrift (csr)
Denna anvisning beskriver ett sätt på vilket certifikat som utfärdats av Skatteförvaltningens certifikattjänst kan förnyas och signeras med hjälp av PKI-systemets Web Service-gränssnitt i Skatteförvaltningens certifikattjänst. På basis av exemplet kan man införa förnyelse av certifikat i den egna programvaran.
I anvisningen beskrivs förnyelse av testcertifikat. Anvisningen kan också tillämpas på förnyelse av produktionscertifikat. Då används genuina kunduppgifter och certifikattjänstens produktionsadress Produktionens kunduppgifter får inte användas i testmiljön.
Förnyelse av certifikat i certifikattjänstens gränssnitt
-
Kompetens som behövs:
- PKI-kompetens för bildande av nyckelpar och signaturbegäran
- Programmeringskompetens, översättning och processering
- Certifikattjänstens meddelandestrukturer, WSDL-paket: https://vero.fi/globalassets/tietoa-verohallinnosta/ohjelmistokehittajille/varmennepalvelu/varmennepalvelu-rajapinta_v1.01.zip
- Nytt nyckelpar för signaturbegäran för certifikatet (CSR)
- Nuvarande certifikat och relaterad privat nyckel för signatur av xml-meddelande
- Artificiellt FO-nummer och företagsnamn för organisationens Web Service-certifikat
- Eventuell pfx-fil med det nuvarande certifikatets privata nyckel
- Lösenord för den nuvarande pfx-filen
-
Verktyg som behövs:
- OpenSSL: https://wiki.openssl.org/index.php/Binaries
- .NET: .NET Downloads (Linux, macOS, and Windows) (microsoft.com)
- Visual Studio Code: https://code.visualstudio.com/
- Exempel på Skatteförvaltningens signaturprogram SignXmlNew
- SoapUI https://www.soapui.org/downloads/soapui/ eller Curl https://curl.se/download.html
-
Mer information:
- Anvisningar för förnyelse: Förnyande av certifikat
- Dokumentation i Skatteförvaltningens certifikattjänst i sidan Tekniska anvisningar - vero.fi
- Anvisning för certifikattjänstens testbädd (i avsnitt 7 i Skatteförvaltningens certifikattjänst – beskrivning av PKI-systemet och gränssnitten -dokument )
- Observationsblankett för Skatteförvaltningens certifikattjänst
Skatteförvaltningens exempelkodsprogram (SignXmlNew)
Skatteförvaltningens exempelkodsprogram (SignXmlNew) – för att signera ett XML-meddelande för gränssnittet för certifikatförnyelse.
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml;
namespace SignXmlNew
{
class Program
{
static void Main(string[] args)
{
try
{
// Check command line parameters and, if necessary, throw an exception with usage instructions
if (args.Length != 3 ) throw new ArgumentException("Usage: xmlFile certPfxFile certPassword");
string xmlFile = args[0];
var certPfxFile = args[1];
var password = args[2];
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(xmlFile);
X509Certificate2 cert = new X509Certificate2(certPfxFile, password);
SignDocumentRsaSha256(doc, cert);
// Write the destination file that includes the Signature element
string destination = Path.GetFileNameWithoutExtension(xmlFile) + "_signed" + Path.GetExtension(xmlFile);
doc.Save(destination);
Console.WriteLine("OK, created: " + destination);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex);
return;
}
}
///
/// Signs the given XmlDocument using RSA-SHA256 and the provided X509 certificate.
///
///The XmlDocument to be signed.
///The X509Certificate2, containing the private key for signing.
private static void SignDocumentRsaSha256(XmlDocument xmlDoc, X509Certificate2 cert)
{
var rsaKey = cert.GetRSAPrivateKey();
SignedXml signedXml = new SignedXml(xmlDoc);
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#";
signedXml.SigningKey = rsaKey;
Reference reference = new Reference();
reference.Uri = "";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
XmlElement xmlDigitalSignature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
}
}
}
Förnyelse av testcertifikat
-
1
Skapa en ny privat nyckel för nytt certifikat
-
Skapa en privat nyckel i programmet OpenSSL med kommandot:
openssl genrsa -out newprivate.key 3072Certikattjänsten stöder tre olika nyckelstorlekar (RSA-nyckel): 2048, 3072 och 4096 bitar. Skatteförvaltningen rekommenderar att man använder en nyckel på minst 3072 bitar för att skapa certifikat. Ändra texten i slutet av kommandot Öppna SSL ovan till: 2048, 3072 eller 4096 beroende på storleken på nyckeln och certifikatet du vill skapa.
En ny skapad privat nyckel sparas i filen newprivate.key
-
2
Skapa signaturbegäran för certifikat för förnyelse
-
Bilda signaturbegäran för certifikatet (CSR) genom att använda den privata nyckel som skapats enligt punkt till exempel i programmet OpenSSL med kommandot:
openssl req -new -key newprivate.key -out certificaterequest.csrAnge följande uppgifter i OpenSSL enligt uppgifterna om det certifikat som ska förnyas:
Country Name = FI
Organization Name = Testföretagets namn
Common Name = artificiellt FO-nummerSignaturbegäran för det nya certifikatet sparas i filen certificaterequest.csr
-
3
Bilda xml-meddelande för signatur
-
Bilda innehållet i xml-meddelandet för förnyelse av certifikatet för gränssnittet för förnyelse. Endast denna del av meddelandet signeras. Använd bifogade template, observera att editorn kan lägga till radbyten. Vi rekommenderar att dessa radbyten tas bort innan signaturen bildas:
<cer:RenewCertificateRequest xmlns:cer="http://certificates.vero.fi/2017/10/certificateservices" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<Environment>TEST</Environment>
<CustomerId>Artificiellt FO-nummer</CustomerId>
<CustomerName>Testföretagets namn</CustomerName>
<CertificateRequest>Signaturbegäran för certifikatet som bildats enligt punkt 2 dvs. csr-filens base64 teckensekvens utan rubrikerna --- begin certificate request -- och --- end certificate request --- </CertificateRequest>
</cer:RenewCertificateRequest>Fyll testcertifikatets FO-nummer (artificiellt FO-nummer), artificiellt företagsnamn och ny signaturbegäran för certifikatet som skapats enligt punkt 2 (base 64 teckensekvens utan rubrikerna "--- begin certificate request---" i fälten i exempelmeddelandet). Spara xml-filen utan radbyten på disken för signatur.
-
4
Underteckna xml-meddelande
-
Bilda signatur för meddelandets innehåll, dvs. den del som bildats enligt punkt 3. Du kan använda färdiglösningar såsom programmet XML Signer eller Skatteförvaltningens exempellösning. Denna anvisning utgår från Skatteförvaltningens C#-lösning. Exemplet antar att det nuvarande certifikatet finns i en pfx-fil.
Hämta exempellösningen från punkten Skatteförvaltningens exempelkodsprogram (SignXmlNew).
För att köra programmet ska du ladda ner biblioteken .net och en lämplig utvecklingsmiljö, till exempel Visual Studio Code: https://code.visualstudio.com/
-
5
Skapa en pfx-fil för signaturprogrammet med Open SSL
-
Använd det här kommandot för att skapa en pfx-fil. I filen laddas det nuvarande certifikatet och den privata nyckel med vilken det skapats.
Om pfx-fil saknas ska du skapa en med följande kommando, varvid den förses med en privat nyckel och det nuvarande certifikatet (som sparats i cert.cer-filen i base64-format):
openssl.exe pkcs12 -export -out new.pfx -inkey private.key -in cert.cerI dag finns den privata nyckeln för certifikatet i den okrypterade filen private.key i base64-format medan certifikatets offentliga del (= signerad offentlig nyckel) finns i filen cert.cer i base64-format.
OpenSSL ber om lösenord med vilket pfx-filen krypteras. Lösenord krävs i signaturprogrammet. Slutresultatet är en ny test.pfx-fil.
Om du använder testbädden: Skapa pfx-filen med ovan nämnda kommando, varvid den förses med en privat nyckel, testbäddens SignNewCertificate_Private.key-fil och det nuvarande certifikatet som hämtats från testbädden och som sparats i cert.cer-filen i base64-format.
-
6
Kör signaturprogrammet
-
Kör signaturprogrammet (SignXmlNew.exe) och ange som kommandoradparameter xml-fil som ska signeras och som du skapat enligt punkt 3 samt pfx-fil och lösenordet för den:
SignXmlNew.exe renew.xml new.pfx password -
Slutresultatet är den signerade xml-filen renew_signed.xml, nedan exempel på testbädden:
<cer:RenewCertificateRequest xmlns:cer="http://certificates.vero.fi/2017/10/certificateservices" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<Environment>TEST</Environment>
<CustomerId>0123456-7</CustomerId>
<CustomerName>Ab PKI Developer Company Oy</CustomerName><CertificateRequest>
MIICjTCCAXUCAQAwSDELMAkGA1UEBhMCRkkxEzARBgNVBAgMClNvbWUtU3RhdGUx
JDAiBgNVBAoMG0FiIFBLSSBEZXZlbG9wZXIgQ29tcGFueSBPeTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAJkBP88eLdbxbJfPluDI/rNP0EUpluRohxgx
MNfuYVV9kXgrMsOZpCsV/QjwZFpWBSFy6PDJIKyvAqe83XSfoGPt9apy3QaUJuXR
4/P5H6VT+eZpt1TCf5CEaKb0aW4bZ1kN9BLerrJ81HsR6cutpE/t0bzArc4kna/l
rz/yB3tlU34YoHyx9bXNwKSPsUdL7N32vIuSO8Me/3NjFzA9CBYRrP58qnXIyTmm
0x5GJXGBJqJM2xBRCmpMWg5WGUOF8mAGxkPDxyEfZpaHXbSLaBQ1nJyDPg0+n/Ak
rcweydE0BKmMh3rSITH/M5DYZ6yKgHABEWERg1Nz06ei+a+KJUcCAwEAAaAAMA0G
CSqGSIb3DQEBCwUAA4IBAQBsIqCulgyrfU+DVZxS60Hvu4d8GcKKRGCtFBt508BM
c+NSnevgakWZXXMWKOJStsDHsOPnwfaIvlmFLWRkAsqxt2dIGgWMzFh9NaX0Anwm
CbiUruot9C8zguP7Y/67AFSeageNYrHmgIBHoZyNIe+tPR4Y5DxcQBl/6HtyzJ/q
Nej5mp2zSlW5P1QoEkS3MU8Gm0mpCBylyAvCzeYHOop6caZMQctVCmPto+0PYx0T
qEmO15vGj/rIN4btjEKSYfjNj56MMN8lsIc/6vqdikKKmMwTLRXjq73liOYyJ11s
9433VK1J/UMvay3y2jYKVDUUw567HD8C3lsT+A+ifkCo
</CertificateRequest>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference URI="">
<Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>i13a6CV9yr+uqy/qx4yhvyysDvcKnoiNIjUdj7Arr1A=
</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
VEja46Y17IaMXHMJfcZMRM+3zPTLSepv/zWeR2JLMMCz3nWl
dJynhs1MjGMbqJ3gLsebomkE3UX10ToZ0LObtbeACFYz78dDKbWHTc4cU1IWkZU3
DpXQ5svgJWNk1L+B2SDH7V+ethFNqBmwLCgsE2dT8pt7rXwsBOnZe/Rt30flEMd5
sSWYYJeb1FzMXAcafVIoVs31T9HcoCFupgMH9YWsgzpknQHTSTKfjBZbhsjBnvnD
IwSceFhxxNpcmY/zVjRVB56WeC2qhQgZFN7PsnCJ6KnNOTkYr2w7CVCFNwofCMU3
eXUl+n5khTJmNQV+SZ2S0qPzBSp6TD/reCVJHA==
</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>
MIIFqzCCA5OgAwIBAgIIGZoeTGyXo3IwDQYJKoZIhvcNAQELBQAwSjEkMCIGA1UE
AwwbUEtJIFNlcnZpY2UgRGV2ZWxvcGVyIENBIHYxMRUwEwYDVQQKDAxWZXJvaGFs
bGludG8xCzAJBgNVBAYTAkZJMB4XDTIwMDcwNjA4MzYzMloXDTMwMDcwNDA4MzYz
MlowcjESMBAGA1UEAwwJMDEyMzQ1Ni03MSkwJwYDVQQFEyBDNDY4MTkxMDdCNDAx
NUI0MUIzMTA0MTExMUE0REE2RDEkMCIGA1UECgwbQWIgUEtJIERldmVsb3BlciBD
b21wYW55IE95MQswCQYDVQQGEwJGSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAMrf+WUx2nuYBOeG3PxqzIeMmMVRwlqmBTH/jdW0AmRZ34cuh+Do/T6U
0mqg9G4lVsj8WaM8fmh7tdCQ3xcCPnqpQrkeGuWQV4nIhok74kDnQb12FrOKCsLI
OMONHS2+9E8HKwS8giFXzKP8UUnJK8PmptJQo+E6jlEy+vzSsHouf0UMCgp9MutN
9RlAtjqS6lyHtqp8BLn2hdEM1srIqCXBRigkAH5w1mqbBSiVkgsCaYJ+I5AY201Z
TUlb138SY/bYk9gfLS1aY1gEF+667Bmys0aJk4JRLHujMqfkEuHrfRWo1ps739H+
8UPqkRmJfNybGFUPoJEwcfGIkXdYGPUCAwEAAaOCAWswggFnMAwGA1UdEwEB/wQC
MAAwHwYDVR0jBBgwFoAUT1PJe8BCr9h+uQE8W6CNC7/QfeYwUwYIKwYBBQUHAQEE
RzBFMEMGCCsGAQUFBzAChjdodHRwOi8vY3JsLXRlc3RpLnZlcm8uZmkvY2EvUEtJ
U2VydmljZURldmVsb3BlckNBdjEuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMCMIGc
BgNVHR8EgZQwgZEwgY6gPKA6hjhodHRwOi8vY3JsLXRlc3RpLnZlcm8uZmkvY3Js
L1BLSVNlcnZpY2VEZXZlbG9wZXJDQXYxLmNybKJOpEwwSjEkMCIGA1UEAwwbUEtJ
IFNlcnZpY2UgRGV2ZWxvcGVyIENBIHYxMRUwEwYDVQQKDAxWZXJvaGFsbGludG8x
CzAJBgNVBAYTAkZJMB0GA1UdDgQWBBQwtQwXI5AZJVyZf4DEemCYLnw+mzAOBgNV
HQ8BAf8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBADZkkj4T+rVlAe9a53/9zrWL
uJqe+WePxIoEk5ozXWDb2FeR0uEyUS2Ba0gVJwPm9Go6CAia3J9nFGyVUUNCm2of
dDGxEX4JkrRc7cO8JPaMY74tJR9wwj8R5sshAXPDVMWh9Ml8LHG6hqz0ic0lK9cS
sAHBGJ3GBlckS/6y+SPWGKMHOf0QIm5of63qQ8aI950y4aUjL7td2Yxiu6jKUfP4
haL0BvJFM///o6Ge5LxT3nfPZxESBLbLE21D0ksyO+fZIjIeflxIeQk9rWY7zYq/
Go9+EIvElLXE2aDjqQrwoNIQHmqLgG0DuKpJKzSi7nRvDVHaB5YIdtLDJ4PXZlTk
ib8QBOZWmHCw58IvfEdL0WfuRpzJmlCf8oyzLWRagtnEQhwnWnkXOtPqivRq3Rh3
5M4mQPNVPikduzYlhvQzwCAVkzgspEZVT5hQlTEXBiZZQ8jC8Mb6U1u7G/NndHGw
dWn0WtNYDMrhqEZGoHxgLTLwaU4d5suHzkv0gIxkreR4fnVdiVWd4zCNQk6rt9Jo
3p0yLFGM49G3kszHPcYxxBmzqSrSBoBKX5Sn9+jOF39fxE6LNCmJBiZz49WhSOTS
LjX/kL8B0T4NBCtz6EdhQk0lz1JC5GvNuVVnmKeZYElt3qLvx4ktc6QxlH2zZ48B
R+m/cXycvyLzy2fgyAlW
</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</cer:RenewCertificateRequest>Observera att signaturprogrammet har lagt till blocket Signature i slutet av blocket RenewCertificateRequest.
Det är viktigt att se till att innehållet i filen inte förändras på något sätt innan den skickas till PKI-systemets gränssnitt. Förändringar orsakas också av radbyten och andra formateringar, vilket leder till att signaturen inte längre är valid och att certifikattjänsten meddelar felkoden PKI010.
-
7
Skicka det signerade meddelandet till PKI-systemets gränssnitt i certifikattjänsten
-
Skicka det signerade meddelandet om förnyelse av certifikat till exempel med programmet SoapUI till PKI-systemets testadress: https://pkiws-testi.vero.fi/2017/10/CertificateServices
Du kan ladda ner mallar för meddelandestrukturer i SoapUI på basis av WSDL-beskrivningar. Ladda ner certifikattjänstens gränssnittspaket: https://vero.fi/globalassets/tietoa-verohallinnosta/ohjelmistokehittajille/varmennepalvelu/varmennepalvelu-rajapinta_v1.01.zip. Öppna WSDL-filen med SoapUI.
Skapa meddelandet så att det oförändrade signerade innehållet finns i elementet soap-envelope. Formatera inte det signerade innehållet på något sätt.
Exempel på soap-envelope och ställe dit innehållet exporteras:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" ><env:Body>
här det signerade innehållet som sådant och som bildats enligt punkt 4 i anvisningen
y2fgyAlW</X509Certificate></X509Data></KeyInfo></Signature></cer:RenewCertificateRequest>
</env:Body></env:Envelope>Kontrollera URL och skicka meddelandet. I svarsmeddelandet följer OK och retrievalID, med vilket certifikatet kan hämtas med kommandot GetCertificate.
I stället för SoapUI kan man använda programmet CURL, men då ska man till exempel i en Windows-miljö se till att det inte finns radbyten i innehållet som signeras utan allt innehåll ska stå på en rad. Kom ihåg att foga soap-envelope till den signerade filen. Med följande CURL-kommando kan du skicka begäran om förnyande:
curl -i -v -d @template_signed_env.xml --header "SOAPAction:renewCertificate" -H "Content-Type: text/xml;charset=UTF-8" -H "Accept-Encoding: gzip,deflate https://pkiws-testi.vero.fi/2017/10/CertificateServices -
8
Hämta det förnyade certifikatet med kommandot GetCertificate
-
Ta del av certifikattjänstens anvisningar när du hämtar certifikat.
-
Spara pfx-filen och den privata nyckeln omsorgsfullt.