Muutokset

Siirry navigaatioon Siirry hakuun

ASN1

7 310 merkkiä lisätty, 20. maaliskuuta 2021 kello 17.26
Ak: Uusi sivu: Abstract Syntax Notation One (ASN.1) on määrittelykieli jolla voidaan määritellä tieto-objectin rakenne. ASN.1 ei suoraan määrittele objektin rakennetta vaan sen määrittel...
Abstract Syntax Notation One (ASN.1) on määrittelykieli jolla voidaan määritellä tieto-objectin rakenne. ASN.1 ei suoraan määrittele objektin rakennetta vaan sen määrittelee ASN.1 määrityksen pohjalta koodausmenetelmä. Erilaisia koodausmenetelmiä on useita ja eri protokollissa käytetään erilaisia koodauksia.

== ASN.1 rakenne ==

Esimerkki ASN.1 kielestä on esim seuraava varmenteen kuvaus:

<pre>
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }

TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}

Version ::= INTEGER { v1(0), v2(1), v3(2) }

CertificateSerialNumber ::= INTEGER

AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }

Validity ::= SEQUENCE {
notBefore Time,
notAfter Time }

Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
</pre>

Tämä kertoo että '''Certificate''' objekti koostuu kolmesta osasta, joista ensimmäinen on nimeltään '''tbsCertificate''' ja se on kuvattu '''TBSCertificate''' määrittelyssä. Toinen osa on nimeltään '''signatureAlgoritm''' ja sen määrittely on kuvattu '''AlgorithmIdentifier''' määrittelyssä. Viimeisenä tulee itse allekirjoitus '''signatureValue''' kentässä ja sen kenttä on muodoltaan '''BIT STRING'''.

