Falska meddelanden har skickats ut i Skatteförvaltningens namn. Läs mer om falska meddelanden.

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

  1. 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
  2. Verktyg som behövs:

  3. Mer information:

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 3072

    Certikattjä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.csr

    Ange 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-nummer

    Signaturbegä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.cer

    I 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.



Sidan har senast uppdaterats 19.5.2025