Hej eleg-projekt-listan!
Här är ett sätt som verkar fungera för en användare som väljer att ha sin privata nyckel i en Yubikey.
Baserat på bland annat de här två: "HTTPS client certificates using Yubikeys" - https://johanfagerstroem.github.io/2021/https-client-certificates-with-yubik... "cURL Authentication using certificates from smartcard" - https://qwerty1q2w.medium.com/performing-client-authentication-in-curl-using...
Vi tänker oss medborgaren Alice som kör Debian på sin dator. Alice vill få ett e-id utfärdat till sig och hon vill använda en Yubikey för sin privata nyckel.
Alice installerar följande, vanliga debian-paket:
sudo apt install opensc libengine-pkcs11-openssl gnutls-bin sudo apt install ykcs11 sudo apt install yubikey-manager sudo apt install yubico-piv-tool
När yubikeyn sitter i datorn ska det gå att se den med följande kommando:
ykman info
Då visas serienummer mm. för Yubikeyn.
Sen kan Alice skapa ett nyckelpar där den privata nyckeln skapas på yubikeyn:
ykman piv generate-key 9a alice.pub
Skapa certificate signing request (CSR):
ykman piv generate-csr -s alice 9a alice.pub alice.csr
Då skapas filen alice.csr som Alice ger till utfärdaren, som i sin tur utfärdar ett personligt certifikat till Alice (det gör utfärdaren med hjälp CA-programvaran som vi diskuterat tidigare). Alice får sen sin certifikat-fil från utfärdaren, i detta exempel heter filen eid_200007171717.crt.pem och 200007171717 är Alice personnummer i det här testet.
Nu kan hon importera certifikat-filen in till yubikeyn:
ykman piv import-certificate 9a eid_200007171717.crt.pem
Sen är det klart, Alice har sitt certifikat och sin privata nyckel i sin yubikey.
Nu kan Alice använda sitt certifikat för att ansluta till test-sidan https://eid-test-2.eliasrudberg.se/
Två varianter av hur det kan göras: med curl eller Firefox
Alternativ 1: curl
Kör först "p11tool --list-tokens" för att få fram vilken "URL" som gäller för yubikeyn, det ser ut såhär:
$ p11tool --list-tokens [...] Token 1: URL: <här står URL-strängen> Label: PIV_II Type: Hardware token Flags: RNG, Requires login Manufacturer: piv_II Model: PKCS#15 emulated Serial: [...] Module: opensc-pkcs11.so
Den där "URL" ser ut ungefär såhär: "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=...;token=PIV_II"
Anslut sedan med curl på följande vis, där $url är den URL som visades av "p11tool --list-tokens" ovan:
curl -E $url https://eid-test-2.eliasrudberg.se/
--> då kommer en fråga om PIN-koden för yubikeyn:
"Enter PKCS#11 token PIN for PIV_II:"
och när man fyllt i den kommer man fram:
Hej! personnummer = 200007171717
Den texten, "Hej! personnummer = 200007171717", är alltså det som testsidan https://eid-test-2.eliasrudberg.se/ svarar med, så det betyder att det hela fungerar.
Alternativ 2: Firefox
Inställningar i Firefox: Settings --> Privacy & Security --> Certificates --> Knappen "Security Devices..." --> Knappen "Load" --> Skriv ett valfritt Module Name och ange Module filename /usr/lib/x86_64-linux-gnu/libykcs11.so --> Starta om Firefox och kolla "Security Devices..." igen för att se att den nya syns där, med namnet du satte.
När man sen går till https://eid-test-2.eliasrudberg.se/ i Firefox kommer en fråga om PIN-kod för yubikeyn och sen en ruta som säger: "This site has requested that you identify yourself with a certificate" och "Choose a certificate to present as identification" och en lista där det bara finns ett cert att välja, "Stored on Yubikey PIV #[...]". Väljer man det så fungerar sidan och visar det den ska, alltså "Hej! personnummer = 200007171717"
Så det verkar fungera, både med curl och med Firefox.
Hittills har bara jag själv testat det det här, alltså jag är "Alice" i testet och testar med en yubikey jag har på en dator jag har. Fler testare vore bra. Vi har några till yubikeys för test, jag kan skicka en till den som vill testa, säg bara till.
Vad tror ni om det här, verkar ovanstående vettigt?
Har jag tänkt fel någonstans eller missat något, finns enklare och/eller bättre sätt?
Vad krävs för att kunna göra motsvarande med andra typer av "Hardware token" än just yubikey?
/ Elias