Under Construction

Hinzufügen von Zertifikat und Public-Key zu dsc_key und/oder dsc_keystore

Für die Überprüfung der digitalen Signatur eines Filesets wird eigentlich nur der Public-Key benötigt. Da in der DSC aber nicht die ID des Public-Keys, sondern die ID des zu verwendenden Zertifikats hinterlegt ist, kann der Public-Key nur indirekt über das Zertifikat gefunden werden (siehe Verifizieren der digitalen Signatur eines Filesets). Ein Keystore wird nur verwendet, falls das Zertifikat fehlt.

Bei der Initialisierung von Trusted Installation werden die folgenden Zertifikate, Public-Keys und Keystores angelegt:

    • PKCS12 Keystore: dsc_keystore und /etc/security/pkgverify/keystore/aixpublic_73.p12
    • Zertifikat: dsc_key und /etc/security/pkgverify/certfile/aixpublic_73.pem
    • Public-Key: dsc_key und /etc/security/pkgverify/key/aixpublic_73.key

Wobei im Prinzip der Keystore ausreichend wäre, da das Zertifikat aus diesem extrahiert werden kann und aus dem Zertifikat dann wiederum der Public-Key.

Alle Objekte in dsc_key und dsc_keystore haben eine ID. Zertifikat und zugehöriger Keystore müssen die gleiche ID haben!

Wir starten mit dem vorher erzeugten Zertifikat cert.pem und erzeugen einen Keystore unter /etc/security/pkgverify/keystore mit diesem Zertifikat.

# /usr/java8_64/jre/bin/keytool -importcert -alias mypublic -file cert.pem -storetype pkcs12 -keystore /etc/security/pkgverify/keystore/mypublic.p12 -noprompt
Enter keystore password:  XXXXXXXXX
Re-enter new password: XXXXXXXXX
Certificate was added to keystore
#

Als Dateinamen haben wir mypublic.p12 gewählt. Für das Zertifikat haben wir den Aliasnamen mypublic vergeben. Der Keystore Typ ist pkcs12.

Damit Trusted Installation diesen Keystore auch findet, muss er über einen ODM-Eintrag in dsc_keystore referenziert sein. Ein Eintrag in dieser ODM hat die folgenden Felder:

# ODMDIR=/usr/lib/objrepos odmshow dsc_keystore
class dsc_keystore {
        long id;                                     /* offset: 0xc ( 12) */
        char type[32];                               /* offset: 0x10 ( 16) */
        char alias[256];                             /* offset: 0x30 ( 48) */
        char location[256];                          /* offset: 0x130 ( 304) */
        };
/*
        descriptors:    4
        structure size: 0x230 (560) bytes
        data offset:    0x20c
        population:     2 objects (2 active, 0 deleted)
*/


#

Das Feld type hat den Wert pkcs12, für alias geben wir den Aliasnamen mypublic von oben an und für location den absoluten Pfad des Keystores. Als id darf keine schon in dsc_key oder dsc_keystore verwendete ID benutzt werden. Daher sollte vor dem Hinzufügen eines Keystores zur ODM dsc_keystore die schon verwendeten IDs aufgelistet und dann eine noch nicht verwendete ID herausgesucht werden:

# ( ODMDIR=/usr/lib/objrepos odmget dsc_keystore; ODMDIR=/usr/lib/objrepos odmget dsc_key ) | grep -w id | sort -u
        id = 1
        id = 3
#

Verwendet sind also bisher nur die IDs 1 und 3. Der schon existierende Keystore Eintrag hat die ID 3, wir verwenden die nächst höhere ID 4 und legen mit odmadd den Eintrag für unseren Keystore an:

# ODMDIR=/usr/lib/objrepos odmadd <<EOF
> dsc_keystore:
>         id = 4
>         type = "pkcs12"
>         alias = "mypublic"
>         location = "/etc/security/pkgverify/keystore/mypublic.p12"
>
> EOF
#

Als nächstes extrahieren wir das enthaltende Zertifikat und speichern es unter /etc/security/pkgverify/certfile unter dem Namen mypublic.pem ab:

