- <div class="title"><a href="http://people.skolelinux.org/pere/blog/Fetching_trusted_timestamps_using_the_rfc3161ng_python_module.html">Fetching trusted timestamps using the rfc3161ng python module</a></div>
- <div class="date"> 8th October 2018</div>
- <div class="body"><p>I have earlier covered the basics of trusted timestamping using the
-'openssl ts' client. See blog post for
-<a href="http://people.skolelinux.org/pere/blog/Public_Trusted_Timestamping_services_for_everyone.html">2014</a>,
-<a href="http://people.skolelinux.org/pere/blog/syslog_trusted_timestamp___chain_of_trusted_timestamps_for_your_syslog.html">2016</a>
-and
-<a href="http://people.skolelinux.org/pere/blog/Idea_for_storing_trusted_timestamps_in_a_Noark_5_archive.html">2017</a>
-for those stories. But some times I want to integrate the timestamping
-in other code, and recently I needed to integrate it into Python.
-After searching a bit, I found
-<a href="https://dev.entrouvert.org/projects/python-rfc3161">the
-rfc3161 library</a> which seemed like a good fit, but I soon
-discovered it only worked for python version 2, and I needed something
-that work with python version 3. Luckily I next came across
-<a href="https://github.com/trbs/rfc3161ng/">the rfc3161ng library</a>,
-a fork of the original rfc3161 library. Not only is it working with
-python 3, it have fixed a few of the bugs in the original library, and
-it has an active maintainer. I decided to wrap it up and make it
-<a href="https://tracker.debian.org/pkg/python-rfc3161ng">available in
-Debian</a>, and a few days ago it entered Debian unstable and testing.</p>
-
-<p>Using the library is fairly straight forward. The only slightly
-problematic step is to fetch the required certificates to verify the
-timestamp. For some services it is straight forward, while for others
-I have not yet figured out how to do it. Here is a small standalone
-code example based on of the integration tests in the library code:</p>
-
-<pre>
-#!/usr/bin/python3
-
-"""
-
-Python 3 script demonstrating how to use the rfc3161ng module to
-get trusted timestamps.
-
-The license of this code is the same as the license of the rfc3161ng
-library, ie MIT/BSD.
-
-"""
-
-import os
-import pyasn1.codec.der
-import rfc3161ng
-import subprocess
-import tempfile
-import urllib.request
-
-def store(f, data):
- f.write(data)
- f.flush()
- f.seek(0)
-
-def fetch(url, f=None):
- response = urllib.request.urlopen(url)
- data = response.read()
- if f:
- store(f, data)
- return data
-
-def main():
- with tempfile.NamedTemporaryFile() as cert_f,\
- tempfile.NamedTemporaryFile() as ca_f,\
- tempfile.NamedTemporaryFile() as msg_f,\
- tempfile.NamedTemporaryFile() as tsr_f:
-
- # First fetch certificates used by service
- certificate_data = fetch('https://freetsa.org/files/tsa.crt', cert_f)
- ca_data_data = fetch('https://freetsa.org/files/cacert.pem', ca_f)
-
- # Then timestamp the message
- timestamper = \
- rfc3161ng.RemoteTimestamper('http://freetsa.org/tsr',
- certificate=certificate_data)
- data = b"Python forever!\n"
- tsr = timestamper(data=data, return_tsr=True)
-
- # Finally, convert message and response to something 'openssl ts' can verify
- store(msg_f, data)
- store(tsr_f, pyasn1.codec.der.encoder.encode(tsr))
- args = ["openssl", "ts", "-verify",
- "-data", msg_f.name,
- "-in", tsr_f.name,
- "-CAfile", ca_f.name,
- "-untrusted", cert_f.name]
- subprocess.check_call(args)
-
-if '__main__' == __name__:
- main()
-</pre>
-
-<p>The code fetches the required certificates, store them as temporary
-files, timestamp a simple message, store the message and timestamp to
-disk and ask 'openssl ts' to verify the timestamp. A timestamp is
-around 1.5 kiB in size, and should be fairly easy to store for future
-use.</p>
-
-<p>As usual, if you use Bitcoin and want to show your support of my
-activities, please send Bitcoin donations to my address
-<b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
+ <div class="title"><a href="http://people.skolelinux.org/pere/blog/_pen_og_gjennomsiktig_vedlikehold_av_spesifikasjonen_for_Noark_5_Tjenestegrensesnitt.html">Åpen og gjennomsiktig vedlikehold av spesifikasjonen for Noark 5 Tjenestegrensesnitt</a></div>
+ <div class="date">11th March 2019</div>
+ <div class="body"><p>Et virksomhetsarkiv for meg, er et arbeidsverktøy der en enkelt kan
+finne informasjonen en trenger når en trenger det, og der
+virksomhetens samlede kunnskap er tilgjengelig. Det må være greit å
+finne frem i, litt som en bibliotek. Men der et bibliotek gjerne tar
+vare på offentliggjort informasjon som er tilgjengelig flere steder,
+tar et arkiv vare på virksomhetsintern og til tider personlig
+informasjon som ofte kun er tilgjengelig fra et sted.</p>
+
+<p>Jeg mistenker den eneste måten å sikre at arkivet inneholder den
+samlede kunnskapen i en virksomhet, er å bruke det som virksomhetens
+kunnskapslager. Det innebærer å automatisk kopiere (brev, epost,
+SMS-er etc) inn i arkivet når de sendes og mottas, og der filtrere
+vekk det en ikke vil ta vare på, og legge på metadata om det som er
+samlet inn for enkel gjenfinning. En slik bruk av arkivet innebærer at
+arkivet er en del av daglig virke, ikke at det er siste hvilested for
+informasjon ingen lenger har daglig bruk for. For å kunne være en del
+av det daglige virket må arkivet enkelt kunne integreres med andre
+systemer. I disse dager betyr det å tilby arkivet som en
+nett-tjeneste til hele virksomheten, tilgjengelig for både mennesker
+og datamaskiner. Det betyr i tur å både tilby nettsider og et
+maskinlesbart grensesnitt.</p>
+
+<p>For noen år siden erkjente visjonære arkivarer fordelene med et
+standardisert maskinlesbart grensesnitt til organisasjonens arkiv. De
+gikk igang med å lage noe de kalte
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/">Noark
+5 Tjenestegrensesnitt</a>. Gjort riktig, så åpner slike maskinlesbare
+grensesnitt for samvirke på tvers av uavhengige programvaresystemer.
+Gjort feil, vil det blokkere for samvirke og bidra til
+leverandørinnlåsing. For å gjøre det riktig så må grensesnittet være
+klart og entydig beskrevet i en spesifikasjon som gjør at
+spesifikasjonen tolkes på samme måte uavhengig av hvem som leser den,
+og uavhengig av hvem som tar den i bruk.</p>
+
+<p>For å oppnå klare og entydige beskrivelser i en spesifikasjon, som
+trengs for å kunne få en fri og åpen standard (se
+<a href="http://people.skolelinux.org/pere/blog/Fri_og__pen_standard__slik_Digistan_ser_det.html">Digistan-definisjon</a>),
+så trengs det en åpen og gjennomsiktig inngangsport med lav terskel,
+der de som forsøker å ta den i bruk enkelt kan få inn korreksjoner,
+etterlyse klargjøringer og rapportere uklarheter i spesifikasjonen.
+En trenger også automatiserte datasystemer som måler og sjekker at et
+gitt grensesnitt fungerer i tråd med spesifikasjonen.</p>
+
+<p>For Noark 5 Tjenestegrensesnittet er det nå etablert en slik åpen
+og gjennomsiktig inngangsport på prosjekttjenesten github. Denne
+inngangsporten består først og fremst av en åpen portal som lar enhver
+se hva som er gjort av endringer i spesifikasjonsteksten over tid, men
+det hører også med et åpent "diskusjonsforum" der en kan
+komme med endringsforslag og forespørsler om klargjøringer. Alle
+registrerte brukere på github kan bidra med innspill til disse
+henvendelsene.</p>
+
+<p>I samarbeide med Arkivverket har jeg fått opprettet et git-depot
+med spesifikasjonsteksten for tjenestegrensesnittet, der det er lagt
+inn historikk for endringer i teksten de siste årene, samt lagt inn
+endringsforslag og forespørsler om klargjøring av teksten. Bakgrunnen
+for at jeg bidro med dette er at jeg er involvert i
+<a href="https://gitlab.com/OsloMet-ABI/nikita-noark5-core">Nikita-prosjektet</a>,
+som lager en fri programvare-utgave av Noark 5 Tjenestegrensesnitt.
+Det er først når en forsøker å lage noe i tråd med en spesifikasjon at
+en oppdager hvor mange detaljer som må beskrives i spesifikasjonen for
+å sikre samhandling.</p>
+
+<p>Spesifikasjonen vedlikeholdes i et rent tekstformat, for å ha et
+format egnet for versjonskontroll via versjontrollsystemet git. Dette
+gjør det både enkelt å se konkret hvilke endringer som er gjort når,
+samt gjør det praktisk mulig for enhver med github-konto å sende inn
+endringsforslag med formuleringer til spesifikasjonsteksten. Dette
+tekstformatet vises frem som nettsider på github, slik at en ikke
+trenger spesielle verktøy for å se på siste utgave av
+spesifikasjonen.</p>
+
+<p>Fra dette rene tekstformatet kan det så avledes ulike formater, som
+HTML for websider, PDF for utskrift på papir og ePub for lesing med
+ebokleser. Avlednings-systemet (byggesystemet) bruker i dag
+verktøyene pandoc, latex, docbook-xsl og GNU make til
+transformasjonen. Tekstformatet som brukes dag er
+<a href="https://www.markdownguide.org/">Markdown</a>, men det vurderes
+å
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/issues/9">endre
+til formatet RST</a> i fremtiden for bedre styring av utseende på
+PDF-utgaven.</p>
+
+<p>Versjonskontrollsystemet git ble valgt da det er både fleksibelt,
+avansert og enkelt å ta i bruk. Github ble valgt (foran f.eks. Gitlab
+som vi bruker i Nikita), da Arkivverket allerede hadde tatt i bruk
+Github i andre sammenhenger.</p>
+
+<p>Enkle endringer i teksten kan gjøres av priviligerte brukere
+direkte i nettsidene til Github, ved å finne aktuell fil som skal
+endres (f.eks. kapitler/03-konformitet.md), klikke på den lille
+bokstaven i høyre hjørne over teksten. Det kommer opp en nettside der
+en kan endre teksten slik en ønsker. Når en er fornøyd med endringen
+så må endringen "sjekkes inn" i historikken. Det gjøres ved
+å gi en kort beskrivelse av endringen (beskriv helst hvorfor endringen
+trengs, ikke hva som er endret), under overskriften "Commit
+changes". En kan og bør legge inn en lengre forklaring i det
+større skrivefeltet, før en velger om endringen skal sendes direkte
+til 'master'-grenen (dvs. autorativ utgave av spesifikasjonen) eller
+om en skal lage en ny gren for denne endringen og opprette en
+endringsforespørsel (aka "Pull Request"/PR). Når alt dette
+er gjort kan en velge "Commit changes" for å sende inn
+endringen. Hvis den er lagt inn i "master"-grenen så er den
+en offisiell del av spesifikasjonen med en gang. Hvis den derimot er
+en endringsforespørsel, så legges den inn i
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/pulls">listen
+over forslag til endringer</a> som venter på korrekturlesing og
+godkjenning.</p>
+
+<p>Større endringer (for eksempel samtidig endringer i flere filer)
+gjøres enklest ved å hente ned en kopi av git-depoet lokalt og gjøre
+endringene der før endringsforslaget sendes inn. Denne prosessen er
+godt beskrivet i dokumentasjon fra github. Git-prosjektet som skal
+"klones" er
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/">https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/</a>.</p>
+
+<p>For å registrere nye utfordringer (issues) eller kommentere på
+eksisterende utfordringer benyttes nettsiden
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/issues">https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/issues</a>.
+I skrivende stund er det 48 åpne og 11 avsluttede utfordringer. Et
+forslag til hva som bør være med når en beskriver en utfordring er
+tilgjengelig som utfordring
+<a href="https://github.com/arkivverket/noark5-tjenestegrensesnitt-standard/issues/14">#14</a>.</p>
+
+<p>For å bygge en PDF-utgave av spesifikasjonen så bruker jeg i dag en
+Debian GNU/Linux-maskin med en rekke programpakker installert. Når
+dette er på plass, så holder det å kjøre kommandoen 'make pdf html' på
+kommandolinjen, vente ca. 20 sekunder, før spesifikasjon.pdf og
+spesifikasjon.html ligger klar på disken. Verktøyene for bygging av
+PDF, HTML og ePub-utgave er også tilgjengelig på Windows og
+MacOSX.</p>
+
+<p>Github bidrar med rammeverket. Men for at åpent vedlikehold av
+spesifikasjonen skal fungere, så trengs det folk som bidrar med sin
+tid og kunnskap. Arkivverket har sagt de skal bidra med innspill og
+godkjenne forslag til endringer, men det blir størst suksess hvis alle
+som bruker og lager systemer basert på Noark 5 Tjenestegrensesnitt
+bidrar med sin kunnskap og kommer med forslag til forebedringer. Jeg
+stiller. Blir du med?</p>
+
+<p>Det er viktig å legge til rette for åpen diskusjon blant alle
+interesserte, som ikke krever at en må godta lange kontrakter med
+vilkår for deltagelse. Inntil Arkivverket dukker opp på IRC har vi
+laget en IRC-kanal der interesserte enkelt kan orientere seg og
+diskutere tjenestegrensesnittet. Alle er velkommen til å ta turen
+innom
+<a href="https://webchat.freenode.net/?channels=nikita">#nikita</a>
+(f.eks. via irc.freenode.net) for å møte likesinnede.</p>
+
+<p>Det holder dog ikke å ha en god spesifikasjon, hvis ikke de som tar
+den i bruk gjør en like god jobb. For å automatisk teste om et konkret
+tjenestegrensesnitt følger (min) forståelse av
+spesifikasjonsdokumentet, har jeg skrevet et program som kobler seg
+opp til et Noark 5v4 REST-tjeneste og tester alt den finner for å se
+om det er i henhold til min tolkning av spesifikasjonen. Dette
+verktøyet er tilgjengelig fra
+<a href="https://github.com/petterreinholdtsen/noark5-tester">https://github.com/petterreinholdtsen/noark5-tester</a>,
+og brukes daglig mens vi utvikler Nikita for å sikre at vi ikke
+introduserer nye feil. Hvis en skal sikre samvirke på tvers av ulike
+systemer er det helt essensielt å kunne raskt og automatisk sjekke at
+tjenestegrensesnittet oppfører seg som forventet. Jeg håper andre som
+lager sin utgave av tjenestegrensesnittet vi bruke dette verktøyet,
+slik at vi tidlig og raskt kan oppdage hvor vi har tolket
+spesifikasjonen ulikt, og dermed få et godt grunnlag for å gjøre
+spesifikasjonsteksten enda klarere og bedre.</p>
+
+<p>Dagens beskrivelse av Noark 5 Tjenestegrensesnitt er et svært godt
+utgangspunkt for å gjøre virksomhetens arkiv til et dynamisk og
+sentralt arbeidsverktøy i organisasjonen. Blir du med å gjøre den
+enda bedre?</p>