module ietf-tls-server { yang-version 1.1; namespace "urn:ietf:params:xml:ns:yang:ietf-tls-server"; prefix tlss; import ietf-netconf-acm { prefix nacm; reference "RFC 8341: Network Configuration Access Control Model"; } import ietf-crypto-types { prefix ct; reference "RFC AAAA: YANG Data Types and Groupings for Cryptography"; } import ietf-truststore { prefix ts; reference "RFC BBBB: A YANG Data Model for a Truststore"; } import ietf-keystore { prefix ks; reference "RFC CCCC: A YANG Data Model for a Keystore"; } import ietf-tls-common { prefix tlscmn; reference "RFC FFFF: YANG Groupings for TLS Clients and TLS Servers"; } organization "IETF NETCONF (Network Configuration) Working Group"; contact "WG List: NETCONF WG list WG Web: https://datatracker.ietf.org/wg/netconf Author: Kent Watsen Author: Jeff Hartley "; description "This module defines reusable groupings for TLS servers that can be used as a basis for specific TLS server instances. Copyright (c) 2023 IETF Trust and the persons identified as authors of the code. All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted pursuant to, and subject to the license terms contained in, the Revised BSD License set forth in Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info). This version of this YANG module is part of RFC FFFF (https://www.rfc-editor.org/info/rfcFFFF); see the RFC itself for full legal notices. The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document are to be interpreted as described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, they appear in all capitals, as shown here."; revision 2023-04-17 { description "Initial version"; reference "RFC FFFF: YANG Groupings for TLS Clients and TLS Servers"; } // Features feature tls-server-keepalives { description "Per socket TLS keepalive parameters are configurable for TLS servers on the server implementing this feature."; } feature server-ident-x509-cert { description "Indicates that the server supports identifying itself using X.509 certificates."; reference "RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile"; } feature server-ident-raw-public-key { description "Indicates that the server supports identifying itself using raw public keys."; reference "RFC 7250: Using Raw Public Keys in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)"; } feature server-ident-tls12-psk { description "Indicates that the server supports identifying itself using TLS-1.2 PSKs (pre-shared or pairwise-symmetric keys)."; reference "RFC 4279: Pre-Shared Key Ciphersuites for Transport Layer Security (TLS)"; } feature server-ident-tls13-epsk { description "Indicates that the server supports identifying itself using TLS-1.3 External PSKs (pre-shared keys)."; reference "RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3"; } feature client-auth-supported { description "Indicates that the configuration for how to authenticate clients can be configured herein. TLS-level client authentication may not be needed when client authentication is expected to occur only at another protocol layer."; } feature client-auth-x509-cert { description "Indicates that the server supports authenticating clients using X.509 certificates."; reference "RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile"; } feature client-auth-raw-public-key { description "Indicates that the server supports authenticating clients using raw public keys."; reference "RFC 7250: Using Raw Public Keys in Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)"; } feature client-auth-tls12-psk { description "Indicates that the server supports authenticating clients using PSKs (pre-shared or pairwise-symmetric keys)."; reference "RFC 4279: Pre-Shared Key Ciphersuites for Transport Layer Security (TLS)"; } feature client-auth-tls13-epsk { description "Indicates that the server supports authenticating clients using TLS-1.3 External PSKs (pre-shared keys)."; reference "RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3"; } // Groupings grouping tls-server-grouping { description "A reusable grouping for configuring a TLS server without any consideration for how underlying TCP sessions are established. Note that this grouping uses fairly typical descendant node names such that a stack of 'uses' statements will have name conflicts. It is intended that the consuming data model will resolve the issue (e.g., by wrapping the 'uses' statement in a container called 'tls-server-parameters'). This model purposely does not do this itself so as to provide maximum flexibility to consuming models."; container server-identity { nacm:default-deny-write; description "A locally-defined or referenced end-entity certificate, including any configured intermediate certificates, the TLS server will present when establishing a TLS connection in its Certificate message, as defined in Section 7.4.2 in RFC 5246 and Section 4.4.2 in RFC 8446."; reference "RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3 RFC CCCC: A YANG Data Model for a Keystore"; choice auth-type { mandatory true; description "A choice amongst authentication types, of which one must be enabled (via its associated 'feature') and selected."; case certificate { if-feature "server-ident-x509-cert"; container certificate { description "Specifies the server identity using a certificate."; uses "ks:inline-or-keystore-end-entity-cert-with-key-" + "grouping" { refine "inline-or-keystore/inline/inline-definition" { must 'derived-from-or-self(public-key-format,' + ' "ct:subject-public-key-info-format")'; } refine "inline-or-keystore/keystore/keystore-reference" + "/asymmetric-key" { must 'derived-from-or-self(deref(.)/../ks:public-' + 'key-format, "ct:subject-public-key-info-' + 'format")'; } } } } case raw-private-key { if-feature "server-ident-raw-public-key"; container raw-private-key { description "Specifies the server identity using a raw private key."; uses ks:inline-or-keystore-asymmetric-key-grouping { refine "inline-or-keystore/inline/inline-definition" { must 'derived-from-or-self(public-key-format,' + ' "ct:subject-public-key-info-format")'; } refine "inline-or-keystore/keystore/keystore-reference" { must 'derived-from-or-self(deref(.)/../ks:public-' + 'key-format, "ct:subject-public-key-info-' + 'format")'; } } } } case tls12-psk { if-feature "server-ident-tls12-psk"; container tls12-psk { description "Specifies the server identity using a PSK (pre-shared or pairwise-symmetric key)."; uses ks:inline-or-keystore-symmetric-key-grouping; leaf id_hint { type string; description "The key 'psk_identity_hint' value used in the TLS 'ServerKeyExchange' message."; reference "RFC 4279: Pre-Shared Key Ciphersuites for Transport Layer Security (TLS)"; } } } case tls13-epsk { if-feature "server-ident-tls13-epsk"; container tls13-epsk { description "An External Pre-Shared Key (EPSK) is established or provisioned out-of-band, i.e., not from a TLS connection. An EPSK is a tuple of (Base Key, External Identity, Hash). External PSKs MUST NOT be imported for (D)TLS 1.2 or prior versions. When PSKs are provisioned out of band, the PSK identity and the KDF hash algorithm to be used with the PSK MUST also be provisioned. The structure of this container is designed to satisfy the requirements of RFC 8446 Section 4.2.11, the recommendations from I-D ietf-tls-external-psk-guidance Section 6, and the EPSK input fields detailed in I-D draft-ietf-tls-external-psk-importer Section 3.1. The base-key is based upon ks:inline-or-keystore-symmetric-key-grouping in order to provide users with flexible and secure storage options."; reference "RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3 I-D.ietf-tls-external-psk-importer: Importing External PSKs for TLS I-D.ietf-tls-external-psk-guidance: Guidance for External PSK Usage in TLS"; uses ks:inline-or-keystore-symmetric-key-grouping; leaf external-identity { type string; mandatory true; description "As per Section 4.2.11 of RFC 8446, and Section 4.1 of I-D. ietf-tls-external-psk-guidance: A sequence of bytes used to identify an EPSK. A label for a pre-shared key established externally."; reference "RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3 I-D.ietf-tls-external-psk-guidance: Guidance for External PSK Usage in TLS"; } leaf hash { type tlscmn:epsk-supported-hash; mandatory true; description "As per Section 4.2.11 of RFC 8446, for externally established PSKs, the Hash algorithm MUST be set when the PSK is established or default to SHA-256 if no such algorithm is defined. The server MUST ensure that it selects a compatible PSK (if any) and cipher suite. Each PSK MUST only be used with a single hash function."; reference "RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3"; } leaf context { type string; description "As per Section 4.1 of I-D. ietf-tls-external-psk-guidance: Context may include information about peer roles or identities to mitigate Selfie-style reflection attacks [Selfie]. If the EPSK is a key derived from some other protocol or sequence of protocols, context MUST include a channel binding for the deriving protocols [RFC5056]. The details of this binding are protocol specific."; reference "I-D.ietf-tls-external-psk-importer: Importing External PSKs for TLS I-D.ietf-tls-external-psk-guidance: Guidance for External PSK Usage in TLS"; } leaf target-protocol { type uint16; description "As per Section 3.1 of I-D. ietf-tls-external-psk-guidance: The protocol for which a PSK is imported for use."; reference "I-D.ietf-tls-external-psk-importer: Importing External PSKs for TLS"; } leaf target-kdf { type uint16; description "As per Section 3.1 of I-D. ietf-tls-external-psk-guidance: The specific Key Derivation Function (KDF) for which a PSK is imported for use."; reference "I-D.ietf-tls-external-psk-importer: Importing External PSKs for TLS"; } } } } } // container server-identity container client-authentication { if-feature "client-auth-supported"; nacm:default-deny-write; must 'ca-certs or ee-certs or raw-public-keys or tls12-psks or tls13-epsks'; presence "Indicates that client authentication is supported (i.e., that the server will request clients send certificates). If not configured, the TLS server SHOULD NOT request the TLS clients provide authentication credentials."; description "Specifies how the TLS server can authenticate TLS clients. Any combination of credentials is additive and unordered. Note that no configuration is required for PSK (pre-shared or pairwise-symmetric key) based authentication as the key is necessarily the same as configured in the '../server- identity' node."; container ca-certs { if-feature "client-auth-x509-cert"; presence "Indicates that CA certificates have been configured. This statement is present so the mandatory descendant nodes do not imply that this node must be configured."; description "A set of certificate authority (CA) certificates used by the TLS server to authenticate TLS client certificates. A client certificate is authenticated if it has a valid chain of trust to a configured CA certificate."; reference "RFC BBBB: A YANG Data Model for a Truststore"; uses ts:inline-or-truststore-certs-grouping; } container ee-certs { if-feature "client-auth-x509-cert"; presence "Indicates that EE certificates have been configured. This statement is present so the mandatory descendant nodes do not imply that this node must be configured."; description "A set of client certificates (i.e., end entity certificates) used by the TLS server to authenticate certificates presented by TLS clients. A client certificate is authenticated if it is an exact match to a configured client certificate."; reference "RFC BBBB: A YANG Data Model for a Truststore"; uses ts:inline-or-truststore-certs-grouping; } container raw-public-keys { if-feature "client-auth-raw-public-key"; presence "Indicates that raw public keys have been configured. This statement is present so the mandatory descendant nodes do not imply that this node must be configured."; description "A set of raw public keys used by the TLS server to authenticate raw public keys presented by the TLS client. A raw public key is authenticated if it is an exact match to a configured raw public key."; reference "RFC BBBB: A YANG Data Model for a Truststore"; uses ts:inline-or-truststore-public-keys-grouping { refine "inline-or-truststore/inline/inline-definition/" + "public-key" { must 'derived-from-or-self(public-key-format,' + ' "ct:subject-public-key-info-format")'; } refine "inline-or-truststore/truststore/truststore-" + "reference" { must 'not(deref(.)/../ts:public-key/ts:public-key-' + 'format[not(derived-from-or-self(., "ct:subject-' + 'public-key-info-format"))])'; } } } leaf tls12-psks { if-feature "client-auth-tls12-psk"; type empty; description "Indicates that the TLS server can authenticate TLS clients using configured PSKs (pre-shared or pairwise-symmetric keys). No configuration is required since the PSK value is the same as PSK value configured in the 'server-identity' node."; } leaf tls13-epsks { if-feature "client-auth-tls13-epsk"; type empty; description "Indicates that the TLS 1.3 server can authenticate TLS clients using configured external PSKs (pre-shared keys). No configuration is required since the PSK value is the same as PSK value configured in the 'server-identity' node."; } } // container client-authentication container hello-params { nacm:default-deny-write; if-feature "tlscmn:hello-params"; uses tlscmn:hello-params-grouping; description "Configurable parameters for the TLS hello message."; } // container hello-params container keepalives { nacm:default-deny-write; if-feature "tls-server-keepalives"; description "Configures the keepalive policy for the TLS server."; leaf peer-allowed-to-send { type empty; description "Indicates that the remote TLS client is allowed to send HeartbeatRequest messages, as defined by RFC 6520 to this TLS server."; reference "RFC 6520: Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension"; } container test-peer-aliveness { presence "Indicates that the TLS server proactively tests the aliveness of the remote TLS client."; description "Configures the keep-alive policy to proactively test the aliveness of the TLS client. An unresponsive TLS client is dropped after approximately max-wait * max-attempts seconds."; leaf max-wait { type uint16 { range "1..max"; } units "seconds"; default "30"; description "Sets the amount of time in seconds after which if no data has been received from the TLS client, a TLS-level message will be sent to test the aliveness of the TLS client."; } leaf max-attempts { type uint8; default "3"; description "Sets the maximum number of sequential keep-alive messages that can fail to obtain a response from the TLS client before assuming the TLS client is no longer alive."; } } } // container keepalives } // grouping tls-server-grouping }