# /usr/java8_64/jre/bin/keytool -exportcert -alias mypublic -file /etc/security/pkgverify/certfile/mypublic.pem -storetype pkcs12 -keystore /etc/security/pkgverify/keystore/mypublic.p12
Enter keystore password:  XXXXXXXXX
Certificate stored in file </etc/security/pkgverify/certfile/mypublic.pem>
#

Zum Auffinden des Zertifikats wird ein Eintrag in dsc_key vom Typ certfile gebraucht, mit den folgenden weiteren Feldern:

# ODMDIR=/usr/lib/objrepos odmshow dsc_key
class dsc_key {
        long id;                                     /* offset: 0xc ( 12) */
        char type[32];                               /* offset: 0x10 ( 16) */
        char alias[256];                             /* offset: 0x30 ( 48) */
        char location[256];                          /* offset: 0x130 ( 304) */
        vchar modulus[128];                          /* offset: 0x230 ( 560) */
        vchar hash[32];                              /* offset: 0x234 ( 564) */
        link dsc_keystore dsc_keystore id keystore[11];/* offset: 0x238 ( 568) */
        };
/*
        descriptors:    7
        structure size: 0x24c (588) bytes
        data offset:    0x2a8
        population:     4 objects (4 active, 0 deleted)
*/


#

Die id muss die ID des zugehörigen Keystore sein (in unserem Falle ID 04). Der Typ (Feld type) ist „certificate“, für alias wird wieder der Aliasname verwendet, das Feld location spezifiert den Pfad zum Zertifikat (/etc/security/pkgverify/certfile/mypublic.pem) und das Feld keystore gibt die ID des zugehörigen Keystores an (in diesem Fall 04). Für das Feld hash wird der für die digitalen Signaturen verwendete Hash-Algorithmus angegeben, typischerweise ist das „sha256“. Der Modulus des Zertifikats kann wie folgt ermittelt werden:

# openssl x509 -in /etc/security/pkgverify/certfile/mypublic.pem -noout -modulus | openssl md5
MD5(stdin)= c65cc3a747241b647576b7b10db166aa
#

Damit kann der folgende Eintrag der ODM dsc_key für das Zertifikat hinzugefügt werden:

# ODMDIR=/usr/lib/objrepos odmadd <<EOF
> dsc_key:
>         id = 4
>         type = "certificate"
>         alias = "mypublic"
>         location = "/etc/security/pkgverify/certfile/mypublic.pem"
>         modulus = "c65cc3a747241b647576b7b10db166aa"
>         hash = "sha256"
>         keystore = "4"
>
> EOF
#

Als letztes extrahieren wir den Public-Key aus dem Zertifikat und speichern diesen unter /etc/security/pkgverify/key/mypublic.key ab:

# openssl x509 -in /etc/security/pkgverify/certfile/mypublic.pem -noout -pubkey -out /etc/security/pkgverify/key/mypublic.key
#

Auch hier muss anschließend ein Eintrag in dsc_key erzeugt werden, dieses Mal vom Typ (type) „key“. Der Modulus für einen Public-Key kann mit csum ermittelt werden:

# csum -h MD5 /etc/security/pkgverify/key/mypublic.key
5e2a18f999c86a51df869586d4396689  /etc/security/pkgverify/key/mypublic.key
#

Der Eintrag muss wieder eine eindeutige eigene ID haben. Wir verwenden die nächste freie ID 05. Der zugehörige Keystore ist wieder unser Keystore mit der ID 04. Damit kann dann der folgende ODM-Eintrag für den Public-Key erstellt werden:

# ODMDIR=/usr/lib/objrepos odmadd <<EOF
> dsc_key:
>         id = 5
>         type = "key"
>         alias = "mypublic"
>         location = "/etc/security/pkgverify/key/mypublic.key"
>         modulus = "5e2a18f999c86a51df869586d4396689"
>         hash = "sha256"
>         keystore = "4"
>
> EOF
#

Die obigen Schritte müssen für jedes neue Zertifikat wiederholt werden. In den meisten Fällen wird  man aber neben dem Zertifikat von IBM und einem eigenen Zertifikat in der Regel keine weiteren Zertifikate haben.