{"id":90,"date":"2026-06-16T16:48:15","date_gmt":"2026-06-16T16:48:15","guid":{"rendered":"https:\/\/shattered.io\/se\/2026\/06\/16\/openssl-nycklar-certifikat\/"},"modified":"2026-06-16T16:50:09","modified_gmt":"2026-06-16T16:50:09","slug":"openssl-nycklar-certifikat","status":"publish","type":"post","link":"https:\/\/shattered.io\/se\/openssl-nycklar-certifikat\/","title":{"rendered":"OpenSSL 3.5: nycklar och certifikat i 12 steg [2026]"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">OpenSSL driver i tysthet det mesta av krypteringen p\u00e5 internet, fr\u00e5n HTTPS-sidor till krypterad e-post och signerade programuppdateringar. Verktyget finns redan installerat p\u00e5 i stort sett varje Linux-server och Mac, men de flesta anv\u00e4nder bara en br\u00e5kdel av det. Den h\u00e4r guiden tar dig genom 12 praktiska steg, fr\u00e5n att skapa din f\u00f6rsta privatnyckel till att bygga en egen certifikatutf\u00e4rdare (CA) och f\u00f6rbereda dig f\u00f6r postkvantkryptografi. Allt bygger p\u00e5 OpenSSL 3.5 LTS, den l\u00e5ngtidsst\u00f6dda versionen som sl\u00e4pptes 8 april 2025 och f\u00e5r s\u00e4kerhetsuppdateringar \u00e4nda till 8 april 2030.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e4kna med runt 40 minuter f\u00f6r hela genomg\u00e5ngen. Du beh\u00f6ver bara en terminal och grundl\u00e4ggande vana vid kommandoraden. Varje kommando \u00e4r testat och kommer med exempel p\u00e5 utdata s\u00e5 att du ser exakt vad som ska h\u00e4nda. I slutet finns ett komplett, k\u00f6rbart skript som automatiserar hela kedjan, plus fels\u00f6kning f\u00f6r de \u00e5tta vanligaste problemen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vad-ar-openssl-och-varfor-3-5-lts-spelar-roll-2026\">Vad \u00e4r OpenSSL och varf\u00f6r 3.5 LTS spelar roll 2026<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL \u00e4r ett kryptografiskt bibliotek och ett kommandoradsverktyg som implementerar TLS-protokollet samt en uppsj\u00f6 av algoritmer f\u00f6r kryptering, hashning och digitala signaturer. N\u00e4r din webbl\u00e4sare visar ett h\u00e4ngl\u00e5s \u00e4r det med stor sannolikhet OpenSSL eller en avknoppning av kodbasen som hanterar handskakningen i bakgrunden. Kommandoradsverktyget <code>openssl<\/code> ger dig direkt tillg\u00e5ng till samma funktioner, vilket g\u00f6r det oumb\u00e4rligt f\u00f6r systemadministrat\u00f6rer, utvecklare och s\u00e4kerhetsanalytiker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version 3.5 \u00e4r den aktuella LTS-grenen (Long Term Support). Den fick stor uppm\u00e4rksamhet eftersom den var den f\u00f6rsta OpenSSL-versionen med inbyggt st\u00f6d f\u00f6r de postkvants\u00e4kra algoritmerna ML-KEM, ML-DSA och SLH-DSA, samt serversidig QUIC. F\u00f6r dig som bygger system som ska leva l\u00e4nge \u00e4r valet av version inte en detalj. K\u00f6r du p\u00e5 OpenSSL 3.0 upph\u00f6rde det fulla st\u00f6det 7 september 2025, och rena s\u00e4kerhetsfixar sl\u00e4pps bara till 7 september 2026. Att ligga kvar p\u00e5 en gren utan st\u00f6d betyder att k\u00e4nda s\u00e5rbarheter aldrig lagas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det finns ocks\u00e5 en nyare gren, OpenSSL 3.6, sl\u00e4ppt 1 oktober 2025. Den \u00e4r dock <em>inte<\/em> LTS och f\u00e5r st\u00f6d bara till 1 november 2026. F\u00f6r produktionsservrar \u00e4r 3.5 LTS det sj\u00e4lvklara valet i 2026, just f\u00f6r att supportf\u00f6nstret str\u00e4cker sig hela v\u00e4gen till 2030. Vill du l\u00e4sa mer om hur certifikat och TLS h\u00e4nger ihop med h\u00e4ngl\u00e5set i webbl\u00e4saren rekommenderas v\u00e5r genomg\u00e5ng av <a href=\"\/se\/https-och-tls\/\">HTTPS och TLS<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>OpenSSL-gren<\/th><th>Typ<\/th><th>Sl\u00e4pptes<\/th><th>St\u00f6d till<\/th><th>Senaste utg\u00e5va (juni 2026)<\/th><\/tr><\/thead><tbody><tr><td>3.0<\/td><td>LTS (utg\u00e5ende)<\/td><td>sep 2021<\/td><td>7 sep 2026 (endast s\u00e4kerhet)<\/td><td>3.0-serien<\/td><\/tr><tr><td>3.5<\/td><td><strong>LTS<\/strong><\/td><td>8 apr 2025<\/td><td>8 apr 2030<\/td><td>3.5.7<\/td><\/tr><tr><td>3.6<\/td><td>Standard (ej LTS)<\/td><td>1 okt 2025<\/td><td>1 nov 2026<\/td><td>3.6.3<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-block-table__caption\">K\u00e4lla: <a href=\"https:\/\/openssl-library.org\/source\/\" target=\"_blank\" rel=\"noopener\">OpenSSL Library<\/a>, nedladdningssidan och projektets release-strategi.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"forkunskaper-och-versioner-du-behover\">F\u00f6rkunskaper och versioner du beh\u00f6ver<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Innan du b\u00f6rjar b\u00f6r milj\u00f6n vara p\u00e5 plats. Den h\u00e4r guiden f\u00f6ruts\u00e4tter en Unix-liknande terminal. Allt fungerar identiskt p\u00e5 Linux och macOS, och p\u00e5 Windows via WSL2 eller Git Bash. Du beh\u00f6ver inga betaltj\u00e4nster och ingen internetuppkoppling ut\u00f6ver installationen.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>OpenSSL 3.5 LTS<\/strong> (minst 3.5.0, helst 3.5.7 eller senare). \u00c4ldre 1.1.1 saknar provider-arkitekturen och flera kommandon nedan.<\/li><li><strong>Ett Unix-skal<\/strong>: bash eller zsh p\u00e5 Linux\/macOS, eller WSL2 (Ubuntu 24.04 LTS) p\u00e5 Windows.<\/li><li><strong>Skrivr\u00e4ttigheter<\/strong> i en arbetskatalog, exempelvis <code>~\/openssl-lab<\/code>.<\/li><li><strong>Grundl\u00e4ggande terminalvana<\/strong>: navigera mellan kataloger, redigera filer med nano eller vim.<\/li><li><strong>Cirka 40 minuter<\/strong> och t\u00e5lamod att l\u00e4sa varje utdata noga.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En sista sak innan vi b\u00f6rjar: skilj alltid p\u00e5 privata och publika nycklar. Privatnyckeln \u00e4r hemligheten som aldrig f\u00e5r l\u00e4mna din maskin okrypterad. Den publika nyckeln och certifikatet f\u00e5r spridas fritt. F\u00f6rv\u00e4xlar du de tv\u00e5 har du antingen ett system som inte fungerar eller, v\u00e4rre, en l\u00e4ckt hemlighet. Samma princip g\u00e4ller i v\u00e5r guide om <a href=\"\/se\/ssh-nycklar-linux\/\">SSH-nycklar i Linux<\/a>, d\u00e4r nyckelhantering \u00e4r hela po\u00e4ngen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-1-installera-och-verifiera-openssl-3-5\">Steg 1: Installera och verifiera OpenSSL 3.5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kontrollera f\u00f6rst vilken version du redan har. M\u00e5nga distributioner levererar fortfarande 3.0 som standard, s\u00e5 det h\u00e4r steget avg\u00f6r om du beh\u00f6ver uppgradera.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl version -a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6rv\u00e4ntad utdata p\u00e5 ett uppdaterat system:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OpenSSL 3.5.7 9 Jun 2026 (Library: OpenSSL 3.5.7 9 Jun 2026)\nbuilt on: Mon Jun  9 11:02:14 2026 UTC\nplatform: debian-amd64\nOPENSSLDIR: \"\/usr\/lib\/ssl\"\nENGINESDIR: \"\/usr\/lib\/x86_64-linux-gnu\/engines-3\"\nMODULESDIR: \"\/usr\/lib\/x86_64-linux-gnu\/ossl-modules\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ser du <code>OpenSSL 3.0.x<\/code> eller, \u00e4nnu \u00e4ldre, <code>1.1.1<\/code>, b\u00f6r du uppgradera. P\u00e5 Ubuntu 24.04 LTS och senare finns 3.x i standardf\u00f6rr\u00e5den:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Debian \/ Ubuntu\nsudo apt update && sudo apt install --only-upgrade openssl\n\n# macOS med Homebrew (ger ofta nyaste 3.5\/3.6)\nbrew install openssl@3\necho 'export PATH=\"\/opt\/homebrew\/opt\/openssl@3\/bin:$PATH\"' >> ~\/.zshrc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Skapa sedan en ren arbetskatalog. Allt vi g\u00f6r h\u00e4danefter sker h\u00e4r, s\u00e5 att din hemkatalog inte fylls med nyckel- och certifikatfiler.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/openssl-lab && cd ~\/openssl-lab\numask 077   # nya filer blir l\u00e4sbara bara f\u00f6r dig<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kommandot <code>umask 077<\/code> \u00e4r ingen formalitet. Det g\u00f6r att privatnycklar du skapar automatiskt f\u00e5r r\u00e4ttigheterna 600 (bara \u00e4garen kan l\u00e4sa). Gl\u00f6mmer du detta riskerar du att en nyckel hamnar med 644, l\u00e4sbar f\u00f6r alla anv\u00e4ndare p\u00e5 systemet. Det \u00e4r en av de vanligaste och mest underskattade felk\u00e4llorna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-2-skapa-en-rsa-4096-privatnyckel\">Steg 2: Skapa en RSA-4096-privatnyckel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vi b\u00f6rjar med RSA eftersom det \u00e4r den mest kompatibla algoritmen och den du oftast m\u00f6ter i kompatibilitetskrav. I OpenSSL 3.x \u00e4r <code>genpkey<\/code> det moderna, rekommenderade kommandot. Det \u00e4ldre <code>genrsa<\/code> fungerar fortfarande men b\u00f6r undvikas i ny dokumentation. Alla flaggor finns dokumenterade i <a href=\"https:\/\/docs.openssl.org\/3.5\/man1\/openssl-genpkey\/\" target=\"_blank\" rel=\"noopener\">den officiella OpenSSL 3.5-manualen<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl genpkey -algorithm RSA \\\n  -pkeyopt rsa_keygen_bits:4096 \\\n  -out rsa4096.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generering av en 4096-bitars nyckel tar ett par sekunder eftersom OpenSSL letar efter stora primtal. Verifiera att nyckeln ser r\u00e4tt ut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkey -in rsa4096.key -text -noout | head -5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6rv\u00e4ntad utdata:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Private-Key: (4096 bit, 2 primes)\nmodulus:\n    00:c4:1a:9f:7e:2b:8d:3a:6f:...\npublicExponent: 65537 (0x10001)\nprivateExponent:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vill du sedan ta fram den publika nyckeln separat, exempelvis f\u00f6r att dela med en motpart, extraherar du den ur privatnyckeln. Den publika nyckeln kan inte h\u00e4rledas bakl\u00e4nges till den privata, s\u00e5 den \u00e4r trygg att skicka vidare.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkey -in rsa4096.key -pubout -out rsa4096.pub\ncat rsa4096.pub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notera filr\u00e4ttigheterna. K\u00f6r <code>ls -l rsa4096.key<\/code> och bekr\u00e4fta att raden b\u00f6rjar med <code>-rw-------<\/code>. Tack vare <code>umask 077<\/code> fr\u00e5n steg 1 ska detta redan st\u00e4mma. RSA-4096 ger en bred s\u00e4kerhetsmarginal men \u00e4r m\u00e4rkbart l\u00e5ngsammare \u00e4n de elliptiska alternativen vi tar i n\u00e4sta steg. F\u00f6r m\u00e5nga moderna system \u00e4r 4096 faktiskt \u00f6verdrivet, men det kr\u00e4vs ibland av regelverk och compliance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-3-generera-ed25519-och-ecdsa-nycklar\">Steg 3: Generera Ed25519- och ECDSA-nycklar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Elliptisk kurvkryptografi ger samma s\u00e4kerhet som RSA med dramatiskt mindre nycklar och h\u00f6gre prestanda. En Ed25519-nyckel p\u00e5 256 bitar motsvarar grovt sett RSA-3072 i styrka, men \u00e4r n\u00e5gra storleksordningar snabbare att signera med. F\u00f6r nya system \u00e4r Ed25519 f\u00f6rstahandsvalet n\u00e4r b\u00e5da \u00e4ndarna st\u00f6der det.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ed25519: b\u00e4sta standard f\u00f6r nya system\nopenssl genpkey -algorithm Ed25519 -out ed25519.key\n\n# ECDSA P-256: bredast kompatibilitet i TLS-stackar\nopenssl genpkey -algorithm EC \\\n  -pkeyopt ec_paramgen_curve:P-256 \\\n  -pkeyopt ec_param_enc:named_curve \\\n  -out ecdsa-p256.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e4gg m\u00e4rke till hur snabbt detta g\u00e5r j\u00e4mf\u00f6rt med RSA-4096. Genereringen \u00e4r i princip omedelbar. Inspektera Ed25519-nyckeln:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkey -in ed25519.key -text -noout<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ED25519 Private-Key:\npriv:\n    9a:1c:5f:...:2e\npub:\n    4b:88:d0:...:7a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Valet mellan algoritmerna handlar om en avv\u00e4gning mellan kompatibilitet och prestanda. Beh\u00f6ver du n\u00e5 \u00e4ldre klienter och h\u00e5rdvara v\u00e4ljer du ECDSA P-256 eller RSA. Bygger du ett internt system d\u00e4r du styr b\u00e5da \u00e4ndarna \u00e4r Ed25519 b\u00e5de snabbare och enklare. Vi \u00e5terkommer till en fullst\u00e4ndig j\u00e4mf\u00f6relsetabell l\u00e4ngre ner. Asymmetriska nyckelpar \u00e4r ocks\u00e5 grunden f\u00f6r <a href=\"\/se\/digitala-signaturer\/\">digitala signaturer<\/a>, ett koncept v\u00e4l v\u00e4rt att f\u00f6rst\u00e5 parallellt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-4-skydda-privatnyckeln-med-en-losenfras\">Steg 4: Skydda privatnyckeln med en l\u00f6senfras<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En privatnyckel i klartext p\u00e5 disk \u00e4r en risk. Stj\u00e4l n\u00e5gon filen \u00e4ger de din identitet. L\u00f6sningen \u00e4r att kryptera nyckeln med en l\u00f6senfras, s\u00e5 att den kr\u00e4vs varje g\u00e5ng nyckeln anv\u00e4nds. OpenSSL st\u00f6der moderna chiffer som AES-256 f\u00f6r detta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Kryptera en befintlig nyckel med AES-256\nopenssl pkey -in rsa4096.key -aes256 -out rsa4096-enc.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL fr\u00e5gar efter en l\u00f6senfras och ber dig bekr\u00e4fta den. \u00d6ppnar du sedan den krypterade filen ser du ett tydligt huvud som visar att inneh\u00e5llet \u00e4r skyddat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI...\n-----END ENCRYPTED PRIVATE KEY-----<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Du kan ocks\u00e5 skapa en krypterad nyckel direkt vid genereringen genom att l\u00e4gga till <code>-aes256<\/code> i <code>genpkey<\/code>-kommandot. Vill du ta bort krypteringen senare (f\u00f6r att en tj\u00e4nst beh\u00f6ver starta utan att fr\u00e5ga om l\u00f6senord) g\u00f6r du tv\u00e4rtom:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ta bort l\u00f6senfras (g\u00f6r bara detta i en kontrollerad milj\u00f6)\nopenssl pkey -in rsa4096-enc.key -out rsa4096-plain.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En varning: nyckelfiler utan l\u00f6senfras \u00e4r vanliga p\u00e5 servrar, eftersom en webbserver som nginx eller Apache annars skulle blockera vid omstart och v\u00e4nta p\u00e5 inmatning. Det \u00e4r en medveten avv\u00e4gning. Skyddar du s\u00e5dana nycklar f\u00f6rlitar du dig i st\u00e4llet p\u00e5 filr\u00e4ttigheter och h\u00e5rddiskkryptering. Vill du kryptera hela disken d\u00e4r nycklarna ligger \u00e4r v\u00e5r guide om <a href=\"\/se\/veracrypt-kryptera-disk\/\">VeraCrypt<\/a> en bra utg\u00e5ngspunkt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-5-skapa-en-csr-certifikatbegaran\">Steg 5: Skapa en CSR (certifikatbeg\u00e4ran)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En Certificate Signing Request (CSR) \u00e4r det du skickar till en certifikatutf\u00e4rdare n\u00e4r du vill ha ett betrott certifikat. CSR:en inneh\u00e5ller din publika nyckel och uppgifter om vem du \u00e4r, signerat med din privatnyckel som bevis p\u00e5 att du \u00e4ger nyckeln.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -new -key rsa4096.key -out request.csr<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL st\u00e4ller en rad fr\u00e5gor. Det viktigaste f\u00e4ltet \u00e4r <strong>Common Name (CN)<\/strong>, som ska vara dom\u00e4nnamnet, exempelvis <code>www.example.se<\/code>. Ett exempel p\u00e5 dialogen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Country Name (2 letter code) [AU]:SE\nState or Province Name (full name) []:Stockholm\nLocality Name (eg, city) []:Stockholm\nOrganization Name (eg, company) []:Example AB\nOrganizational Unit Name (eg, section) []:IT\nCommon Name (e.g. server FQDN) []:www.example.se\nEmail Address []:admin@example.se<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Moderna webbl\u00e4sare ignorerar dock CN f\u00f6r v\u00e4rdnamnsvalidering och kr\u00e4ver i st\u00e4llet f\u00e4ltet <strong>subjectAltName (SAN)<\/strong>. Det \u00e4r den i s\u00e4rklass vanligaste fallgropen med CSR:er. F\u00f6r att slippa den interaktiva dialogen och f\u00e5 med SAN direkt anv\u00e4nder du en enradare med konfiguration inbyggd:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -new -key rsa4096.key -out request.csr \\\n  -subj \"\/C=SE\/ST=Stockholm\/O=Example AB\/CN=www.example.se\" \\\n  -addext \"subjectAltName=DNS:www.example.se,DNS:example.se\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verifiera alltid inneh\u00e5llet i CSR:en innan du skickar in den. Ett enda felstavat dom\u00e4nnamn betyder att certifikatet blir oanv\u00e4ndbart.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -in request.csr -noout -text | grep -A1 \"Subject Alternative\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-6-sjalvsignerat-certifikat-med-san\">Steg 6: Sj\u00e4lvsignerat certifikat med SAN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r utveckling, interna tj\u00e4nster och testmilj\u00f6er beh\u00f6ver du s\u00e4llan en extern utf\u00e4rdare. Ett sj\u00e4lvsignerat certifikat r\u00e4cker. Skillnaden \u00e4r att ingen utomst\u00e5ende litar p\u00e5 det automatiskt, s\u00e5 webbl\u00e4sare visar en varning tills du l\u00e4gger till det manuellt som betrott.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det enklaste fungerande exemplet skapar nyckel och certifikat i ett enda kommando, med 365 dagars giltighet och korrekt SAN:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -x509 -newkey rsa:4096 \\\n  -keyout server.key -out server.crt \\\n  -days 365 -sha256 -nodes \\\n  -subj \"\/C=SE\/O=Example AB\/CN=localhost\" \\\n  -addext \"subjectAltName=DNS:localhost,IP:127.0.0.1\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flaggan <code>-nodes<\/code> betyder &#8220;no DES&#8221;, det vill s\u00e4ga att privatnyckeln sparas utan l\u00f6senfras. Det \u00e4r praktiskt f\u00f6r testservrar men ska aldrig anv\u00e4ndas i produktion utan kompletterande skydd. Verifiera resultatet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 -in server.crt -noout -subject -dates -ext subjectAltName<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>subject=C=SE, O=Example AB, CN=localhost\nnotBefore=Jun 16 09:00:00 2026 GMT\nnotAfter=Jun 16 09:00:00 2027 GMT\nX509v3 Subject Alternative Name:\n    DNS:localhost, IP Address:127.0.0.1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e4gg m\u00e4rke till att <code>notAfter<\/code> ligger exakt 365 dagar fram i tiden. Saknas raden med Subject Alternative Name kommer moderna klienter att avvisa certifikatet, oavsett att CN \u00e4r korrekt. Det h\u00e4r \u00e4r samma princip som g\u00f6r h\u00e4ngl\u00e5set i webbl\u00e4saren giltigt eller inte, vilket vi g\u00e5r djupare in p\u00e5 i artikeln om <a href=\"\/se\/https-och-tls\/\">HTTPS och TLS<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-7-bygg-en-egen-mini-ca-och-signera-certifikat\">Steg 7: Bygg en egen mini-CA och signera certifikat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r labbmilj\u00f6er, interna n\u00e4tverk och utveckling \u00e4r en egen certifikatutf\u00e4rdare guld v\u00e4rd. Du skapar ett rot-certifikat en g\u00e5ng, l\u00e4gger till det som betrott p\u00e5 dina enheter, och kan sedan signera hur m\u00e5nga servercertifikat du vill utan webbl\u00e4sarvarningar. Det h\u00e4r \u00e4r fundamentet i hur den riktiga certifikatinfrastrukturen p\u00e5 internet fungerar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Skapa f\u00f6rst en rotnyckel och ett rotcertifikat med l\u00e5ng giltighet (h\u00e4r tio \u00e5r). Anv\u00e4nd g\u00e4rna Ed25519 eller ECDSA f\u00f6r CA:n eftersom den signerar ofta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Rotnyckel + rotcertifikat (CA)\nopenssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ca.key\nopenssl req -x509 -new -key ca.key -sha256 -days 3650 \\\n  -subj \"\/C=SE\/O=Example Lab CA\/CN=Example Root CA\" \\\n  -out ca.crt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Skapa sedan en servernyckel och en CSR, precis som i steg 5. Nu kommer det avg\u00f6rande: vi signerar CSR:en med v\u00e5r CA i st\u00e4llet f\u00f6r att sj\u00e4lvsigna. SAN m\u00e5ste anges via en extensionsfil.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 2. Servernyckel och CSR\nopenssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out site.key\nopenssl req -new -key site.key -subj \"\/C=SE\/O=Example AB\/CN=app.example.se\" -out site.csr\n\n# 3. Extensionsfil med SAN\ncat > site.ext &lt;&lt;EOF\nsubjectAltName = DNS:app.example.se,DNS:www.app.example.se\nkeyUsage = critical, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nEOF\n\n# 4. CA signerar certifikatet (giltigt 825 dagar)\nopenssl x509 -req -in site.csr -CA ca.crt -CAkey ca.key \\\n  -CAcreateserial -days 825 -sha256 \\\n  -extfile site.ext -out site.crt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gr\u00e4nsen p\u00e5 825 dagar \u00e4r ingen slump. De flesta webbl\u00e4sare avvisar servercertifikat med l\u00e4ngre giltighet \u00e4n s\u00e5. Verifiera att kedjan st\u00e4mmer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl verify -CAfile ca.crt site.crt<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>site.crt: OK<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00e5r du <code>OK<\/code> \u00e4r certifikatkedjan korrekt. L\u00e4gger du nu till <code>ca.crt<\/code> i operativsystemets eller webbl\u00e4sarens lista \u00f6ver betrodda r\u00f6tter, slutar alla certifikat du signerar med den att ge varningar. Det \u00e4r exakt s\u00e5 f\u00f6retag rullar ut interna HTTPS-tj\u00e4nster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-8-inspektera-och-verifiera-certifikat\">Steg 8: Inspektera och verifiera certifikat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Att kunna l\u00e4sa ett certifikat \u00e4r en daglig syssla f\u00f6r alla som driftar tj\u00e4nster. OpenSSL ger dig fullst\u00e4ndig insyn. Det vanligaste kommandot visar hela certifikatet i l\u00e4sbar form:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 -in site.crt -text -noout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ofta vill du bara ha specifika delar. H\u00e4r \u00e4r de mest anv\u00e4ndbara varianterna i vardagen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Bara utg\u00e5ngsdatum\nopenssl x509 -in site.crt -noout -enddate\n\n# Utf\u00e4rdare, \u00e4mne och serienummer\nopenssl x509 -in site.crt -noout -issuer -subject -serial\n\n# Fingeravtryck (SHA-256)\nopenssl x509 -in site.crt -noout -fingerprint -sha256<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En s\u00e4rskilt nyttig kontroll \u00e4r att bekr\u00e4fta att en privatnyckel och ett certifikat verkligen h\u00f6r ihop. Den vanliga felk\u00e4llan vid drifts\u00e4ttning \u00e4r att man av misstag blandar nycklar och certifikat fr\u00e5n olika omg\u00e5ngar. J\u00e4mf\u00f6r deras publika nycklar via en hash:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Hashar som m\u00e5ste vara identiska om nyckel och cert h\u00f6r ihop\nopenssl pkey -in site.key -pubout -outform DER | openssl sha256\nopenssl x509 -in site.crt -pubkey -noout | openssl pkey -pubin -outform DER | openssl sha256<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c4r de tv\u00e5 hash-v\u00e4rdena identiska matchar nyckeln certifikatet. Skiljer de sig har du fel par, och servern kommer att v\u00e4gra starta TLS. Fingeravtryck bygger p\u00e5 <a href=\"\/se\/sha-256\/\">SHA-256<\/a>, samma hashfunktion som s\u00e4krar otaliga andra delar av modern kryptografi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-9-konvertera-mellan-pem-der-och-pkcs12\">Steg 9: Konvertera mellan PEM, DER och PKCS#12<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Olika system vill ha certifikat i olika format. PEM \u00e4r textbaserat (med <code>-----BEGIN-----<\/code>-rader) och dominerar i Linux-v\u00e4rlden. DER \u00e4r bin\u00e4rt och vanligt i Java och Windows. PKCS#12 (fil\u00e4ndelse <code>.p12<\/code> eller <code>.pfx<\/code>) packar nyckel och certifikat i en enda l\u00f6senordsskyddad fil, vilket Windows och m\u00e5nga importguider f\u00f6redrar.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Format<\/th><th>Fil\u00e4ndelse<\/th><th>Inneh\u00e5ll<\/th><th>Typiskt anv\u00e4ndningsomr\u00e5de<\/th><\/tr><\/thead><tbody><tr><td>PEM<\/td><td>.pem .crt .key<\/td><td>Base64-text<\/td><td>Linux, nginx, Apache<\/td><\/tr><tr><td>DER<\/td><td>.der .cer<\/td><td>Bin\u00e4rt<\/td><td>Java, Windows-verktyg<\/td><\/tr><tr><td>PKCS#12<\/td><td>.p12 .pfx<\/td><td>Nyckel + cert + kedja<\/td><td>Windows, IIS, import<\/td><\/tr><tr><td>PKCS#8<\/td><td>.key<\/td><td>Privatnyckel<\/td><td>Modern nyckelstandard<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-block-table__caption\">De fyra format du oftast st\u00f6ter p\u00e5 vid certifikathantering.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Konverteringarna \u00e4r raka. PEM till DER och tillbaka:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PEM -> DER\nopenssl x509 -in site.crt -outform DER -out site.der\n\n# DER -> PEM\nopenssl x509 -in site.der -inform DER -out site-from-der.crt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Packa ihop nyckel, certifikat och CA-kedja till en PKCS#12-fil f\u00f6r import i Windows eller en mobil enhet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 -export \\\n  -inkey site.key -in site.crt -certfile ca.crt \\\n  -out bundle.p12 -name \"app.example.se\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Du ombeds s\u00e4tta ett exportl\u00f6senord som kr\u00e4vs vid importen. F\u00f6r att packa upp en befintlig <code>.pfx<\/code>-fil du f\u00e5tt fr\u00e5n n\u00e5gon annan v\u00e4nder du p\u00e5 det:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 -in bundle.p12 -nodes -out unpacked.pem<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-10-testa-en-tls-anslutning-med-s_client-och-s_server\">Steg 10: Testa en TLS-anslutning med s_client och s_server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL kan agera b\u00e5de server och klient, vilket \u00e4r ov\u00e4rderligt f\u00f6r fels\u00f6kning. Starta en testserver i ett terminalf\u00f6nster med certifikatet fr\u00e5n steg 6:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_server -accept 4433 -cert server.crt -key server.key -www<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6ppna ett andra terminalf\u00f6nster och anslut som klient. Det h\u00e4r visar exakt vad en webbl\u00e4sare ser under handskakningen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client -connect localhost:4433 -servername localhost<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I utdatan ser du protokollversion, valt chiffer och certifikatkedjan. Ett utdrag fr\u00e5n en lyckad TLS 1.3-anslutning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SSL handshake has read 1394 bytes and written 389 bytes\nNew, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384\nServer certificate\nsubject=C=SE, O=Example AB, CN=localhost\nVerify return code: 18 (self signed certificate)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Returkod 18 betyder &#8220;sj\u00e4lvsignerat certifikat&#8221;, vilket f\u00f6rv\u00e4ntas i en testmilj\u00f6. Mot en riktig server vill du se <code>Verify return code: 0 (ok)<\/code>. Du kan ocks\u00e5 kontrollera utg\u00e5ngsdatum f\u00f6r vilken publik server som helst, vilket \u00e4r perfekt f\u00f6r \u00f6vervakning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo | openssl s_client -connect example.com:443 -servername example.com 2>\/dev\/null \\\n  | openssl x509 -noout -dates<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r en fullst\u00e4ndig extern analys av en publik servers TLS-konfiguration kompletterar du g\u00e4rna OpenSSL med <a href=\"https:\/\/www.ssllabs.com\/ssltest\/\" target=\"_blank\" rel=\"noopener\">SSL Labs Server Test<\/a>, som betygs\u00e4tter chiffer, protokollst\u00f6d och k\u00e4nda s\u00e5rbarheter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-11-kontrollera-utgangsdatum-och-automatisera\">Steg 11: Kontrollera utg\u00e5ngsdatum och automatisera<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Utg\u00e5ngna certifikat \u00e4r en av de absolut vanligaste orsakerna till driftstopp. Stora tj\u00e4nster har g\u00e5tt ner p\u00e5 grund av ett gl\u00f6mt certifikat. OpenSSL l\u00e5ter dig bygga enkel \u00f6vervakning. Kommandot nedan returnerar sant om certifikatet g\u00e5r ut inom 30 dagar (2592000 sekunder):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if openssl x509 -checkend 2592000 -noout -in site.crt; then\n  echo \"Certifikatet \u00e4r giltigt i minst 30 dagar till.\"\nelse\n  echo \"VARNING: certifikatet g\u00e5r ut inom 30 dagar!\"\nfi<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Det h\u00e4r g\u00e5r utm\u00e4rkt att l\u00e4gga i ett cron-jobb som mejlar dig i tid. Ett litet skript som kontrollerar en lista med dom\u00e4ner:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nfor host in example.se app.example.se shop.example.se; do\n  slut=$(echo | openssl s_client -connect \"$host\":443 -servername \"$host\" 2>\/dev\/null \\\n    | openssl x509 -noout -enddate | cut -d= -f2)\n  echo \"$host g\u00e5r ut: $slut\"\ndone<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r riktiga, publikt betrodda certifikat \u00e4r dock det smartaste att inte hantera dem manuellt alls. Anv\u00e4nd <a href=\"https:\/\/letsencrypt.org\/\" target=\"_blank\" rel=\"noopener\">Let&#8217;s Encrypt<\/a> med en ACME-klient som certbot, som f\u00f6rnyar automatiskt var 60:e dag. OpenSSL blir d\u00e5 ditt verktyg f\u00f6r fels\u00f6kning och inspektion, medan f\u00f6rnyelsen sk\u00f6ts av sig sj\u00e4lv. Korta giltighetstider \u00e4r en s\u00e4kerhetsf\u00f6rb\u00e4ttring, inte ett problem, s\u00e5 l\u00e4nge f\u00f6rnyelsen \u00e4r automatiserad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steg-12-forbered-for-postkvantkryptografi-ml-kem-och-ml-dsa\">Steg 12: F\u00f6rbered f\u00f6r postkvantkryptografi (ML-KEM och ML-DSA)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det h\u00e4r \u00e4r sk\u00e4let till att OpenSSL 3.5 \u00e4r en viktig version. Den \u00e4r den f\u00f6rsta LTS-utg\u00e5van med inbyggt st\u00f6d f\u00f6r de algoritmer som NIST standardiserade f\u00f6r att motst\u00e5 kvantdatorer. N\u00e4r en tillr\u00e4ckligt kraftfull kvantdator existerar kan den kn\u00e4cka dagens RSA och ECDSA, och d\u00e4rf\u00f6r p\u00e5g\u00e5r en bred \u00f6verg\u00e5ng redan nu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De tre nya algoritmerna i OpenSSL 3.5 \u00e4r ML-KEM (nyckelinkapsling, tidigare Kyber), ML-DSA (signaturer, tidigare Dilithium) och SLH-DSA (hashbaserade signaturer, tidigare SPHINCS+). Kontrollera att din installation k\u00e4nner igen dem:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl list -signature-algorithms | grep -i -E \"ML-DSA|SLH-DSA\"\nopenssl list -kem-algorithms | grep -i \"ML-KEM\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Du kan redan nu generera ett postkvants\u00e4kert signaturnyckelpar och prova fl\u00f6det, \u00e4ven om ekosystemet av betrodda CA:er \u00e4nnu inte st\u00f6der dem fullt ut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Generera en ML-DSA-65-nyckel (postkvant)\nopenssl genpkey -algorithm ML-DSA-65 -out mldsa.key\nopenssl pkey -in mldsa.key -text -noout | head -3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I praktiken handlar 2026 om hybridl\u00f6sningar, d\u00e4r en klassisk algoritm kombineras med en postkvants\u00e4ker f\u00f6r att t\u00e4cka b\u00e5da hoten samtidigt. \u00d6verg\u00e5ngsplanen \u00e4r v\u00e4l beskriven av <a href=\"https:\/\/csrc.nist.gov\/projects\/post-quantum-cryptography\" target=\"_blank\" rel=\"noopener\">NIST:s projekt f\u00f6r postkvantkryptografi<\/a>. F\u00f6r en bredare \u00f6verblick \u00f6ver var tekniken st\u00e5r just nu, se v\u00e5r genomg\u00e5ng i <a href=\"\/se\/cryptography-hub\/\">kryptografi-navet<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmval-2026-rsa-ecdsa-eller-ed25519\">Algoritmval 2026: RSA, ECDSA eller Ed25519<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vilken algoritm du v\u00e4ljer p\u00e5verkar prestanda, kompatibilitet och framtidss\u00e4kerhet. Den korta versionen: v\u00e4lj Ed25519 n\u00e4r du styr b\u00e5da \u00e4ndarna, ECDSA P-256 f\u00f6r bred TLS-kompatibilitet och RSA bara n\u00e4r ett regelverk eller en gammal klient kr\u00e4ver det. H\u00e4r \u00e4r en konkret j\u00e4mf\u00f6relse.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Algoritm<\/th><th>Nyckelstorlek<\/th><th>Ungef\u00e4rlig styrka<\/th><th>Prestanda<\/th><th>Kompatibilitet<\/th><th>B\u00e4st f\u00f6r<\/th><\/tr><\/thead><tbody><tr><td>RSA 2048<\/td><td>2048 bit<\/td><td>112-bitars<\/td><td>L\u00e5ngsam<\/td><td>Mycket bred<\/td><td>\u00c4ldre system, miniminiv\u00e5<\/td><\/tr><tr><td>RSA 3072<\/td><td>3072 bit<\/td><td>128-bitars<\/td><td>L\u00e5ngsammare<\/td><td>Bred<\/td><td>S\u00e4krare RSA-baslinje<\/td><\/tr><tr><td>RSA 4096<\/td><td>4096 bit<\/td><td>~140-bitars<\/td><td>L\u00e5ngsammast<\/td><td>Bred<\/td><td>Compliance som kr\u00e4ver RSA<\/td><\/tr><tr><td>ECDSA P-256<\/td><td>256 bit<\/td><td>128-bitars<\/td><td>Snabb<\/td><td>Mycket bred<\/td><td>Standard f\u00f6r TLS-certifikat<\/td><\/tr><tr><td>Ed25519<\/td><td>256 bit<\/td><td>~128-bitars<\/td><td>Snabbast<\/td><td>God (nyare system)<\/td><td>Nya interna system, SSH<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-block-table__caption\">J\u00e4mf\u00f6relse av algoritmer f\u00f6r nyckelgenerering i OpenSSL 3.5, 2026.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e4gg m\u00e4rke till att RSA-4096 inte ger dubbelt s\u00e5 mycket s\u00e4kerhet som RSA-2048 trots dubbel nyckelstorlek. S\u00e4kerheten v\u00e4xer l\u00e5ngsamt med nyckell\u00e4ngden hos RSA, medan kostnaden i prestanda v\u00e4xer snabbt. En ECDSA P-256-nyckel p\u00e5 256 bitar matchar RSA-3072 i styrka men \u00e4r m\u00e5nga g\u00e5nger snabbare. Det \u00e4r d\u00e4rf\u00f6r hela branschen r\u00f6rt sig mot elliptiska kurvor. F\u00f6r signering specifikt \u00e4r Ed25519 b\u00e5de snabbast och enklast att anv\u00e4nda korrekt, eftersom den inte kr\u00e4ver en slumpk\u00e4lla av h\u00f6g kvalitet vid varje signatur, en historisk felk\u00e4lla i ECDSA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fem-vanliga-fallgropar-att-undvika\">Fem vanliga fallgropar att undvika<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Efter att ha g\u00e5tt igenom stegen \u00e4r det v\u00e4rt att samla de misstag som oftast st\u00e4ller till det. Att k\u00e4nna igen dem i f\u00f6rv\u00e4g sparar timmar av fels\u00f6kning.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Gl\u00f6mt subjectAltName.<\/strong> Det \u00f6verl\u00e4gset vanligaste felet. Ett certifikat utan SAN avvisas av alla moderna webbl\u00e4sare, oavsett hur korrekt Common Name \u00e4r. Ange alltid <code>-addext \"subjectAltName=DNS:...\"<\/code> eller en extensionsfil.<\/li><li><strong>F\u00f6rv\u00e4xlat PEM och DER.<\/strong> F\u00e5r du &#8220;unable to load certificate&#8221; \u00e4r filen ofta i bin\u00e4rt DER-format medan kommandot f\u00f6rv\u00e4ntar sig PEM. L\u00e4gg till <code>-inform DER<\/code>.<\/li><li><strong>Felaktiga filr\u00e4ttigheter p\u00e5 privatnyckeln.<\/strong> En nyckel med r\u00e4ttigheterna 644 \u00e4r l\u00e4sbar f\u00f6r alla p\u00e5 systemet. S\u00e4tt <code>umask 077<\/code> innan du b\u00f6rjar, eller <code>chmod 600<\/code> efter\u00e5t.<\/li><li><strong>Nyckel och certifikat h\u00f6r inte ihop.<\/strong> Servern v\u00e4grar starta TLS om paret inte matchar. Verifiera alltid med hashen av den publika nyckeln, som i steg 8, innan drifts\u00e4ttning.<\/li><li><strong>F\u00f6r l\u00e5ng giltighetstid.<\/strong> Servercertifikat med \u00f6ver 825 dagars giltighet avvisas av webbl\u00e4sare. Anv\u00e4nd korta tider och automatisk f\u00f6rnyelse i st\u00e4llet.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">En sj\u00e4tte f\u00e4lla v\u00e4rd att n\u00e4mna \u00e4r att k\u00f6ra gamla kommandon fr\u00e5n internet som f\u00f6ruts\u00e4tter OpenSSL 1.1.1. Provider-arkitekturen i 3.x \u00e4ndrade hur vissa \u00e4ldre algoritmer (som RC4 eller MD5-baserade fl\u00f6den) n\u00e5s, och de ligger nu i en separat &#8220;legacy&#8221;-provider. Det \u00e4r medvetet: de \u00e4r os\u00e4kra och ska inte anv\u00e4ndas i nya system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"felsokning-atta-vanliga-problem-och-losningar\">Fels\u00f6kning: \u00e5tta vanliga problem och l\u00f6sningar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Den h\u00e4r tabellen samlar de felmeddelanden du sannolikt st\u00f6ter p\u00e5, med en konkret l\u00f6sning f\u00f6r varje.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Felmeddelande \/ symptom<\/th><th>Trolig orsak<\/th><th>L\u00f6sning<\/th><\/tr><\/thead><tbody><tr><td>unable to load certificate<\/td><td>Fel format (DER i st\u00e4llet f\u00f6r PEM)<\/td><td>L\u00e4gg till <code>-inform DER<\/code> eller konvertera filen<\/td><\/tr><tr><td>unable to load Private Key<\/td><td>Krypterad nyckel utan l\u00f6senord, eller fel filtyp<\/td><td>Ange l\u00f6senfras, kontrollera att det \u00e4r en nyckel och inte ett cert<\/td><\/tr><tr><td>NET::ERR_CERT_COMMON_NAME_INVALID<\/td><td>SAN saknas i certifikatet<\/td><td>\u00c5terskapa med <code>subjectAltName<\/code><\/td><\/tr><tr><td>key values mismatch<\/td><td>Nyckel och certifikat h\u00f6r inte ihop<\/td><td>Verifiera publik nyckel-hash, anv\u00e4nd r\u00e4tt par<\/td><\/tr><tr><td>self signed certificate (kod 18)<\/td><td>CA inte betrodd av klienten<\/td><td>F\u00f6rv\u00e4ntat i test, l\u00e4gg till CA som betrodd i produktion<\/td><\/tr><tr><td>certificate has expired (kod 10)<\/td><td>Utg\u00e5nget certifikat<\/td><td>F\u00f6rnya certifikatet, automatisera med ACME<\/td><\/tr><tr><td>error:0308010C:digital envelope routines<\/td><td>\u00c4ldre algoritm i legacy-providern<\/td><td>L\u00e4gg till <code>-provider legacy<\/code> eller byt algoritm<\/td><\/tr><tr><td>verify error: unable to get local issuer<\/td><td>Mellanliggande CA saknas i kedjan<\/td><td>Inkludera hela kedjan med <code>-CAfile<\/code> eller <code>-untrusted<\/code><\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-block-table__caption\">De \u00e5tta vanligaste OpenSSL-felen och hur du l\u00f6ser dem.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ett extra tips f\u00f6r sv\u00e5rare fall: l\u00e4gg till <code>-msg<\/code> och <code>-debug<\/code> p\u00e5 <code>s_client<\/code> f\u00f6r att se hela handskakningen byte f\u00f6r byte. Och kom ih\u00e5g att <code>openssl errstr<\/code> \u00f6vers\u00e4tter en hexadecimal felkod till l\u00e4sbar text, vilket sparar mycket gissande.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"avancerade-tips-for-openssl-i-produktion\">Avancerade tips f\u00f6r OpenSSL i produktion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e4r grunderna sitter finns det n\u00e5gra tekniker som lyfter din anv\u00e4ndning till en proffsniv\u00e5. De \u00e4r v\u00e4rda att k\u00e4nna till \u00e4ven om du inte anv\u00e4nder alla varje dag.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"generera-sakra-slumptal-och-losenord\">Generera s\u00e4kra slumptal och l\u00f6senord<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL \u00e4r en utm\u00e4rkt k\u00e4lla till kryptografiskt s\u00e4ker slump. Beh\u00f6ver du ett starkt l\u00f6senord eller en API-nyckel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 32 byte slump som base64 (bra l\u00f6senord)\nopenssl rand -base64 32\n\n# 16 byte som hex (bra f\u00f6r tokens)\nopenssl rand -hex 16<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hasha-och-signera-filer\">Hasha och signera filer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Du kan signera en fil med din privatnyckel och l\u00e5ta andra verifiera med din publika nyckel, samma princip som digitala signaturer p\u00e5 programuppdateringar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Signera\nopenssl dgst -sha256 -sign ed25519.key -out fil.sig fil.txt\n# Verifiera\nopenssl dgst -sha256 -verify ed25519.pub -signature fil.sig fil.txt<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hantera-flera-san-och-jokertecken\">Hantera flera SAN och jokertecken<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ett certifikat kan t\u00e4cka flera dom\u00e4ner, inklusive jokertecken. I extensionsfilen anger du helt enkelt fler rader: <code>subjectAltName = DNS:example.se,DNS:*.example.se,DNS:api.example.se<\/code>. Var dock medveten om att ett jokertecken bara matchar en niv\u00e5, s\u00e5 <code>*.example.se<\/code> t\u00e4cker <code>api.example.se<\/code> men inte <code>v1.api.example.se<\/code>. Det h\u00e4r \u00e4r en vanlig k\u00e4lla till f\u00f6rvirring vid drifts\u00e4ttning av flera subdom\u00e4ner.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"komplett-projekt-hela-kedjan-i-ett-skript\">Komplett projekt: hela kedjan i ett skript<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e4r knyter vi ihop allt. Skriptet nedan bygger en komplett milj\u00f6 fr\u00e5n noll: en egen CA, en servernyckel, ett signerat certifikat med SAN, och en verifiering att allt h\u00e4nger ihop. Spara det som <code>bygg-ca.sh<\/code>, g\u00f6r det k\u00f6rbart med <code>chmod +x bygg-ca.sh<\/code> och k\u00f6r det i en tom katalog.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nset -euo pipefail\numask 077\n\nDOMAIN=\"app.example.se\"\necho \"==> Bygger en komplett CA och certifikat f\u00f6r $DOMAIN\"\n\n# 1. Skapa CA (rotnyckel + rotcertifikat, 10 \u00e5r)\nopenssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ca.key\nopenssl req -x509 -new -key ca.key -sha256 -days 3650 \\\n  -subj \"\/C=SE\/O=Example Lab CA\/CN=Example Root CA\" -out ca.crt\necho \"==> CA skapad: ca.crt\"\n\n# 2. Servernyckel + CSR\nopenssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out site.key\nopenssl req -new -key site.key -subj \"\/C=SE\/O=Example AB\/CN=$DOMAIN\" -out site.csr\n\n# 3. Extensionsfil med SAN och r\u00e4tt anv\u00e4ndning\ncat > site.ext &lt;&lt;EOF\nsubjectAltName = DNS:$DOMAIN,DNS:www.$DOMAIN\nkeyUsage = critical, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nEOF\n\n# 4. CA signerar servercertifikatet (825 dagar)\nopenssl x509 -req -in site.csr -CA ca.crt -CAkey ca.key \\\n  -CAcreateserial -days 825 -sha256 -extfile site.ext -out site.crt\necho \"==> Servercertifikat signerat: site.crt\"\n\n# 5. Verifiera kedjan\necho \"==> Verifierar...\"\nopenssl verify -CAfile ca.crt site.crt\n\n# 6. Bekr\u00e4fta att nyckel och cert matchar\nK=$(openssl pkey -in site.key -pubout -outform DER | openssl sha256)\nC=$(openssl x509 -in site.crt -pubkey -noout | openssl pkey -pubin -outform DER | openssl sha256)\nif [ \"$K\" = \"$C\" ]; then\n  echo \"==> OK: nyckel och certifikat matchar.\"\nelse\n  echo \"==> FEL: nyckel och certifikat matchar INTE!\" >&2\n  exit 1\nfi\n\necho \"==> Klart. Filer: ca.crt, ca.key, site.crt, site.key\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6rv\u00e4ntad utdata n\u00e4r allt fungerar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>==> Bygger en komplett CA och certifikat f\u00f6r app.example.se\n==> CA skapad: ca.crt\n==> Servercertifikat signerat: site.crt\n==> Verifierar...\nsite.crt: OK\n==> OK: nyckel och certifikat matchar.\n==> Klart. Filer: ca.crt, ca.key, site.crt, site.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Med <code>set -euo pipefail<\/code> avbryts skriptet vid f\u00f6rsta fel, vilket g\u00f6r det s\u00e4kert att k\u00f6ra i automation. Du har nu en \u00e5teranv\u00e4ndbar mall som du kan anpassa f\u00f6r vilken dom\u00e4n som helst genom att bara \u00e4ndra variabeln <code>DOMAIN<\/code> h\u00f6gst upp.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sammanfattning-och-nasta-steg\">Sammanfattning och n\u00e4sta steg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Du har g\u00e5tt fr\u00e5n att kontrollera din OpenSSL-version till att bygga en komplett certifikatinfrastruktur och f\u00f6rbereda f\u00f6r postkvantkryptografi. De viktigaste l\u00e4rdomarna: anv\u00e4nd <code>genpkey<\/code> i st\u00e4llet f\u00f6r \u00e4ldre kommandon, gl\u00f6m aldrig subjectAltName, skydda dina privatnycklar med r\u00e4tt r\u00e4ttigheter, och automatisera f\u00f6rnyelsen av riktiga certifikat. OpenSSL 3.5 LTS ger dig st\u00f6d \u00e4nda till 2030 och en f\u00e4rdig v\u00e4g in i den postkvants\u00e4kra eran.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e4sta naturliga steg \u00e4r att koppla dina certifikat till en riktig webbserver, s\u00e4tta upp automatisk f\u00f6rnyelse med en ACME-klient, och l\u00e4sa in dig p\u00e5 hur TLS-handskakningen faktiskt fungerar. OpenSSL \u00e4r f\u00f6nstret in i hela den moderna kryptografin, och med stegen ovan har du verktygen f\u00f6r att fels\u00f6ka i stort sett vilket certifikatproblem som helst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"relaterad-lasning\">Relaterad l\u00e4sning<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"\/se\/https-och-tls\/\">HTTPS och TLS: h\u00e4ngl\u00e5set, certifikat och vad de skyddar<\/a><\/li><li><a href=\"\/se\/ssh-nycklar-linux\/\">SSH-nycklar i Linux: 12 steg, 20 min<\/a><\/li><li><a href=\"\/se\/pgp-kryptering-gpg\/\">PGP-kryptering med GPG: e-post i 12 steg<\/a><\/li><li><a href=\"\/se\/digitala-signaturer\/\">Digitala signaturer: hashfunktioner och asymmetriska nycklar<\/a><\/li><li><a href=\"\/se\/sha-256\/\">SHA-256 f\u00f6rklarad: 256-bitars fingeravtryck i SHA-2<\/a><\/li><li><a href=\"\/se\/veracrypt-kryptera-disk\/\">VeraCrypt: kryptera en disk i 12 steg<\/a><\/li><li><a href=\"\/se\/cryptography-hub\/\">Kryptografi: hashfunktioner, SHA och digitalt f\u00f6rtroende<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vanliga-fragor-om-openssl\">Vanliga fr\u00e5gor om OpenSSL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"vilken-openssl-version-ska-jag-anvanda-2026\">Vilken OpenSSL-version ska jag anv\u00e4nda 2026?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSL 3.5 LTS \u00e4r r\u00e4tt val f\u00f6r produktion. Den sl\u00e4pptes 8 april 2025 och f\u00e5r st\u00f6d till 8 april 2030. Den senaste utg\u00e5van i grenen var 3.5.7 i juni 2026. Undvik att stanna p\u00e5 3.0, vars fulla st\u00f6d upph\u00f6rde i september 2025, och v\u00e4lj 3.5 framf\u00f6r 3.6 eftersom 3.6 inte \u00e4r en LTS-version.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"vad-ar-skillnaden-mellan-genpkey-och-genrsa\">Vad \u00e4r skillnaden mellan genpkey och genrsa?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>genpkey<\/code> \u00e4r det moderna, generella kommandot i OpenSSL 3.x och hanterar alla algoritmer, inklusive RSA, EC, Ed25519 och de nya postkvantalgoritmerna. <code>genrsa<\/code> \u00e4r \u00e4ldre och bara f\u00f6r RSA. Anv\u00e4nd alltid <code>genpkey<\/code> i ny dokumentation och nya skript.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"varfor-avvisar-webblasaren-mitt-certifikat-trots-ratt-common-name\">Varf\u00f6r avvisar webbl\u00e4saren mitt certifikat trots r\u00e4tt Common Name?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6r att moderna webbl\u00e4sare ignorerar Common Name vid v\u00e4rdnamnsvalidering och kr\u00e4ver f\u00e4ltet subjectAltName (SAN). L\u00e4gg till <code>-addext \"subjectAltName=DNS:dindom\u00e4n.se\"<\/code> n\u00e4r du skapar CSR eller certifikat. Det h\u00e4r \u00e4r den vanligaste enskilda orsaken till certifikatfel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ska-jag-valja-rsa-ecdsa-eller-ed25519\">Ska jag v\u00e4lja RSA, ECDSA eller Ed25519?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e4lj Ed25519 f\u00f6r nya interna system d\u00e4r du styr b\u00e5da \u00e4ndarna, ECDSA P-256 f\u00f6r bred TLS-kompatibilitet, och RSA (minst 2048, helst 3072) bara n\u00e4r \u00e4ldre klienter eller regelverk kr\u00e4ver det. Elliptiska kurvor ger samma s\u00e4kerhet som RSA med mindre nycklar och h\u00f6gre prestanda.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"stoder-openssl-postkvantkryptografi\">St\u00f6der OpenSSL postkvantkryptografi?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. OpenSSL 3.5 LTS var den f\u00f6rsta utg\u00e5van med inbyggt st\u00f6d f\u00f6r de NIST-standardiserade algoritmerna ML-KEM (nyckelinkapsling), ML-DSA och SLH-DSA (signaturer). I praktiken anv\u00e4nds de 2026 oftast i hybridl\u00e4ge tillsammans med en klassisk algoritm under \u00f6verg\u00e5ngsperioden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hur-kontrollerar-jag-nar-ett-certifikat-gar-ut\">Hur kontrollerar jag n\u00e4r ett certifikat g\u00e5r ut?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">K\u00f6r <code>openssl x509 -in cert.crt -noout -enddate<\/code> f\u00f6r en lokal fil, eller <code>openssl s_client -connect dom\u00e4n.se:443 | openssl x509 -noout -dates<\/code> f\u00f6r en publik server. F\u00f6r automatisk \u00f6vervakning anv\u00e4nder du <code>openssl x509 -checkend 2592000<\/code>, som returnerar fel om certifikatet g\u00e5r ut inom 30 dagar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ar-ett-sjalvsignerat-certifikat-sakert\">\u00c4r ett sj\u00e4lvsignerat certifikat s\u00e4kert?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Krypteringen \u00e4r lika stark som hos ett betrott certifikat, men ingen utomst\u00e5ende litar p\u00e5 det automatiskt. Det passar f\u00f6r utveckling, interna tj\u00e4nster och testmilj\u00f6er. F\u00f6r publika webbplatser b\u00f6r du anv\u00e4nda ett certifikat fr\u00e5n en betrodd utf\u00e4rdare, exempelvis gratis via Let&#8217;s Encrypt, s\u00e5 att bes\u00f6karna slipper varningar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenSSL driver i tysthet det mesta av krypteringen p\u00e5 internet, fr\u00e5n HTTPS-sidor till krypterad e-post och signerade programuppdateringar. Verktyget finns redan installerat p\u00e5 i stort sett varje Linux-server och Mac,\u2026<\/p>\n","protected":false},"author":6,"featured_media":91,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,2],"tags":[],"class_list":["post-90","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-10","category-cryptography"],"_links":{"self":[{"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":1,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":92,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/posts\/90\/revisions\/92"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/media\/91"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/se\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}