Seuraavana sitten siirrytään '''TBSCertificate''' rakenteen määrittelyyn. Kyseinen rakenne on peräkkäisrakenne jossa on monta kenttää peräkkäin, joista ensimmäinen on '''version''' niminen kenttä. Tuolla kenttä on oletuksena arvoltaan '''v1''' ja sen määrittely on kuvattu '''Version''' määrittelyssä. '''Version''' määrittely puolestaan kertoo että kyseessä on numero jolla voi olla arvot 0, 1, tai 2 ja niistä käytetään nimiä '''v1''', '''v2''' tai '''v3'''. Jokaisella kentällä ASN.1:ssä voi olla joko IMPLICIT tai EXPLICIT tag ja tuo '''[0] EXPLICIT''' tarkoittaa että jos tuo kenttä on olemassa (eli siis ei käytetä oletus '''v1''' arvoa, niin sen edessä pitää olla erikseen tag arvolla 0.

Seuraavana tulee '''serialNumber''' joka on määritelty '''CertificateSerialNumber''' määrittelyssä olemaan tyypiltään numero. Tämän jälkeen tulee '''signature''' kenttä joka kertoo allekirjoituksen muodon ja sen kentän muoto on määritelty '''AlgorithmIdentifier''' määrittelyssä. Huomaa että alun '''Certificate''' määrittelyssä määriteltiin myös kenttä nimeltä '''signatureAlgorithm''' joka oli tätä samaa muotoa. '''AlgorithmIdentifier''' määrittelee että se on sarjarakenne jossa on kaksi kenttää, ensimmäinen on '''algorithm''' joka on OBJECT IDENTIFIER tyyppinen ja toisena on '''parameters'' kenttä joka voi olla mitä tahansa ja se voi olla myös tyhjä. Tuon toisen kentän määrittely riippuu siitä mikä '''algorithm''' kentän arvo oli. Loppu ASN.1 määrittely jatkuu samalla tavalla.

Tuossa '''Time''' määrittelyssä oleva '''CHOICE''' kertoo että vain yksi noista kentistä siellä sisällä saa olla olemassa ja tässä tapauksessa se mikä siellä on tunnistetaan tyypistä. '''CHOICE''':n kanssa pitää hyvin usein käyttää noita tagejä, koska jos sen sisällä on esim kaksi '''INTEGER''' kenttää niin ilman tagejä ei voi tietää kumpi niistä on annettu.

== Perus tyypit ==

ASN.1:ssä on useita perustavaa laatua olevia tyyppejä:

* INTEGER - mielivaltaisen numero
* BIT STRING - bittijono, jonka pituus ei välttämättä ole kokonaisia tavuja
* OCTET STRING - jono 8-bittisiä tavuja
* NULL - tyhjä objekti
* OBJECT IDENTIFIER - Objektin numero
* SEQUENCE OF - Jono kenttiä annetussa järjestyksessä
* SET OF - joukko kenttiä ilman järjestystä
* PrintableString - merkkijono joka koostuu merkeistä a-zA-Z0-9 ja erikoismerkeistä välilyönti ' ( ) + , - . / : = ?
* UTF8String - UTF8 merkkijono
* UTCTime - Aika ja päivä muodossa YYMMDDHHMMSSZ, eli ilman vuosisataa
* GeneralizedTime - Aika ja päivä muodossa YYYYMMDDHHMMSSZ.

== OBJECT IDENTIFIER ==

ASN.1 mahdollistaa objectin numeron kuvaamisen hierarkkisena taulukkona kokonaislukuja, tyyliin 1.2.840.113549.1.1.13. Jokainen hierarkian taso kuvaa alitasoa hiearkian sisällä. Esim tuossa esimerkissä ensimmäinen '''1''' kertoo että tämän objectin päätaso on '''iso''', seuraava '''2''' kertoo että se on '''member-body''', seuraava '''840''' kertoo että kyseinen iso:n jäsenvaltio on '''us''' ja seuraava numero '''113549''' kuvaa että se on noin mones USA:n organisaatiolle antama tunnus ja viittaa tässä tapauksessa '''rsadsi''' nimiseen yritykseen. Tämä yritys on sitten varannut numeron '''1''' omasta hiearkiastaan kuvaamaan heidän omia '''pkcs''' standardejaan ja seuraava '''1''' kertoo että kyseessä on heidän ensimmäinen tällainen standardi eli '''pkcs-1''' ja viimeinen numero '''13''' kertoo että kyseessä on kyseisessä standardissa määritelty alinumero 13, joka tarkoittaa tässä tapauksessa että algoritminä on '''sha512WithRSAEncryption''' <ref name='1.2.840.113549.1.1.3'>[http://oid-info.com/get/1.2.840.113549.1.1.13 1.2.840.113549.1.1.13 tiedot oid-info.com sivustolta]</ref>

== Koodaukset ==

ASN.1 määrittelee siis vain tieto-objektin muodon, ei sitä miten se koodataan lähetystä tai talletusta varten. Tätä varten on olemassa useita erilaisia koodauksia, joilla on erilaisia käyttötarkoituksia. Yleisimpiä on:

* BER - Basic Encoding Rules
* DER - Distinguished Encoding Rules
* CER - Canonical Encoding Rules
* PER - Packed Encoding Rules
* XER - Basic XML Encoding Rules
* JER - JSON Encoding Rules

Näistä hyvin yleisesti käytetään '''DER''' muotoa sen takia että siinä jokaisella objectilla on vain yksi määritelty muoto ja näin ollen allekirjoitusten jne laskeminen ei muutu vaikka joku välissä purkaisi objectin johonkin muuhun muotoon ja sen jälkeen pakkaisi sen takaisin '''DER''' muotoon.

== Käyttö ==

ASN.1 on hyvin laajassa käytössä, sekä tietoliikenteessä että internetissä. Sitä käyttää mm [[X509]] varmenteet, [[LDAP]], SNMP, jne.

== Katso myös ==

* [[Varmenne]]
* [[X509]]
* [[LDAP]]
* [[OCSP]]
* [[CMS]]

== Aiheesta muualla ==
* https://en.wikipedia.org/wiki/ASN.1
* http://oid-info.com/index.htm
* http://luca.ntop.org/Teaching/Appunti/asn1.html -- Layman's Guide to Subset of ASN.1, BER, and DER.
* https://datatracker.ietf.org/doc/rfc5280/

== Lähteet ==
<references/>

[[Luokka:Allekirjoitus‏‎]]

Navigointivalikko