Zum Hauptinhalt springen

3. Structure of the Raw Public Key Extension (Struktur der Erweiterung für rohe öffentliche Schlüssel)

3. Structure of the Raw Public Key Extension (Struktur der Erweiterung für rohe öffentliche Schlüssel)

Dieser Abschnitt definiert die beiden TLS-Erweiterungen client_certificate_type und server_certificate_type, die als Teil eines erweiterten TLS-Handshakes verwendet werden können, wenn rohe öffentliche Schlüssel verwendet werden. Section 4 definiert das Verhalten des TLS-Clients und des TLS-Servers unter Verwendung dieser Erweiterungen.

Diese Spezifikation verwendet rohe öffentliche Schlüssel (raw public keys), wobei die bereits verfügbare Kodierung, die in einem PKIX-Zertifikat in Form einer SubjectPublicKeyInfo-Struktur verwendet wird, wiederverwendet wird. Um den rohen öffentlichen Schlüssel innerhalb des TLS-Handshakes zu transportieren, wird die Certificate-Nutzlast als Container verwendet, wie in Abbildung 1 gezeigt. Die gezeigte Certificate-Struktur ist eine Anpassung ihrer ursprünglichen Form [RFC5246].

   opaque ASN.1Cert<1..2^24-1>;

struct {
select(certificate_type){

// certificate type defined in this document.
case RawPublicKey:
opaque ASN.1_subjectPublicKeyInfo<1..2^24-1>;

// X.509 certificate defined in RFC 5246
case X.509:
ASN.1Cert certificate_list<0..2^24-1>;

// Additional certificate type based on
// "TLS Certificate Types" subregistry
};
} Certificate;

Figure 1: Certificate Payload as a Container for the Raw Public Key (Abbildung 1: Certificate-Nutzlast als Container für den rohen öffentlichen Schlüssel)

Die SubjectPublicKeyInfo-Struktur ist in Abschnitt 4.1 von RFC 5280 [PKIX] definiert und enthält nicht nur die rohen Schlüssel, wie z. B. den öffentlichen Exponenten und den Modulus eines öffentlichen RSA-Schlüssels, sondern auch einen Algorithmus-Identifikator. Der Algorithmus-Identifikator kann auch Parameter enthalten. Der SubjectPublicKeyInfo-Wert in der Certificate-Nutzlast MUSS die DER-Kodierung [X.690] der SubjectPublicKeyInfo enthalten. Die Struktur, wie in Abbildung 2 gezeigt, enthält daher auch Längeninformationen. Ein Beispiel wird in Appendix A bereitgestellt.

      SubjectPublicKeyInfo  ::=  SEQUENCE  {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }

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

Figure 2: SubjectPublicKeyInfo ASN.1 Structure (Abbildung 2: SubjectPublicKeyInfo ASN.1-Struktur)

Die Algorithmus-Identifikatoren sind Objekt-Identifikatoren (OIDs). RFC 3279 [RFC3279] und RFC 5480 [RFC5480] definieren beispielsweise die in Abbildung 3 gezeigten OIDs. Beachten Sie, dass diese Liste nicht vollständig ist und weitere OIDs in zukünftigen RFCs definiert werden können.

   Key Type            | Document                   | OID
--------------------+----------------------------+-------------------
RSA | Section 2.3.1 of RFC 3279 | 1.2.840.113549.1.1
....................|............................|...................
Digital Signature | |
Algorithm (DSA) | Section 2.3.2 of RFC 3279 | 1.2.840.10040.4.1
....................|............................|...................
Elliptic Curve | |
Digital Signature | |
Algorithm (ECDSA) | Section 2 of RFC 5480 | 1.2.840.10045.2.1
--------------------+----------------------------+-------------------

Figure 3: Example Algorithm Object Identifiers (Abbildung 3: Beispielhafte Algorithmus-Objekt-Identifikatoren)

Das Erweiterungsformat für erweiterte Client- und Server-Hellos, das das Feld "extension_data" verwendet, wird verwendet, um die Strukturen ClientCertTypeExtension und ServerCertTypeExtension zu transportieren. Diese beiden Strukturen sind in Abbildung 4 dargestellt. Die CertificateType-Struktur ist eine Aufzählung mit Werten, die aus dem Unterregister "TLS Certificate Types" (TLS-Zertifikatstypen) des Registers "Transport Layer Security (TLS) Extensions" (TLS-Erweiterungen) [TLS-Ext-Registry] entnommen sind.

   struct {
select(ClientOrServerExtension) {
case client:
CertificateType client_certificate_types<1..2^8-1>;
case server:
CertificateType client_certificate_type;
}
} ClientCertTypeExtension;

struct {
select(ClientOrServerExtension) {
case client:
CertificateType server_certificate_types<1..2^8-1>;
case server:
CertificateType server_certificate_type;
}
} ServerCertTypeExtension;

Figure 4: CertTypeExtension Structure (Abbildung 4: CertTypeExtension-Struktur)