draft-ietf-netconf-netconf-client-server-08.txt | draft-ietf-netconf-netconf-client-server-09.txt | |||
---|---|---|---|---|
NETCONF Working Group K. Watsen | NETCONF Working Group K. Watsen | |||
Internet-Draft Juniper Networks | Internet-Draft Watsen Networks | |||
Intended status: Standards Track October 22, 2018 | Intended status: Standards Track March 9, 2019 | |||
Expires: April 25, 2019 | Expires: September 10, 2019 | |||
NETCONF Client and Server Models | NETCONF Client and Server Models | |||
draft-ietf-netconf-netconf-client-server-08 | draft-ietf-netconf-netconf-client-server-09 | |||
Abstract | Abstract | |||
This document defines two YANG modules, one module to configure a | This document defines two YANG modules, one module to configure a | |||
NETCONF client and the other module to configure a NETCONF server. | NETCONF client and the other module to configure a NETCONF server. | |||
Both modules support both the SSH and TLS transport protocols, and | Both modules support both the SSH and TLS transport protocols, and | |||
support both standard NETCONF and NETCONF Call Home connections. | support both standard NETCONF and NETCONF Call Home connections. | |||
Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
skipping to change at page 1, line 47 ¶ | skipping to change at page 1, line 47 ¶ | |||
progress. Please apply the following replacements: | progress. Please apply the following replacements: | |||
o "XXXX" --> the assigned RFC value for this draft | o "XXXX" --> the assigned RFC value for this draft | |||
o "YYYY" --> the assigned RFC value for I-D.ietf-netconf-ssh-client- | o "YYYY" --> the assigned RFC value for I-D.ietf-netconf-ssh-client- | |||
server | server | |||
o "ZZZZ" --> the assigned RFC value for I-D.ietf-netconf-tls-client- | o "ZZZZ" --> the assigned RFC value for I-D.ietf-netconf-tls-client- | |||
server | server | |||
o "AAAA" --> the assigned RFC value for I-D.ietf-netconf-tcp-client- | ||||
server | ||||
Artwork in this document contains placeholder values for the date of | Artwork in this document contains placeholder values for the date of | |||
publication of this draft. Please apply the following replacement: | publication of this draft. Please apply the following replacement: | |||
o "2018-10-22" --> the publication date of this draft | o "2019-03-09" --> the publication date of this draft | |||
The following Appendix section is to be removed prior to publication: | The following Appendix section is to be removed prior to publication: | |||
o Appendix A. Change Log | o Appendix A. Change Log | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on April 25, 2019. | This Internet-Draft will expire on September 10, 2019. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. The NETCONF Client Model . . . . . . . . . . . . . . . . . . 4 | 3. The NETCONF Client Model . . . . . . . . . . . . . . . . . . 4 | |||
3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 4 | 3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 12 | 3.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 14 | 3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
4. The NETCONF Server Model . . . . . . . . . . . . . . . . . . 24 | 4. The NETCONF Server Model . . . . . . . . . . . . . . . . . . 25 | |||
4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 25 | 4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 25 | |||
4.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 32 | 4.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 34 | |||
4.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 37 | 4.3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
5. Design Considerations . . . . . . . . . . . . . . . . . . . . 49 | 5. Design Considerations . . . . . . . . . . . . . . . . . . . . 50 | |||
5.1. Support all NETCONF transports . . . . . . . . . . . . . 49 | 5.1. Support all NETCONF transports . . . . . . . . . . . . . 50 | |||
5.2. Enable each transport to select which keys to use . . . . 49 | 5.2. Enable each transport to select which keys to use . . . . 50 | |||
5.3. Support authenticating NETCONF clients certificates . . . 49 | 5.3. Support authenticating NETCONF clients certificates . . . 50 | |||
5.4. Support mapping authenticated NETCONF client certificates | 5.4. Support mapping authenticated NETCONF client certificates | |||
to usernames . . . . . . . . . . . . . . . . . . . . . . 50 | to usernames . . . . . . . . . . . . . . . . . . . . . . 51 | |||
5.5. Support both listening for connections and call home . . 50 | 5.5. Support both listening for connections and call home . . 51 | |||
5.6. For Call Home connections . . . . . . . . . . . . . . . . 50 | 5.6. For Call Home connections . . . . . . . . . . . . . . . . 51 | |||
5.6.1. Support more than one NETCONF client . . . . . . . . 50 | 5.6.1. Support more than one NETCONF client . . . . . . . . 51 | |||
5.6.2. Support NETCONF clients having more than one endpoint 50 | 5.6.2. Support NETCONF clients having more than one endpoint 51 | |||
5.6.3. Support a reconnection strategy . . . . . . . . . . . 50 | 5.6.3. Support a reconnection strategy . . . . . . . . . . . 51 | |||
5.6.4. Support both persistent and periodic connections . . 51 | 5.6.4. Support both persistent and periodic connections . . 52 | |||
5.6.5. Reconnection strategy for periodic connections . . . 51 | 5.6.5. Reconnection strategy for periodic connections . . . 52 | |||
5.6.6. Keep-alives for persistent connections . . . . . . . 51 | 5.6.6. Keep-alives for persistent connections . . . . . . . 52 | |||
5.6.7. Customizations for periodic connections . . . . . . . 51 | 5.6.7. Customizations for periodic connections . . . . . . . 52 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 51 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 52 | |||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 52 | 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 53 | |||
7.1. The IETF XML Registry . . . . . . . . . . . . . . . . . . 52 | 7.1. The IETF XML Registry . . . . . . . . . . . . . . . . . . 53 | |||
7.2. The YANG Module Names Registry . . . . . . . . . . . . . 53 | 7.2. The YANG Module Names Registry . . . . . . . . . . . . . 54 | |||
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 53 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
8.1. Normative References . . . . . . . . . . . . . . . . . . 53 | 8.1. Normative References . . . . . . . . . . . . . . . . . . 54 | |||
8.2. Informative References . . . . . . . . . . . . . . . . . 54 | 8.2. Informative References . . . . . . . . . . . . . . . . . 55 | |||
Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 56 | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 56 | A.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 56 | A.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 56 | A.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 56 | A.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 56 | A.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
A.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 57 | A.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
A.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 57 | A.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
A.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 57 | A.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 57 | Appendix B. 08 to 09 . . . . . . . . . . . . . . . . . . . . . . 58 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 57 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 59 | ||||
1. Introduction | 1. Introduction | |||
This document defines two YANG [RFC7950] modules, one module to | This document defines two YANG [RFC7950] modules, one module to | |||
configure a NETCONF [RFC6241] client and the other module to | configure a NETCONF [RFC6241] client and the other module to | |||
configure a NETCONF server. Both modules support both NETCONF over | configure a NETCONF server. Both modules support both NETCONF over | |||
SSH [RFC6242] and NETCONF over TLS [RFC7589] and NETCONF Call Home | SSH [RFC6242] and NETCONF over TLS [RFC7589] and NETCONF Call Home | |||
connections [RFC8071]. | connections [RFC8071]. | |||
2. Terminology | 2. Terminology | |||
skipping to change at page 4, line 37 ¶ | skipping to change at page 4, line 45 ¶ | |||
YANG feature statements are used to enable implementations to | YANG feature statements are used to enable implementations to | |||
advertise which parts of the model the NETCONF client supports. | advertise which parts of the model the NETCONF client supports. | |||
3.1. Tree Diagram | 3.1. Tree Diagram | |||
The following tree diagram [RFC8340] provides an overview of the data | The following tree diagram [RFC8340] provides an overview of the data | |||
model for the "ietf-netconf-client" module. Just the container is | model for the "ietf-netconf-client" module. Just the container is | |||
displayed below, but there is also a reusable grouping called | displayed below, but there is also a reusable grouping called | |||
"netconf-client-grouping" that the container is using. | "netconf-client-grouping" that the container is using. | |||
[Note: '\' line wrapping for formatting only] | ========== NOTE: '\\' line wrapping per BCP XX (RFC XXXX) =========== | |||
module: ietf-netconf-client | module: ietf-netconf-client | |||
+--rw netconf-client | +--rw netconf-client | |||
+--rw initiate! {initiate}? | +--rw initiate! {initiate}? | |||
| +--rw netconf-server* [name] | | +--rw netconf-server* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw endpoints | | +--rw endpoints | |||
| | +--rw endpoint* [name] | | | +--rw endpoint* [name] | |||
| | +--rw name string | | | +--rw name string | |||
| | +--rw (transport) | | | +--rw (transport) | |||
| | +--:(ssh) {ssh-initiate}? | | | +--:(ssh) {ssh-initiate}? | |||
| | | +--rw ssh | | | | +--rw ssh | |||
| | | +--rw address? inet:host | | | | +--rw remote-address inet:host | |||
| | | +--rw port? inet:port-number | | | | +--rw remote-port? | |||
| | | +--rw client-identity | | | | | inet:port-number | |||
| | | +--rw local-address? inet:ip-addr\ | ||||
\ess | ||||
| | | +--rw local-port? | ||||
| | | | inet:port-number | ||||
| | | +--rw tcp-keepalives {tcp-client-keepalive\ | ||||
\s}? | ||||
| | | | +--rw idle-time? uint16 | ||||
| | | | +--rw max-probes? uint16 | ||||
| | | | +--rw probe-interval? uint16 | ||||
| | | +--rw ssh-client-identity | ||||
| | | | +--rw username? string | | | | | +--rw username? string | |||
| | | | +--rw (auth-type) | | | | | +--rw (auth-type) | |||
| | | | +--:(password) | | | | | +--:(password) | |||
| | | | | +--rw password? string | | | | | | +--rw password? string | |||
| | | | +--:(public-key) | | | | | +--:(public-key) | |||
| | | | | +--rw public-key | | | | | | +--rw public-key | |||
| | | | | +--rw (local-or-keystore) | | | | | | +--rw (local-or-keystore) | |||
| | | | | +--:(local) | | | | | | +--:(local) | |||
| | | | | | {local-keys-suppor\ | | | | | | | {local-keys-suppor\ | |||
ted}? | \ted}? | |||
| | | | | | +--rw algorithm? | | | | | | | +--rw local-definition | |||
| | | | | | | asymmetric-key-e\ | | | | | | | +--rw algorithm? | |||
ncryption-algorithm-ref | | | | | | | | asymmetric-ke\ | |||
| | | | | | +--rw public-key? | \y-algorithm-ref | |||
| | | | | | | binary | | | | | | | +--rw public-key? | |||
| | | | | | +--rw private-key? | | | | | | | | binary | |||
| | | | | | | union | | | | | | | +--rw private-key? | |||
| | | | | | +---x generate-hidden-key | | | | | | | | union | |||
| | | | | | | +---w input | | | | | | | +---x generate-hidden\ | |||
| | | | | | | +---w algorithm | \-key | |||
| | | | | | | asymmetric\ | | | | | | | | +---w input | |||
-key-encryption-algorithm-ref | | | | | | | | +---w algorithm | |||
| | | | | | +---x install-hidden-key | | | | | | | | asymmet\ | |||
| | | | | | +---w input | \ric-key-algorithm-ref | |||
| | | | | | +---w algorithm | | | | | | | +---x install-hidden-\ | |||
| | | | | | | asymmetric\ | \key | |||
-key-encryption-algorithm-ref | | | | | | | +---w input | |||
| | | | | | +---w public-key? | | | | | | | +---w algorithm | |||
| | | | | | | binary | | | | | | | | asymmet\ | |||
| | | | | | +---w private-key? | \ric-key-algorithm-ref | |||
| | | | | | binary | | | | | | | +---w public-ke\ | |||
\y? | ||||
| | | | | | | binary | ||||
| | | | | | +---w private-k\ | ||||
\ey? | ||||
| | | | | | binary | ||||
| | | | | +--:(keystore) | | | | | | +--:(keystore) | |||
| | | | | {keystore-supporte\ | | | | | | {keystore-supporte\ | |||
d}? | \d}? | |||
| | | | | +--rw reference? | | | | | | +--rw keystore-reference? | |||
| | | | | ks:asymmetric-ke\ | | | | | | ks:asymmetric-ke\ | |||
y-ref | \y-ref | |||
| | | | +--:(certificate) | | | | | +--:(certificate) | |||
| | | | +--rw certificate | | | | | +--rw certificate | |||
| | | | {sshcmn:ssh-x509-certs}? | | | | | {sshcmn:ssh-x509-certs}? | |||
| | | | +--rw (local-or-keystore) | | | | | +--rw (local-or-keystore) | |||
| | | | +--:(local) | | | | | +--:(local) | |||
| | | | | {local-keys-suppor\ | | | | | | {local-keys-suppor\ | |||
ted}? | \ted}? | |||
| | | | | +--rw algorithm? | | | | | | +--rw local-definition | |||
| | | | | | asymmetric-key-e\ | | | | | | +--rw algorithm? | |||
ncryption-algorithm-ref | | | | | | | asymmetric-ke\ | |||
| | | | | +--rw public-key? | \y-algorithm-ref | |||
| | | | | | binary | | | | | | +--rw public-key? | |||
| | | | | +--rw private-key? | | | | | | | binary | |||
| | | | | | union | | | | | | +--rw private-key? | |||
| | | | | +---x generate-hidden-key | | | | | | | union | |||
| | | | | | +---w input | | | | | | +---x generate-hidden\ | |||
| | | | | | +---w algorithm | \-key | |||
| | | | | | asymmetric\ | | | | | | | +---w input | |||
-key-encryption-algorithm-ref | | | | | | | +---w algorithm | |||
| | | | | +---x install-hidden-key | | | | | | | asymmet\ | |||
| | | | | | +---w input | \ric-key-algorithm-ref | |||
| | | | | | +---w algorithm | | | | | | +---x install-hidden-\ | |||
| | | | | | | asymmetric\ | \key | |||
-key-encryption-algorithm-ref | | | | | | | +---w input | |||
| | | | | | +---w public-key? | | | | | | | +---w algorithm | |||
| | | | | | | binary | | | | | | | | asymmet\ | |||
| | | | | | +---w private-key? | \ric-key-algorithm-ref | |||
| | | | | | binary | | | | | | | +---w public-ke\ | |||
| | | | | +--rw cert? | \y? | |||
| | | | | | end-entity-cert-\ | | | | | | | | binary | |||
cms | | | | | | | +---w private-k\ | |||
| | | | | +---n certificate-expira\ | \ey? | |||
tion | | | | | | | binary | |||
| | | | | +-- expiration-date | | | | | | +--rw cert? | |||
| | | | | yang:date-and\ | | | | | | | end-entity-ce\ | |||
-time | \rt-cms | |||
| | | | | +---n certificate-exp\ | ||||
\iration | ||||
| | | | | +-- expiration-date | ||||
| | | | | yang:date-\ | ||||
\and-time | ||||
| | | | +--:(keystore) | | | | | +--:(keystore) | |||
| | | | {keystore-supporte\ | | | | | {keystore-supporte\ | |||
d}? | \d}? | |||
| | | | +--rw reference? | | | | | +--rw keystore-reference? | |||
| | | | ks:asymmetric-ke\ | | | | | ks:asymmetric-ke\ | |||
y-certificate-ref | \y-certificate-ref | |||
| | | +--rw server-auth | | | | +--rw ssh-server-auth | |||
| | | | +--rw pinned-ssh-host-keys? | | | | | +--rw pinned-ssh-host-keys? | |||
| | | | | ta:pinned-host-keys-ref | | | | | | ta:pinned-host-keys-ref | |||
| | | | | {ta:ssh-host-keys}? | | | | | | {ta:ssh-host-keys}? | |||
| | | | +--rw pinned-ca-certs? | | | | | +--rw pinned-ca-certs? | |||
| | | | | ta:pinned-certificates-ref | | | | | | ta:pinned-certificates-ref | |||
| | | | | {sshcmn:ssh-x509-certs,ta:x509-\ | | | | | | {sshcmn:ssh-x509-certs,ta:x509-\ | |||
certificates}? | \certificates}? | |||
| | | | +--rw pinned-server-certs? | | | | | +--rw pinned-server-certs? | |||
| | | | ta:pinned-certificates-ref | | | | | ta:pinned-certificates-ref | |||
| | | | {sshcmn:ssh-x509-certs,ta:x509-\ | | | | | {sshcmn:ssh-x509-certs,ta:x509-\ | |||
certificates}? | \certificates}? | |||
| | | +--rw transport-params | | | | +--rw ssh-transport-params | |||
| | | {ssh-client-transport-params-confi\ | | | | | {ssh-client-transport-params-confi\ | |||
g}? | \g}? | |||
| | | +--rw host-key | | | | | +--rw host-key | |||
| | | | +--rw host-key-alg* identityref | | | | | | +--rw host-key-alg* identityref | |||
| | | +--rw key-exchange | | | | | +--rw key-exchange | |||
| | | | +--rw key-exchange-alg* identityref | | | | | | +--rw key-exchange-alg* identityref | |||
| | | +--rw encryption | | | | | +--rw encryption | |||
| | | | +--rw encryption-alg* identityref | | | | | | +--rw encryption-alg* identityref | |||
| | | +--rw mac | | | | | +--rw mac | |||
| | | +--rw mac-alg* identityref | | | | | +--rw mac-alg* identityref | |||
| | | +--rw ssh-keepalives {ssh-client-keepalive\ | ||||
\s}? | ||||
| | | +--rw max-wait? uint16 | ||||
| | | +--rw max-attempts? uint8 | ||||
| | +--:(tls) {tls-initiate}? | | | +--:(tls) {tls-initiate}? | |||
| | +--rw tls | | | +--rw tls | |||
| | +--rw address? inet:host | | | +--rw remote-address inet:host | |||
| | +--rw port? inet:port-number | | | +--rw remote-port? inet:port-num\ | |||
| | +--rw client-identity | \ber | |||
| | +--rw local-address? inet:ip-addre\ | ||||
\ss | ||||
| | +--rw local-port? inet:port-num\ | ||||
\ber | ||||
| | +--rw tcp-keepalives {tcp-client-keepalive\ | ||||
\s}? | ||||
| | | +--rw idle-time? uint16 | ||||
| | | +--rw max-probes? uint16 | ||||
| | | +--rw probe-interval? uint16 | ||||
| | +--rw tls-client-identity | ||||
| | | +--rw (auth-type) | | | | +--rw (auth-type) | |||
| | | +--:(certificate) | | | | +--:(certificate) | |||
| | | +--rw certificate | | | | +--rw certificate | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) | | | | +--:(local) | |||
| | | | {local-keys-suppor\ | | | | | {local-keys-suppor\ | |||
ted}? | \ted}? | |||
| | | | +--rw algorithm? | | | | | +--rw local-definition | |||
| | | | | asymmetric-key-e\ | | | | | +--rw algorithm? | |||
ncryption-algorithm-ref | | | | | | asymmetric-ke\ | |||
| | | | +--rw public-key? | \y-algorithm-ref | |||
| | | | | binary | | | | | +--rw public-key? | |||
| | | | +--rw private-key? | | | | | | binary | |||
| | | | | union | | | | | +--rw private-key? | |||
| | | | +---x generate-hidden-key | | | | | | union | |||
| | | | | +---w input | | | | | +---x generate-hidden\ | |||
| | | | | +---w algorithm | \-key | |||
| | | | | asymmetric\ | | | | | | +---w input | |||
-key-encryption-algorithm-ref | | | | | | +---w algorithm | |||
| | | | +---x install-hidden-key | | | | | | asymmet\ | |||
| | | | | +---w input | \ric-key-algorithm-ref | |||
| | | | | +---w algorithm | | | | | +---x install-hidden-\ | |||
| | | | | | asymmetric\ | \key | |||
-key-encryption-algorithm-ref | | | | | | +---w input | |||
| | | | | +---w public-key? | | | | | | +---w algorithm | |||
| | | | | | binary | | | | | | | asymmet\ | |||
| | | | | +---w private-key? | \ric-key-algorithm-ref | |||
| | | | | binary | | | | | | +---w public-ke\ | |||
| | | | +--rw cert? | \y? | |||
| | | | | end-entity-cert-\ | | | | | | | binary | |||
cms | | | | | | +---w private-k\ | |||
| | | | +---n certificate-expira\ | \ey? | |||
tion | | | | | | binary | |||
| | | | +-- expiration-date | | | | | +--rw cert? | |||
| | | | yang:date-and\ | | | | | | end-entity-ce\ | |||
-time | \rt-cms | |||
| | | | +---n certificate-exp\ | ||||
\iration | ||||
| | | | +-- expiration-date | ||||
| | | | yang:date-\ | ||||
\and-time | ||||
| | | +--:(keystore) | | | | +--:(keystore) | |||
| | | {keystore-supporte\ | | | | {keystore-supporte\ | |||
d}? | ||||
| | | +--rw reference? | \d}? | |||
| | | +--rw keystore-reference? | ||||
| | | ks:asymmetric-ke\ | | | | ks:asymmetric-ke\ | |||
y-certificate-ref | \y-certificate-ref | |||
| | +--rw server-auth | | | +--rw tls-server-auth | |||
| | | +--rw pinned-ca-certs? | | | | +--rw pinned-ca-certs? | |||
| | | | ta:pinned-certificates-ref | | | | | ta:pinned-certificates-ref | |||
| | | | {ta:x509-certificates}? | | | | | {ta:x509-certificates}? | |||
| | | +--rw pinned-server-certs? | | | | +--rw pinned-server-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw hello-params | | | +--rw tls-hello-params | |||
| | {tls-client-hello-params-config}? | | | | {tls-client-hello-params-config}? | |||
| | +--rw tls-versions | | | | +--rw tls-versions | |||
| | | +--rw tls-version* identityref | | | | | +--rw tls-version* identityref | |||
| | +--rw cipher-suites | | | | +--rw cipher-suites | |||
| | +--rw cipher-suite* identityref | | | | +--rw cipher-suite* identityref | |||
| | +--rw tls-keepalives {tls-client-keepalive\ | ||||
\s}? | ||||
| | +--rw max-wait? uint16 | ||||
| | +--rw max-attempts? uint8 | ||||
| +--rw connection-type | | +--rw connection-type | |||
| | +--rw (connection-type) | | | +--rw (connection-type) | |||
| | +--:(persistent-connection) | | | +--:(persistent-connection) | |||
| | | +--rw persistent! | | | | +--rw persistent! | |||
| | | +--rw keep-alives | ||||
| | | +--rw max-wait? uint16 | ||||
| | | +--rw max-attempts? uint8 | ||||
| | +--:(periodic-connection) | | | +--:(periodic-connection) | |||
| | +--rw periodic! | | | +--rw periodic! | |||
| | +--rw period? uint16 | | | +--rw period? uint16 | |||
| | +--rw anchor-time? yang:date-and-time | | | +--rw anchor-time? yang:date-and-time | |||
| | +--rw idle-timeout? uint16 | | | +--rw idle-timeout? uint16 | |||
| +--rw reconnect-strategy | | +--rw reconnect-strategy | |||
| +--rw start-with? enumeration | | +--rw start-with? enumeration | |||
| +--rw max-attempts? uint8 | | +--rw max-attempts? uint8 | |||
+--rw listen! {listen}? | +--rw listen! {listen}? | |||
+--rw idle-timeout? uint16 | +--rw idle-timeout? uint16 | |||
+--rw endpoint* [name] | +--rw endpoint* [name] | |||
+--rw name string | +--rw name string | |||
+--rw (transport) | +--rw (transport) | |||
+--:(ssh) {ssh-listen}? | +--:(ssh) {ssh-listen}? | |||
| +--rw ssh | | +--rw ssh | |||
| +--rw address? inet:ip-address | | +--rw local-address inet:ip-address | |||
| +--rw port? inet:port-number | | +--rw local-port? inet:port-number | |||
| +--rw client-identity | | +--rw tcp-keepalives {tcp-server-keepalives}? | |||
| | +--rw idle-time? uint16 | ||||
| | +--rw max-probes? uint16 | ||||
| | +--rw probe-interval? uint16 | ||||
| +--rw ssh-client-identity | ||||
| | +--rw username? string | | | +--rw username? string | |||
| | +--rw (auth-type) | | | +--rw (auth-type) | |||
| | +--:(password) | | | +--:(password) | |||
| | | +--rw password? string | | | | +--rw password? string | |||
| | +--:(public-key) | | | +--:(public-key) | |||
| | | +--rw public-key | | | | +--rw public-key | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) {local-keys-supported\ | | | | +--:(local) {local-keys-supported\ | |||
}? | \}? | |||
| | | | +--rw algorithm? | | | | | +--rw local-definition | |||
| | | | | asymmetric-key-encrypt\ | | | | | +--rw algorithm? | |||
ion-algorithm-ref | | | | | | asymmetric-key-algo\ | |||
| | | | +--rw public-key? | \rithm-ref | |||
| | | | | binary | | | | | +--rw public-key? | |||
| | | | +--rw private-key? | | | | | | binary | |||
| | | | | union | | | | | +--rw private-key? | |||
| | | | +---x generate-hidden-key | | | | | | union | |||
| | | | | +---w input | | | | | +---x generate-hidden-key | |||
| | | | | +---w algorithm | | | | | | +---w input | |||
| | | | | asymmetric-key-e\ | | | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | | | asymmetric-ke\ | |||
| | | | +---x install-hidden-key | \y-algorithm-ref | |||
| | | | +---w input | | | | | +---x install-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | | asymmetric-key-e\ | | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | | | asymmetric-ke\ | |||
| | | | +---w public-key? bin\ | \y-algorithm-ref | |||
ary | | | | | +---w public-key? | |||
| | | | +---w private-key? bin\ | | | | | | binary | |||
ary | | | | | +---w private-key? | |||
| | | | binary | ||||
| | | +--:(keystore) {keystore-supporte\ | | | | +--:(keystore) {keystore-supporte\ | |||
d}? | \d}? | |||
| | | +--rw reference? | | | | +--rw keystore-reference? | |||
| | | ks:asymmetric-key-ref | | | | ks:asymmetric-key-ref | |||
| | +--:(certificate) | | | +--:(certificate) | |||
| | +--rw certificate {sshcmn:ssh-x509-cert\ | | | +--rw certificate {sshcmn:ssh-x509-cert\ | |||
s}? | \s}? | |||
| | +--rw (local-or-keystore) | | | +--rw (local-or-keystore) | |||
| | +--:(local) {local-keys-supported\ | | | +--:(local) {local-keys-supported\ | |||
}? | \}? | |||
| | | +--rw algorithm? | | | | +--rw local-definition | |||
| | | | asymmetric-key-encrypt\ | | | | +--rw algorithm? | |||
ion-algorithm-ref | | | | | asymmetric-key-algo\ | |||
| | | +--rw public-key? | \rithm-ref | |||
| | | | binary | | | | +--rw public-key? | |||
| | | +--rw private-key? | | | | | binary | |||
| | | | union | | | | +--rw private-key? | |||
| | | +---x generate-hidden-key | | | | | union | |||
| | | | +---w input | | | | +---x generate-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | asymmetric-key-e\ | | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | | asymmetric-ke\ | |||
| | | +---x install-hidden-key | \y-algorithm-ref | |||
| | | | +---w input | | | | +---x install-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | | asymmetric-key-e\ | | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | | | asymmetric-ke\ | |||
| | | | +---w public-key? bin\ | \y-algorithm-ref | |||
ary | | | | | +---w public-key? | |||
| | | | +---w private-key? bin\ | | | | | | binary | |||
ary | | | | | +---w private-key? | |||
| | | +--rw cert? | | | | | binary | |||
| | | | end-entity-cert-cms | | | | +--rw cert? | |||
| | | +---n certificate-expiration | | | | | end-entity-cert-cms | |||
| | | +-- expiration-date | | | | +---n certificate-expiration | |||
| | | yang:date-and-time | | | | +-- expiration-date | |||
| | | yang:date-and-ti\ | ||||
\me | ||||
| | +--:(keystore) {keystore-supporte\ | | | +--:(keystore) {keystore-supporte\ | |||
d}? | \d}? | |||
| | +--rw reference? | | | +--rw keystore-reference? | |||
| | ks:asymmetric-key-cert\ | | | ks:asymmetric-key-cert\ | |||
ificate-ref | \ificate-ref | |||
| +--rw server-auth | | +--rw ssh-server-auth | |||
| | +--rw pinned-ssh-host-keys? | | | +--rw pinned-ssh-host-keys? | |||
| | | ta:pinned-host-keys-ref | | | | ta:pinned-host-keys-ref | |||
| | | {ta:ssh-host-keys}? | | | | {ta:ssh-host-keys}? | |||
| | +--rw pinned-ca-certs? | | | +--rw pinned-ca-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {sshcmn:ssh-x509-certs,ta:x509-certif\ | | | | {sshcmn:ssh-x509-certs,ta:x509-certif\ | |||
icates}? | \icates}? | |||
| | +--rw pinned-server-certs? | | | +--rw pinned-server-certs? | |||
| | ta:pinned-certificates-ref | | | ta:pinned-certificates-ref | |||
| | {sshcmn:ssh-x509-certs,ta:x509-certif\ | | | {sshcmn:ssh-x509-certs,ta:x509-certif\ | |||
icates}? | \icates}? | |||
| +--rw transport-params | | +--rw ssh-transport-params | |||
| {ssh-client-transport-params-config}? | | | {ssh-client-transport-params-config}? | |||
| +--rw host-key | | | +--rw host-key | |||
| | +--rw host-key-alg* identityref | | | | +--rw host-key-alg* identityref | |||
| +--rw key-exchange | | | +--rw key-exchange | |||
| | +--rw key-exchange-alg* identityref | | | | +--rw key-exchange-alg* identityref | |||
| +--rw encryption | | | +--rw encryption | |||
| | +--rw encryption-alg* identityref | | | | +--rw encryption-alg* identityref | |||
| +--rw mac | | | +--rw mac | |||
| +--rw mac-alg* identityref | | | +--rw mac-alg* identityref | |||
| +--rw ssh-keepalives {ssh-client-keepalives}? | ||||
| +--rw max-wait? uint16 | ||||
| +--rw max-attempts? uint8 | ||||
+--:(tls) {tls-listen}? | +--:(tls) {tls-listen}? | |||
+--rw tls | +--rw tls | |||
+--rw address? inet:ip-address | +--rw local-address inet:ip-address | |||
+--rw port? inet:port-number | +--rw local-port? inet:port-number | |||
+--rw client-identity | +--rw tcp-keepalives {tcp-server-keepalives}? | |||
| +--rw idle-time? uint16 | ||||
| +--rw max-probes? uint16 | ||||
| +--rw probe-interval? uint16 | ||||
+--rw tls-client-identity | ||||
| +--rw (auth-type) | | +--rw (auth-type) | |||
| +--:(certificate) | | +--:(certificate) | |||
| +--rw certificate | | +--rw certificate | |||
| +--rw (local-or-keystore) | | +--rw (local-or-keystore) | |||
| +--:(local) {local-keys-supported\ | | +--:(local) {local-keys-supported\ | |||
}? | \}? | |||
| | +--rw algorithm? | | | +--rw local-definition | |||
| | | asymmetric-key-encrypt\ | | | +--rw algorithm? | |||
ion-algorithm-ref | | | | asymmetric-key-algo\ | |||
| | +--rw public-key? | \rithm-ref | |||
| | | binary | | | +--rw public-key? | |||
| | +--rw private-key? | | | | binary | |||
| | | union | | | +--rw private-key? | |||
| | +---x generate-hidden-key | | | | union | |||
| | | +---w input | | | +---x generate-hidden-key | |||
| | | +---w algorithm | | | | +---w input | |||
| | | asymmetric-key-e\ | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | asymmetric-ke\ | |||
| | +---x install-hidden-key | \y-algorithm-ref | |||
| | | +---w input | | | +---x install-hidden-key | |||
| | | +---w algorithm | | | | +---w input | |||
| | | | asymmetric-key-e\ | | | | +---w algorithm | |||
ncryption-algorithm-ref | | | | | asymmetric-ke\ | |||
| | | +---w public-key? bin\ | \y-algorithm-ref | |||
ary | | | | +---w public-key? | |||
| | | +---w private-key? bin\ | | | | | binary | |||
ary | | | | +---w private-key? | |||
| | +--rw cert? | | | | binary | |||
| | | end-entity-cert-cms | | | +--rw cert? | |||
| | +---n certificate-expiration | | | | end-entity-cert-cms | |||
| | +-- expiration-date | | | +---n certificate-expiration | |||
| | yang:date-and-time | | | +-- expiration-date | |||
| | yang:date-and-ti\ | ||||
\me | ||||
| +--:(keystore) {keystore-supporte\ | | +--:(keystore) {keystore-supporte\ | |||
d}? | \d}? | |||
| +--rw reference? | | +--rw keystore-reference? | |||
| ks:asymmetric-key-cert\ | | ks:asymmetric-key-cert\ | |||
ificate-ref | \ificate-ref | |||
+--rw server-auth | +--rw tls-server-auth | |||
| +--rw pinned-ca-certs? | | +--rw pinned-ca-certs? | |||
| | ta:pinned-certificates-ref | | | ta:pinned-certificates-ref | |||
| | {ta:x509-certificates}? | | | {ta:x509-certificates}? | |||
| +--rw pinned-server-certs? | | +--rw pinned-server-certs? | |||
| ta:pinned-certificates-ref | | ta:pinned-certificates-ref | |||
| {ta:x509-certificates}? | | {ta:x509-certificates}? | |||
+--rw hello-params | +--rw tls-hello-params | |||
{tls-client-hello-params-config}? | | {tls-client-hello-params-config}? | |||
+--rw tls-versions | | +--rw tls-versions | |||
| +--rw tls-version* identityref | | | +--rw tls-version* identityref | |||
+--rw cipher-suites | | +--rw cipher-suites | |||
+--rw cipher-suite* identityref | | +--rw cipher-suite* identityref | |||
+--rw tls-keepalives {tls-client-keepalives}? | ||||
+--rw max-wait? uint16 | ||||
+--rw max-attempts? uint8 | ||||
3.2. Example Usage | 3.2. Example Usage | |||
The following example illustrates configuring a NETCONF client to | The following example illustrates configuring a NETCONF client to | |||
initiate connections, using both the SSH and TLS transport protocols, | initiate connections, using both the SSH and TLS transport protocols, | |||
as well as listening for call-home connections, again using both the | as well as listening for call-home connections, again using both the | |||
SSH and TLS transport protocols. | SSH and TLS transport protocols. | |||
This example is consistent with the examples presented in Section 3.2 | This example is consistent with the examples presented in Section 3.2 | |||
of [I-D.ietf-netconf-keystore]. | of [I-D.ietf-netconf-keystore]. | |||
[Note: '\' line wrapping for formatting only] | ========== NOTE: '\\' line wrapping per BCP XX (RFC XXXX) =========== | |||
<netconf-client | <netconf-client | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-client"> | xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-client"> | |||
<!-- NETCONF servers to initiate connections to --> | <!-- NETCONF servers to initiate connections to --> | |||
<initiate> | <initiate> | |||
<netconf-server> | <netconf-server> | |||
<name>corp-fw1</name> | <name>corp-fw1</name> | |||
<endpoints> | <endpoints> | |||
<endpoint> | <endpoint> | |||
<name>corp-fw1.example.com</name> | <name>corp-fw1.example.com</name> | |||
<ssh> | <ssh> | |||
<address>corp-fw1.example.com</address> | <remote-address>corp-fw1.example.com</remote-address> | |||
<client-identity> | <tcp-keepalives> | |||
<idle-time>15</idle-time> | ||||
<max-probes>3</max-probes> | ||||
<probe-interval>30</probe-interval> | ||||
</tcp-keepalives> | ||||
<ssh-client-identity> | ||||
<username>foobar</username> | <username>foobar</username> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:iet\ | <local-definition> | |||
f-crypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | |||
<private-key>base64encodedvalue==</private-key> | \etf-crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</client-identity> | </ssh-client-identity> | |||
<server-auth> | <ssh-server-auth> | |||
<pinned-ca-certs>explicitly-trusted-server-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-server-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-server-certs>explicitly-trusted-server-certs</\ | <pinned-server-certs>explicitly-trusted-server-certs</\ | |||
pinned-server-certs> | \pinned-server-certs> | |||
</server-auth> | </ssh-server-auth> | |||
<ssh-keepalives> | ||||
<max-wait>30</max-wait> | ||||
<max-attempts>3</max-attempts> | ||||
</ssh-keepalives> | ||||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
<endpoint> | <endpoint> | |||
<name>corp-fw2.example.com</name> | <name>corp-fw2.example.com</name> | |||
<ssh> | <ssh> | |||
<address>corp-fw2.example.com</address> | <remote-address>corp-fw2.example.com</remote-address> | |||
<client-identity> | <tcp-keepalives> | |||
<idle-time>15</idle-time> | ||||
<max-probes>3</max-probes> | ||||
<probe-interval>30</probe-interval> | ||||
</tcp-keepalives> | ||||
<ssh-client-identity> | ||||
<username>foobar</username> | <username>foobar</username> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:iet\ | <local-definition> | |||
f-crypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | |||
<private-key>base64encodedvalue==</private-key> | \etf-crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</client-identity> | </ssh-client-identity> | |||
<server-auth> | <ssh-server-auth> | |||
<pinned-ca-certs>explicitly-trusted-server-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-server-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-server-certs>explicitly-trusted-server-certs</\ | <pinned-server-certs>explicitly-trusted-server-certs</\ | |||
pinned-server-certs> | \pinned-server-certs> | |||
</server-auth> | </ssh-server-auth> | |||
<ssh-keepalives> | ||||
<max-wait>30</max-wait> | ||||
<max-attempts>3</max-attempts> | ||||
</ssh-keepalives> | ||||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
</endpoints> | </endpoints> | |||
<connection-type> | <connection-type> | |||
<persistent/> | <persistent/> | |||
</connection-type> | </connection-type> | |||
<reconnect-strategy> | <reconnect-strategy> | |||
<start-with>last-connected</start-with> | <start-with>last-connected</start-with> | |||
</reconnect-strategy> | </reconnect-strategy> | |||
</netconf-server> | </netconf-server> | |||
</initiate> | </initiate> | |||
<!-- endpoints to listen for NETCONF Call Home connections on --> | <!-- endpoints to listen for NETCONF Call Home connections on --> | |||
<listen> | <listen> | |||
<endpoint> | <endpoint> | |||
<name>Intranet-facing listener</name> | <name>Intranet-facing listener</name> | |||
<ssh> | <ssh> | |||
<address>192.0.2.7</address> | <local-address>192.0.2.7</local-address> | |||
<client-identity> | <ssh-client-identity> | |||
<username>foobar</username> | <username>foobar</username> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-cr\ | <local-definition> | |||
ypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | |||
<private-key>base64encodedvalue==</private-key> | \crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</client-identity> | </ssh-client-identity> | |||
<server-auth> | <ssh-server-auth> | |||
<pinned-ca-certs>explicitly-trusted-server-ca-certs</pinne\ | <pinned-ca-certs>explicitly-trusted-server-ca-certs</pinne\ | |||
d-ca-certs> | \d-ca-certs> | |||
<pinned-server-certs>explicitly-trusted-server-certs</pinn\ | <pinned-server-certs>explicitly-trusted-server-certs</pinn\ | |||
ed-server-certs> | \ed-server-certs> | |||
<pinned-ssh-host-keys>explicitly-trusted-ssh-host-keys</pi\ | <pinned-ssh-host-keys>explicitly-trusted-ssh-host-keys</pi\ | |||
nned-ssh-host-keys> | \nned-ssh-host-keys> | |||
</server-auth> | </ssh-server-auth> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
</listen> | </listen> | |||
</netconf-client> | </netconf-client> | |||
3.3. YANG Module | 3.3. YANG Module | |||
This YANG module has normative references to [RFC6242], [RFC6991], | This YANG module has normative references to [RFC6242], [RFC6991], | |||
[RFC7589], [RFC8071], [I-D.ietf-netconf-ssh-client-server], and | [RFC7589], [RFC8071], [I-D.kwatsen-netconf-tcp-client-server], | |||
[I-D.ietf-netconf-ssh-client-server], and | ||||
[I-D.ietf-netconf-tls-client-server]. | [I-D.ietf-netconf-tls-client-server]. | |||
<CODE BEGINS> file "ietf-netconf-client@2018-10-22.yang" | <CODE BEGINS> file "ietf-netconf-client@2019-03-09.yang" | |||
module ietf-netconf-client { | module ietf-netconf-client { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-client"; | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-client"; | |||
prefix "ncc"; | prefix "ncc"; | |||
import ietf-yang-types { | import ietf-yang-types { | |||
prefix yang; | prefix yang; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
import ietf-inet-types { | import ietf-tcp-client { | |||
prefix inet; | prefix tcpc; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | |||
} | ||||
import ietf-tcp-server { | ||||
prefix tcps; | ||||
reference | ||||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | ||||
} | } | |||
import ietf-ssh-client { | import ietf-ssh-client { | |||
prefix ss; | prefix sshc; | |||
revision-date 2018-10-22; // stable grouping definitions | revision-date 2019-03-09; // stable grouping definitions | |||
reference | reference | |||
"RFC YYYY: YANG Groupings for SSH Clients and SSH Servers"; | "RFC YYYY: YANG Groupings for SSH Clients and SSH Servers"; | |||
} | } | |||
import ietf-tls-client { | import ietf-tls-client { | |||
prefix ts; | prefix tlsc; | |||
revision-date 2018-10-22; // stable grouping definitions | revision-date 2019-03-09; // stable grouping definitions | |||
reference | reference | |||
"RFC ZZZZ: YANG Groupings for TLS Clients and TLS Servers"; | "RFC ZZZZ: YANG Groupings for TLS Clients and TLS Servers"; | |||
} | } | |||
organization | organization | |||
"IETF NETCONF (Network Configuration) Working Group"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
contact | contact | |||
"WG Web: <http://datatracker.ietf.org/wg/netconf/> | "WG Web: <http://datatracker.ietf.org/wg/netconf/> | |||
WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
Author: Kent Watsen <mailto:kent+ietf@watsen.net> | ||||
Author: Kent Watsen | Author: Gary Wu <mailto:garywu@cisco.com>"; | |||
<mailto:kwatsen@juniper.net> | ||||
Author: Gary Wu | ||||
<mailto:garywu@cisco.com>"; | ||||
description | description | |||
"This module contains a collection of YANG definitions for | "This module contains a collection of YANG definitions for | |||
configuring NETCONF clients. | configuring NETCONF clients. | |||
Copyright (c) 2017 IETF Trust and the persons identified as | 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 [RFC2119] | ||||
[RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
Copyright (c) 2019 IETF Trust and the persons identified as | ||||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Simplified BSD | to the license terms contained in, the Simplified BSD | |||
License set forth in Section 4.c of the IETF Trust's | License set forth in Section 4.c of the IETF Trust's | |||
Legal Provisions Relating to IETF Documents | Legal Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see | This version of this YANG module is part of RFC XXXX; see | |||
the RFC itself for full legal notices."; | the RFC itself for full legal notices."; | |||
revision "2018-10-22" { | revision "2019-03-09" { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC XXXX: NETCONF Client and Server Models"; | "RFC XXXX: NETCONF Client and Server Models"; | |||
} | } | |||
// Features | // Features | |||
feature initiate { | feature initiate { | |||
description | description | |||
skipping to change at page 16, line 44 ¶ | skipping to change at page 18, line 47 ¶ | |||
feature tls-listen { | feature tls-listen { | |||
description | description | |||
"The 'tls-listen' feature indicates that the NETCONF client | "The 'tls-listen' feature indicates that the NETCONF client | |||
supports opening a port to listen for incoming NETCONF | supports opening a port to listen for incoming NETCONF | |||
server call-home TLS connections."; | server call-home TLS connections."; | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
container netconf-client { | // Groupings | |||
uses netconf-client-grouping; | ||||
description | ||||
"Top-level container for NETCONF client configuration."; | ||||
} | ||||
grouping netconf-client-grouping { | grouping netconf-client-grouping { | |||
description | description | |||
"Top-level grouping for NETCONF client configuration."; | "Top-level grouping for NETCONF client configuration."; | |||
container initiate { | container initiate { | |||
if-feature initiate; | if-feature initiate; | |||
presence "Enables client to initiate TCP connections"; | presence "Enables client to initiate TCP connections"; | |||
description | description | |||
"Configures client initiating underlying TCP connections."; | "Configures client initiating underlying TCP connections."; | |||
skipping to change at page 17, line 49 ¶ | skipping to change at page 19, line 48 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature ssh-initiate; | if-feature ssh-initiate; | |||
container ssh { | container ssh { | |||
description | description | |||
"Specifies IP and SSH specific configuration | "Specifies IP and SSH specific configuration | |||
for the connection."; | for the connection."; | |||
leaf address { | uses tcpc:tcp-client-grouping { | |||
type inet:host; | refine "remote-port" { | |||
description | default 830; | |||
"The IP address or hostname of the endpoint. | description | |||
If a domain name is configured, then the | "The NETCONF client will attempt to connect | |||
DNS resolution should happen on each usage | to the IANA-assigned well-known port value | |||
attempt. If the DNS resolution results in | for 'netconf-ssh' (443) if no value is | |||
multiple IP addresses, the IP addresses will | specified."; | |||
be tried according to local preference order | } | |||
until a connection has been established or | ||||
until all IP addresses have failed."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 830; | ||||
description | ||||
"The IP port for this endpoint. The NETCONF | ||||
client will use the IANA-assigned well-known | ||||
port for 'netconf-ssh' (830) if no value is | ||||
specified."; | ||||
} | } | |||
uses ss:ssh-client-grouping; | uses sshc:ssh-client-grouping; | |||
} | } // container ssh | |||
} // end ssh | } // case ssh | |||
case tls { | case tls { | |||
if-feature tls-initiate; | if-feature tls-initiate; | |||
container tls { | container tls { | |||
description | description | |||
"Specifies IP and TLS specific configuration | "Specifies IP and TLS specific configuration | |||
for the connection."; | for the connection."; | |||
leaf address { | uses tcpc:tcp-client-grouping { | |||
type inet:host; | refine "remote-port" { | |||
description | ||||
"The IP address or hostname of the endpoint. | ||||
If a domain name is configured, then the | ||||
DNS resolution should happen on each usage | ||||
attempt. If the DNS resolution results in | ||||
multiple IP addresses, the IP addresses will | ||||
be tried according to local preference order | ||||
until a connection has been established or | ||||
until all IP addresses have failed."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 6513; | default 6513; | |||
description | description | |||
"The IP port for this endpoint. The NETCONF | "The NETCONF client will attempt to connect | |||
client will use the IANA-assigned well- | to the IANA-assigned well-known port value | |||
known port for 'netconf-tls' (6513) if no | for 'netconf-tls' (6513) if no value is | |||
value is specified."; | specified."; | |||
} | } | |||
uses ts:tls-client-grouping { | } | |||
refine "client-identity/auth-type" { | ||||
mandatory true; | uses tlsc:tls-client-grouping { | |||
description | refine "tls-client-identity/auth-type" { | |||
"NETCONF/TLS clients MUST pass some | mandatory true; | |||
authentication credentials."; | description | |||
} | "NETCONF/TLS clients MUST pass some | |||
} | authentication credentials."; | |||
} | } | |||
} // end tls | } | |||
} | ||||
} | } // container tls | |||
} | } // case tls | |||
} // choice transport | ||||
} // list endpoint | ||||
} // container endpoints | ||||
container connection-type { | container connection-type { | |||
description | description | |||
"Indicates the kind of connection to use."; | "Indicates the NETCONF client's preference for how the | |||
NETCONF connection is maintained."; | ||||
choice connection-type { | choice connection-type { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available connection types."; | "Selects between available connection types."; | |||
case persistent-connection { | case persistent-connection { | |||
container persistent { | container persistent { | |||
presence | presence | |||
"Indicates that a persistent connection is to be | "Indicates that a persistent connection is to be | |||
maintained."; | maintained."; | |||
description | description | |||
"Maintain a persistent connection to the NETCONF | "Maintain a persistent connection to the NETCONF | |||
server. If the connection goes down, immediately | server. If the connection goes down, immediately | |||
start trying to reconnect to it, using the | start trying to reconnect to it, using the | |||
reconnection strategy. | reconnection strategy. | |||
This connection type minimizes any NETCONF server | This connection type minimizes any NETCONF server | |||
to NETCONF client data-transfer delay, albeit at | to NETCONF client data-transfer delay, albeit at | |||
the expense of holding resources longer."; | the expense of holding resources longer."; | |||
container keep-alives { | ||||
description | ||||
"Configures the keep-alive policy, to | ||||
proactively test the aliveness of the SSH/TLS | ||||
server. An unresponsive SSH/TLS server will | ||||
be dropped after approximately max-attempts * | ||||
max-wait 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 | ||||
SSH/TLS server, a SSH/TLS-level message will | ||||
be sent to test the aliveness of the SSH/TLS | ||||
server."; | ||||
} | ||||
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 SSH/TLS server before | ||||
assuming the SSH/TLS server is no longer | ||||
alive."; | ||||
} | ||||
} | ||||
} | } | |||
} | } | |||
case periodic-connection { | case periodic-connection { | |||
container periodic { | container periodic { | |||
presence | presence | |||
"Indicates that a periodic connection is to be | "Indicates that a periodic connection is to be | |||
maintained."; | maintained."; | |||
description | description | |||
"Periodically connect to the NETCONF server. The | "Periodically connect to the NETCONF server. The | |||
NETCONF server should close the connection upon | NETCONF server should close the connection upon | |||
skipping to change at page 22, line 29 ¶ | skipping to change at page 23, line 26 ¶ | |||
type uint8 { | type uint8 { | |||
range "1..max"; | range "1..max"; | |||
} | } | |||
default 3; | default 3; | |||
description | description | |||
"Specifies the number times the NETCONF client tries | "Specifies the number times the NETCONF client tries | |||
to connect to a specific endpoint before moving on | to connect to a specific endpoint before moving on | |||
to the next endpoint in the list (round robin)."; | to the next endpoint in the list (round robin)."; | |||
} | } | |||
} | } | |||
} // end netconf-server | } // netconf-server | |||
} // end initiate | } // initiate | |||
container listen { | container listen { | |||
if-feature listen; | if-feature listen; | |||
presence "Enables client to accept call-home connections"; | presence "Enables client to accept call-home connections"; | |||
description | description | |||
"Configures client accepting call-home TCP connections."; | "Configures client accepting call-home TCP connections."; | |||
leaf idle-timeout { | leaf idle-timeout { | |||
type uint16; | type uint16; | |||
units "seconds"; | units "seconds"; | |||
skipping to change at page 23, line 23 ¶ | skipping to change at page 24, line 21 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature ssh-listen; | if-feature ssh-listen; | |||
container ssh { | container ssh { | |||
description | description | |||
"SSH-specific listening configuration for inbound | "SSH-specific listening configuration for inbound | |||
connections."; | connections."; | |||
leaf address { | uses tcps:tcp-server-grouping { | |||
type inet:ip-address; | refine "local-port" { | |||
description | default 4334; | |||
"The IP address to listen on for incoming call- | description | |||
home connections. The NETCONF client will listen | "The NETCONF client will listen on the IANA- | |||
on all configured interfaces if no value is | assigned well-known port for 'netconf-ch-ssh' | |||
specified. INADDR_ANY (0.0.0.0) or INADDR6_ANY | (4334) if no value is specified."; | |||
(0:0:0:0:0:0:0:0 a.k.a. ::) MUST be used when | } | |||
the server is to listen on all IPv4 or IPv6 | ||||
addresses, respectively."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 4334; | ||||
description | ||||
"The port number to listen on for call-home | ||||
connections. The NETCONF client will listen | ||||
on the IANA-assigned well-known port for | ||||
'netconf-ch-ssh' (4334) if no value is | ||||
specified."; | ||||
} | } | |||
uses ss:ssh-client-grouping; | uses sshc:ssh-client-grouping; | |||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature tls-listen; | if-feature tls-listen; | |||
container tls { | container tls { | |||
description | description | |||
"TLS-specific listening configuration for inbound | "TLS-specific listening configuration for inbound | |||
connections."; | connections."; | |||
leaf address { | uses tcps:tcp-server-grouping { | |||
type inet:ip-address; | refine "local-port" { | |||
description | default 4334; | |||
"The IP address to listen on for incoming call- | description | |||
home connections. The NETCONF client will listen | "The NETCONF client will listen on the IANA- | |||
on all configured interfaces if no value is | assigned well-known port for 'netconf-ch-ssh' | |||
specified. INADDR_ANY (0.0.0.0) or INADDR6_ANY | (4334) if no value is specified."; | |||
(0:0:0:0:0:0:0:0 a.k.a. ::) MUST be used when | } | |||
the server is to listen on all IPv4 or IPv6 | ||||
addresses, respectively."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 4335; | ||||
description | ||||
"The port number to listen on for call-home | ||||
connections. The NETCONF client will listen | ||||
on the IANA-assigned well-known port for | ||||
'netconf-ch-tls' (4335) if no value is | ||||
specified."; | ||||
} | } | |||
uses ts:tls-client-grouping { | uses tlsc:tls-client-grouping { | |||
refine "client-identity/auth-type" { | refine "tls-client-identity/auth-type" { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"NETCONF/TLS clients MUST pass some | "NETCONF/TLS clients MUST pass some | |||
authentication credentials."; | authentication credentials."; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} // end transport | } // transport | |||
} // end endpoint | } // endpoint | |||
} // end listen | } // listen | |||
} // netconf-client | ||||
} // end netconf-client | // Protocol accessible node, for servers that 'implement' | |||
// this module. | ||||
container netconf-client { | ||||
uses netconf-client-grouping; | ||||
description | ||||
"Top-level container for NETCONF client configuration."; | ||||
} | ||||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
4. The NETCONF Server Model | 4. The NETCONF Server Model | |||
The NETCONF server model presented in this section supports servers | The NETCONF server model presented in this section supports servers | |||
both listening for connections as well as initiating call-home | both listening for connections as well as initiating call-home | |||
connections. | connections. | |||
This model supports both the SSH and TLS transport protocols, using | This model supports both the SSH and TLS transport protocols, using | |||
skipping to change at page 25, line 21 ¶ | skipping to change at page 25, line 50 ¶ | |||
YANG feature statements are used to enable implementations to | YANG feature statements are used to enable implementations to | |||
advertise which parts of the model the NETCONF server supports. | advertise which parts of the model the NETCONF server supports. | |||
4.1. Tree Diagram | 4.1. Tree Diagram | |||
The following tree diagram [RFC8340] provides an overview of the data | The following tree diagram [RFC8340] provides an overview of the data | |||
model for the "ietf-netconf-server" module. Just the container is | model for the "ietf-netconf-server" module. Just the container is | |||
displayed below, but there is also a reusable grouping called | displayed below, but there is also a reusable grouping called | |||
"netconf-server-grouping" that the container is using. | "netconf-server-grouping" that the container is using. | |||
[Note: '\' line wrapping for formatting only] | ========== NOTE: '\\' line wrapping per BCP XX (RFC XXXX) =========== | |||
module: ietf-netconf-server | module: ietf-netconf-server | |||
+--rw netconf-server | +--rw netconf-server | |||
+--rw listen! {listen}? | +--rw listen! {listen}? | |||
| +--rw idle-timeout? uint16 | | +--rw idle-timeout? uint16 | |||
| +--rw endpoint* [name] | | +--rw endpoint* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (transport) | | +--rw (transport) | |||
| +--:(ssh) {ssh-listen}? | | +--:(ssh) {ssh-listen}? | |||
| | +--rw ssh | | | +--rw ssh | |||
| | +--rw address inet:ip-address | | | +--rw local-address inet:ip-address | |||
| | +--rw port? inet:port-number | | | +--rw local-port? inet:port-number | |||
| | +--rw server-identity | | | +--rw tcp-keepalives {tcp-server-keepalives}? | |||
| | | +--rw idle-time? uint16 | ||||
| | | +--rw max-probes? uint16 | ||||
| | | +--rw probe-interval? uint16 | ||||
| | +--rw ssh-server-identity | ||||
| | | +--rw host-key* [name] | | | | +--rw host-key* [name] | |||
| | | +--rw name string | | | | +--rw name string | |||
| | | +--rw (host-key-type) | | | | +--rw (host-key-type) | |||
| | | +--:(public-key) | | | | +--:(public-key) | |||
| | | | +--rw public-key | | | | | +--rw public-key | |||
| | | | +--rw (local-or-keystore) | | | | | +--rw (local-or-keystore) | |||
| | | | +--:(local) | | | | | +--:(local) | |||
| | | | | {local-keys-supported\ | | | | | | {local-keys-supported\ | |||
}? | \}? | |||
| | | | | +--rw algorithm? | | | | | | +--rw local-definition | |||
| | | | | | asymmetric-key-encr\ | | | | | | +--rw algorithm? | |||
yption-algorithm-ref | | | | | | | asymmetric-key-a\ | |||
| | | | | +--rw public-key? | \lgorithm-ref | |||
| | | | | | binary | | | | | | +--rw public-key? | |||
| | | | | +--rw private-key? | | | | | | | binary | |||
| | | | | | union | | | | | | +--rw private-key? | |||
| | | | | +---x generate-hidden-key | | | | | | | union | |||
| | | | | | +---w input | | | | | | +---x generate-hidden-key | |||
| | | | | | +---w algorithm | | | | | | | +---w input | |||
| | | | | | asymmetric-ke\ | | | | | | | +---w algorithm | |||
y-encryption-algorithm-ref | | | | | | | asymmetric\ | |||
| | | | | +---x install-hidden-key | \-key-algorithm-ref | |||
| | | | | +---w input | | | | | | +---x install-hidden-key | |||
| | | | | +---w algorithm | | | | | | +---w input | |||
| | | | | | asymmetric-ke\ | | | | | | +---w algorithm | |||
y-encryption-algorithm-ref | | | | | | | asymmetric\ | |||
| | | | | +---w public-key? | \-key-algorithm-ref | |||
| | | | | | binary | | | | | | +---w public-key? | |||
| | | | | +---w private-key? | | | | | | | binary | |||
| | | | | binary | | | | | | +---w private-key? | |||
| | | | | binary | ||||
| | | | +--:(keystore) | | | | | +--:(keystore) | |||
| | | | {keystore-supported}? | | | | | {keystore-supported}? | |||
| | | | +--rw reference? | | | | | +--rw keystore-reference? | |||
| | | | ks:asymmetric-key-r\ | | | | | ks:asymmetric-key-r\ | |||
ef | \ef | |||
| | | +--:(certificate) | | | | +--:(certificate) | |||
| | | +--rw certificate | | | | +--rw certificate | |||
| | | {sshcmn:ssh-x509-certs}? | | | | {sshcmn:ssh-x509-certs}? | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) | | | | +--:(local) | |||
| | | | {local-keys-supported\ | | | | | {local-keys-supported\ | |||
}? | \}? | |||
| | | | +--rw algorithm? | | | | | +--rw local-definition | |||
| | | | | asymmetric-key-encr\ | | | | | +--rw algorithm? | |||
yption-algorithm-ref | | | | | | asymmetric-key-a\ | |||
| | | | +--rw public-key? | \lgorithm-ref | |||
| | | | | binary | | | | | +--rw public-key? | |||
| | | | +--rw private-key? | | | | | | binary | |||
| | | | | union | | | | | +--rw private-key? | |||
| | | | +---x generate-hidden-key | | | | | | union | |||
| | | | | +---w input | | | | | +---x generate-hidden-key | |||
| | | | | +---w algorithm | | | | | | +---w input | |||
| | | | | asymmetric-ke\ | | | | | | +---w algorithm | |||
y-encryption-algorithm-ref | | | | | | asymmetric\ | |||
| | | | +---x install-hidden-key | \-key-algorithm-ref | |||
| | | | | +---w input | | | | | +---x install-hidden-key | |||
| | | | | +---w algorithm | | | | | | +---w input | |||
| | | | | | asymmetric-ke\ | | | | | | +---w algorithm | |||
y-encryption-algorithm-ref | | | | | | | asymmetric\ | |||
| | | | | +---w public-key? | \-key-algorithm-ref | |||
| | | | | | binary | | | | | | +---w public-key? | |||
| | | | | +---w private-key? | | | | | | | binary | |||
| | | | | binary | | | | | | +---w private-key? | |||
| | | | +--rw cert? | | | | | | binary | |||
| | | | | end-entity-cert-cms | | | | | +--rw cert? | |||
| | | | +---n certificate-expiration | | | | | | end-entity-cert-\ | |||
| | | | +-- expiration-date | \cms | |||
| | | | yang:date-and-ti\ | | | | | +---n certificate-expira\ | |||
me | \tion | |||
| | | | +-- expiration-date | ||||
| | | | yang:date-and\ | ||||
\-time | ||||
| | | +--:(keystore) | | | | +--:(keystore) | |||
| | | {keystore-supported}? | | | | {keystore-supported}? | |||
| | | +--rw reference? | | | | +--rw keystore-reference? | |||
| | | ks:asymmetric-key-c\ | | | | ks:asymmetric-key-c\ | |||
ertificate-ref | \ertificate-ref | |||
| | +--rw client-cert-auth {sshcmn:ssh-x509-certs}? | | | +--rw ssh-client-cert-auth {sshcmn:ssh-x509-cert\ | |||
\s}? | ||||
| | | +--rw pinned-ca-certs? | | | | +--rw pinned-ca-certs? | |||
| | | | ta:pinned-certificates-ref | | | | | ta:pinned-certificates-ref | |||
| | | | {ta:x509-certificates}? | | | | | {ta:x509-certificates}? | |||
| | | +--rw pinned-client-certs? | | | | +--rw pinned-client-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw transport-params | | | +--rw ssh-transport-params | |||
| | {ssh-server-transport-params-config}? | | | | {ssh-server-transport-params-config}? | |||
| | +--rw host-key | | | | +--rw host-key | |||
| | | +--rw host-key-alg* identityref | | | | | +--rw host-key-alg* identityref | |||
| | +--rw key-exchange | | | | +--rw key-exchange | |||
| | | +--rw key-exchange-alg* identityref | | | | | +--rw key-exchange-alg* identityref | |||
| | +--rw encryption | | | | +--rw encryption | |||
| | | +--rw encryption-alg* identityref | | | | | +--rw encryption-alg* identityref | |||
| | +--rw mac | | | | +--rw mac | |||
| | +--rw mac-alg* identityref | | | | +--rw mac-alg* identityref | |||
| | +--rw ssh-keepalives {ssh-server-keepalives}? | ||||
| | +--rw max-wait? uint16 | ||||
| | +--rw max-attempts? uint8 | ||||
| +--:(tls) {tls-listen}? | | +--:(tls) {tls-listen}? | |||
| +--rw tls | | +--rw tls | |||
| +--rw address inet:ip-address | | +--rw local-address inet:ip-address | |||
| +--rw port? inet:port-number | | +--rw local-port? inet:port-number | |||
| +--rw server-identity | | +--rw tcp-keepalives {tcp-server-keepalives}? | |||
| | +--rw idle-time? uint16 | ||||
| | +--rw max-probes? uint16 | ||||
| | +--rw probe-interval? uint16 | ||||
| +--rw tls-server-identity | ||||
| | +--rw (local-or-keystore) | | | +--rw (local-or-keystore) | |||
| | +--:(local) {local-keys-supported}? | | | +--:(local) {local-keys-supported}? | |||
| | | +--rw algorithm? | | | | +--rw local-definition | |||
| | | | asymmetric-key-encryption-algor\ | | | | +--rw algorithm? | |||
ithm-ref | | | | | asymmetric-key-algorithm-ref | |||
| | | +--rw public-key? binary | | | | +--rw public-key? bina\ | |||
| | | +--rw private-key? union | \ry | |||
| | | +---x generate-hidden-key | | | | +--rw private-key? union | |||
| | | | +---w input | | | | +---x generate-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | asymmetric-key-encryption\ | | | | | +---w algorithm | |||
-algorithm-ref | | | | | asymmetric-key-algorit\ | |||
| | | +---x install-hidden-key | \hm-ref | |||
| | | | +---w input | | | | +---x install-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | | asymmetric-key-encryption\ | | | | | +---w algorithm | |||
-algorithm-ref | | | | | | asymmetric-key-algorit\ | |||
| | | | +---w public-key? binary | \hm-ref | |||
| | | | +---w private-key? binary | | | | | +---w public-key? binary | |||
| | | +--rw cert? | | | | | +---w private-key? binary | |||
| | | | end-entity-cert-cms | | | | +--rw cert? | |||
| | | +---n certificate-expiration | | | | | end-entity-cert-cms | |||
| | | +-- expiration-date | | | | +---n certificate-expiration | |||
| | | yang:date-and-time | | | | +-- expiration-date | |||
| | | yang:date-and-time | ||||
| | +--:(keystore) {keystore-supported}? | | | +--:(keystore) {keystore-supported}? | |||
| | +--rw reference? | | | +--rw keystore-reference? | |||
| | ks:asymmetric-key-certificate-r\ | | | ks:asymmetric-key-certificate-r\ | |||
ef | \ef | |||
| +--rw client-auth | | +--rw tls-client-auth | |||
| | +--rw pinned-ca-certs? | | | +--rw pinned-ca-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw pinned-client-certs? | | | +--rw pinned-client-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw cert-maps | | | +--rw cert-maps | |||
| | +--rw cert-to-name* [id] | | | +--rw cert-to-name* [id] | |||
| | +--rw id uint32 | | | +--rw id uint32 | |||
| | +--rw fingerprint | | | +--rw fingerprint | |||
| | | x509c2n:tls-fingerprint | | | | x509c2n:tls-fingerprint | |||
| | +--rw map-type identityref | | | +--rw map-type identityref | |||
| | +--rw name string | | | +--rw name string | |||
| +--rw hello-params | | +--rw tls-hello-params | |||
| {tls-server-hello-params-config}? | | | {tls-server-hello-params-config}? | |||
| +--rw tls-versions | | | +--rw tls-versions | |||
| | +--rw tls-version* identityref | | | | +--rw tls-version* identityref | |||
| +--rw cipher-suites | | | +--rw cipher-suites | |||
| +--rw cipher-suite* identityref | | | +--rw cipher-suite* identityref | |||
| +--rw tls-keepalives {tls-server-keepalives}? | ||||
| +--rw max-wait? uint16 | ||||
| +--rw max-attempts? uint8 | ||||
+--rw call-home! {call-home}? | +--rw call-home! {call-home}? | |||
+--rw netconf-client* [name] | +--rw netconf-client* [name] | |||
+--rw name string | +--rw name string | |||
+--rw endpoints | +--rw endpoints | |||
| +--rw endpoint* [name] | | +--rw endpoint* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (transport) | | +--rw (transport) | |||
| +--:(ssh) {ssh-call-home}? | | +--:(ssh) {ssh-call-home}? | |||
| | +--rw ssh | | | +--rw ssh | |||
| | +--rw address inet:host | | | +--rw remote-address inet:host | |||
| | +--rw port? inet:port-number | | | +--rw remote-port? | |||
| | +--rw server-identity | | | | inet:port-number | |||
| | +--rw local-address? inet:ip-addr\ | ||||
\ess | ||||
| | +--rw local-port? | ||||
| | | inet:port-number | ||||
| | +--rw tcp-keepalives {tcp-client-keepalive\ | ||||
\s}? | ||||
| | | +--rw idle-time? uint16 | ||||
| | | +--rw max-probes? uint16 | ||||
| | | +--rw probe-interval? uint16 | ||||
| | +--rw ssh-server-identity | ||||
| | | +--rw host-key* [name] | | | | +--rw host-key* [name] | |||
| | | +--rw name string | | | | +--rw name string | |||
| | | +--rw (host-key-type) | | | | +--rw (host-key-type) | |||
| | | +--:(public-key) | | | | +--:(public-key) | |||
| | | | +--rw public-key | | | | | +--rw public-key | |||
| | | | +--rw (local-or-keystore) | | | | | +--rw (local-or-keystore) | |||
| | | | +--:(local) | | | | | +--:(local) | |||
| | | | | {local-keys-sup\ | | | | | | {local-keys-sup\ | |||
ported}? | \ported}? | |||
| | | | | +--rw algorithm? | | | | | | +--rw local-definition | |||
| | | | | | asymmetric-ke\ | | | | | | +--rw algorithm? | |||
y-encryption-algorithm-ref | | | | | | | asymmetric\ | |||
| | | | | +--rw public-key? | \-key-algorithm-ref | |||
| | | | | | binary | | | | | | +--rw public-key? | |||
| | | | | +--rw private-key? | | | | | | | binary | |||
| | | | | | union | | | | | | +--rw private-key? | |||
| | | | | +---x generate-hidden\ | | | | | | | union | |||
-key | | | | | | +---x generate-hid\ | |||
| | | | | | +---w input | \den-key | |||
| | | | | | +---w algorithm | | | | | | | +---w input | |||
| | | | | | asymmet\ | | | | | | | +---w algori\ | |||
ric-key-encryption-algorithm-ref | \thm | |||
| | | | | +---x install-hidden-\ | | | | | | | asym\ | |||
key | \metric-key-algorithm-ref | |||
| | | | | +---w input | | | | | | +---x install-hidd\ | |||
| | | | | +---w algorithm | \en-key | |||
| | | | | | asymmet\ | | | | | | +---w input | |||
ric-key-encryption-algorithm-ref | | | | | | +---w algori\ | |||
| | | | | +---w public-ke\ | \thm | |||
y? | | | | | | | asym\ | |||
| | | | | | binary | \metric-key-algorithm-ref | |||
| | | | | +---w private-k\ | | | | | | +---w public\ | |||
ey? | \-key? | |||
| | | | | binary | | | | | | | bina\ | |||
\ry | ||||
| | | | | +---w privat\ | ||||
\e-key? | ||||
| | | | | bina\ | ||||
\ry | ||||
| | | | +--:(keystore) | | | | | +--:(keystore) | |||
| | | | {keystore-suppo\ | | | | | {keystore-suppo\ | |||
rted}? | \rted}? | |||
| | | | +--rw reference? | | | | | +--rw keystore-refere\ | |||
\nce? | ||||
| | | | ks:asymmetric\ | | | | | ks:asymmetric\ | |||
-key-ref | \-key-ref | |||
| | | +--:(certificate) | | | | +--:(certificate) | |||
| | | +--rw certificate | | | | +--rw certificate | |||
| | | {sshcmn:ssh-x509-certs\ | | | | {sshcmn:ssh-x509-certs\ | |||
}? | \}? | |||
| | | +--rw (local-or-keystore) | | | | +--rw (local-or-keystore) | |||
| | | +--:(local) | | | | +--:(local) | |||
| | | | {local-keys-sup\ | | | | | {local-keys-sup\ | |||
ported}? | \ported}? | |||
| | | | +--rw algorithm? | | | | | +--rw local-definition | |||
| | | | | asymmetric-ke\ | | | | | +--rw algorithm? | |||
y-encryption-algorithm-ref | | | | | | asymmetric\ | |||
| | | | +--rw public-key? | \-key-algorithm-ref | |||
| | | | | binary | | | | | +--rw public-key? | |||
| | | | +--rw private-key? | | | | | | binary | |||
| | | | | union | | | | | +--rw private-key? | |||
| | | | +---x generate-hidden\ | | | | | | union | |||
-key | | | | | +---x generate-hid\ | |||
| | | | | +---w input | \den-key | |||
| | | | | +---w algorithm | | | | | | +---w input | |||
| | | | | asymmet\ | | | | | | +---w algori\ | |||
ric-key-encryption-algorithm-ref | \thm | |||
| | | | +---x install-hidden-\ | | | | | | asym\ | |||
key | \metric-key-algorithm-ref | |||
| | | | | +---w input | | | | | +---x install-hidd\ | |||
| | | | | +---w algorithm | \en-key | |||
| | | | | | asymmet\ | | | | | | +---w input | |||
ric-key-encryption-algorithm-ref | | | | | | +---w algori\ | |||
| | | | | +---w public-ke\ | \thm | |||
y? | | | | | | | asym\ | |||
| | | | | | binary | \metric-key-algorithm-ref | |||
| | | | | +---w private-k\ | | | | | | +---w public\ | |||
ey? | \-key? | |||
| | | | | binary | | | | | | | bina\ | |||
| | | | +--rw cert? | \ry | |||
| | | | | end-entity-ce\ | | | | | | +---w privat\ | |||
rt-cms | \e-key? | |||
| | | | +---n certificate-exp\ | | | | | | bina\ | |||
iration | \ry | |||
| | | | +-- expiration-date | | | | | +--rw cert? | |||
| | | | yang:date-\ | | | | | | end-entity\ | |||
and-time | \-cert-cms | |||
| | | | +---n certificate-\ | ||||
\expiration | ||||
| | | | +-- expiration-\ | ||||
\date | ||||
| | | | yang:da\ | ||||
\te-and-time | ||||
| | | +--:(keystore) | | | | +--:(keystore) | |||
| | | {keystore-suppo\ | | | | {keystore-suppo\ | |||
rted}? | \rted}? | |||
| | | +--rw reference? | | | | +--rw keystore-refere\ | |||
\nce? | ||||
| | | ks:asymmetric\ | | | | ks:asymmetric\ | |||
-key-certificate-ref | \-key-certificate-ref | |||
| | +--rw client-cert-auth | | | +--rw ssh-client-cert-auth | |||
| | | {sshcmn:ssh-x509-certs}? | | | | {sshcmn:ssh-x509-certs}? | |||
| | | +--rw pinned-ca-certs? | | | | +--rw pinned-ca-certs? | |||
| | | | ta:pinned-certificates-ref | | | | | ta:pinned-certificates-ref | |||
| | | | {ta:x509-certificates}? | | | | | {ta:x509-certificates}? | |||
| | | +--rw pinned-client-certs? | | | | +--rw pinned-client-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw transport-params | | | +--rw ssh-transport-params | |||
| | {ssh-server-transport-params-confi\ | | | | {ssh-server-transport-params-confi\ | |||
g}? | \g}? | |||
| | +--rw host-key | | | | +--rw host-key | |||
| | | +--rw host-key-alg* identityref | | | | | +--rw host-key-alg* identityref | |||
| | +--rw key-exchange | | | | +--rw key-exchange | |||
| | | +--rw key-exchange-alg* identityref | | | | | +--rw key-exchange-alg* identityref | |||
| | +--rw encryption | | | | +--rw encryption | |||
| | | +--rw encryption-alg* identityref | | | | | +--rw encryption-alg* identityref | |||
| | +--rw mac | | | | +--rw mac | |||
| | +--rw mac-alg* identityref | | | | +--rw mac-alg* identityref | |||
| | +--rw ssh-keepalives {ssh-server-keepalive\ | ||||
\s}? | ||||
| | +--rw max-wait? uint16 | ||||
| | +--rw max-attempts? uint8 | ||||
| +--:(tls) {tls-call-home}? | | +--:(tls) {tls-call-home}? | |||
| +--rw tls | | +--rw tls | |||
| +--rw address inet:host | | +--rw remote-address inet:host | |||
| +--rw port? inet:port-number | | +--rw remote-port? inet:port-num\ | |||
| +--rw server-identity | \ber | |||
| +--rw local-address? inet:ip-addre\ | ||||
\ss | ||||
| +--rw local-port? inet:port-num\ | ||||
\ber | ||||
| +--rw tcp-keepalives {tcp-client-keepalive\ | ||||
\s}? | ||||
| | +--rw idle-time? uint16 | ||||
| | +--rw max-probes? uint16 | ||||
| | +--rw probe-interval? uint16 | ||||
| +--rw tls-server-identity | ||||
| | +--rw (local-or-keystore) | | | +--rw (local-or-keystore) | |||
| | +--:(local) {local-keys-supported}? | | | +--:(local) {local-keys-supported}? | |||
| | | +--rw algorithm? | | | | +--rw local-definition | |||
| | | | asymmetric-key-encryption\ | | | | +--rw algorithm? | |||
-algorithm-ref | | | | | asymmetric-key-algorit\ | |||
| | | +--rw public-key? | \hm-ref | |||
| | | | binary | | | | +--rw public-key? | |||
| | | +--rw private-key? | | | | | binary | |||
| | | | union | | | | +--rw private-key? | |||
| | | +---x generate-hidden-key | | | | | union | |||
| | | | +---w input | | | | +---x generate-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | asymmetric-key-encr\ | | | | | +---w algorithm | |||
yption-algorithm-ref | | | | | asymmetric-key-a\ | |||
| | | +---x install-hidden-key | \lgorithm-ref | |||
| | | | +---w input | | | | +---x install-hidden-key | |||
| | | | +---w algorithm | | | | | +---w input | |||
| | | | | asymmetric-key-encr\ | | | | | +---w algorithm | |||
yption-algorithm-ref | | | | | | asymmetric-key-a\ | |||
| | | | +---w public-key? binary | \lgorithm-ref | |||
| | | | +---w private-key? binary | | | | | +---w public-key? bin\ | |||
| | | +--rw cert? | \ary | |||
| | | | end-entity-cert-cms | | | | | +---w private-key? bin\ | |||
| | | +---n certificate-expiration | \ary | |||
| | | +-- expiration-date | | | | +--rw cert? | |||
| | | yang:date-and-time | | | | | end-entity-cert-cms | |||
| | | +---n certificate-expiration | ||||
| | | +-- expiration-date | ||||
| | | yang:date-and-time | ||||
| | +--:(keystore) {keystore-supported}? | | | +--:(keystore) {keystore-supported}? | |||
| | +--rw reference? | | | +--rw keystore-reference? | |||
| | ks:asymmetric-key-certifi\ | | | ks:asymmetric-key-certifi\ | |||
cate-ref | \cate-ref | |||
| +--rw client-auth | | +--rw tls-client-auth | |||
| | +--rw pinned-ca-certs? | | | +--rw pinned-ca-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw pinned-client-certs? | | | +--rw pinned-client-certs? | |||
| | | ta:pinned-certificates-ref | | | | ta:pinned-certificates-ref | |||
| | | {ta:x509-certificates}? | | | | {ta:x509-certificates}? | |||
| | +--rw cert-maps | | | +--rw cert-maps | |||
| | +--rw cert-to-name* [id] | | | +--rw cert-to-name* [id] | |||
| | +--rw id uint32 | | | +--rw id uint32 | |||
| | +--rw fingerprint | | | +--rw fingerprint | |||
| | | x509c2n:tls-fingerprint | | | | x509c2n:tls-fingerprint | |||
| | +--rw map-type identityref | | | +--rw map-type identityref | |||
| | +--rw name string | | | +--rw name string | |||
| +--rw hello-params | | +--rw tls-hello-params | |||
| {tls-server-hello-params-config}? | | | {tls-server-hello-params-config}? | |||
| +--rw tls-versions | | | +--rw tls-versions | |||
| | +--rw tls-version* identityref | | | | +--rw tls-version* identityref | |||
| +--rw cipher-suites | | | +--rw cipher-suites | |||
| +--rw cipher-suite* identityref | | | +--rw cipher-suite* identityref | |||
| +--rw tls-keepalives {tls-server-keepalive\ | ||||
\s}? | ||||
| +--rw max-wait? uint16 | ||||
| +--rw max-attempts? uint8 | ||||
+--rw connection-type | +--rw connection-type | |||
| +--rw (connection-type) | | +--rw (connection-type) | |||
| +--:(persistent-connection) | | +--:(persistent-connection) | |||
| | +--rw persistent! | | | +--rw persistent! | |||
| | +--rw keep-alives | ||||
| | +--rw max-wait? uint16 | ||||
| | +--rw max-attempts? uint8 | ||||
| +--:(periodic-connection) | | +--:(periodic-connection) | |||
| +--rw periodic! | | +--rw periodic! | |||
| +--rw period? uint16 | | +--rw period? uint16 | |||
| +--rw anchor-time? yang:date-and-time | | +--rw anchor-time? yang:date-and-time | |||
| +--rw idle-timeout? uint16 | | +--rw idle-timeout? uint16 | |||
+--rw reconnect-strategy | +--rw reconnect-strategy | |||
+--rw start-with? enumeration | +--rw start-with? enumeration | |||
+--rw max-attempts? uint8 | +--rw max-attempts? uint8 | |||
4.2. Example Usage | 4.2. Example Usage | |||
The following example illustrates configuring a NETCONF server to | The following example illustrates configuring a NETCONF server to | |||
listen for NETCONF client connections using both the SSH and TLS | listen for NETCONF client connections using both the SSH and TLS | |||
transport protocols, as well as configuring call-home to two NETCONF | transport protocols, as well as configuring call-home to two NETCONF | |||
clients, one using SSH and the other using TLS. | clients, one using SSH and the other using TLS. | |||
This example is consistent with the examples presented in Section 3.2 | This example is consistent with the examples presented in Section 3.2 | |||
of [I-D.ietf-netconf-keystore]. | of [I-D.ietf-netconf-keystore]. | |||
[Note: '\' line wrapping for formatting only] | ========== NOTE: '\\' line wrapping per BCP XX (RFC XXXX) =========== | |||
<netconf-server | <netconf-server | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | |||
xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | |||
<!-- endpoints to listen for NETCONF connections on --> | <!-- endpoints to listen for NETCONF connections on --> | |||
<listen> | <listen> | |||
<endpoint> <!-- listening for SSH connections --> | <endpoint> <!-- listening for SSH connections --> | |||
<name>netconf/ssh</name> | <name>netconf/ssh</name> | |||
<ssh> | <ssh> | |||
<address>192.0.2.7</address> | <local-address>192.0.2.7</local-address> | |||
<server-identity> | <ssh-server-identity> | |||
<host-key> | <host-key> | |||
<name>deployment-specific-certificate</name> | <name>deployment-specific-certificate</name> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | <local-definition> | |||
crypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:iet\ | |||
<private-key>base64encodedvalue==</private-key> | \f-crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </ssh-server-identity> | |||
<client-cert-auth> | <ssh-client-cert-auth> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</pinne\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</pinne\ | |||
d-ca-certs> | \d-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</pinn\ | <pinned-client-certs>explicitly-trusted-client-certs</pinn\ | |||
ed-client-certs> | \ed-client-certs> | |||
</client-cert-auth> | </ssh-client-cert-auth> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
<endpoint> <!-- listening for TLS sessions --> | <endpoint> <!-- listening for TLS sessions --> | |||
<name>netconf/tls</name> | <name>netconf/tls</name> | |||
<tls> | <tls> | |||
<address>192.0.2.7</address> | <local-address>192.0.2.7</local-address> | |||
<server-identity> | <tls-server-identity> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-cryp\ | <local-definition> | |||
to-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-cr\ | |||
<private-key>base64encodedvalue==</private-key> | \ypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<cert>base64encodedvalue==</cert> | <public-key>base64encodedvalue==</public-key> | |||
</server-identity> | <cert>base64encodedvalue==</cert> | |||
<client-auth> | </local-definition> | |||
</tls-server-identity> | ||||
<tls-client-auth> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</pinne\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</pinne\ | |||
d-ca-certs> | \d-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</pinn\ | <pinned-client-certs>explicitly-trusted-client-certs</pinn\ | |||
ed-client-certs> | \ed-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
<cert-to-name> | <cert-to-name> | |||
<id>2</id> | <id>2</id> | |||
<fingerprint>B3:4F:A1:8C:54</fingerprint> | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |||
<map-type>x509c2n:specified</map-type> | <map-type>x509c2n:specified</map-type> | |||
<name>scooby-doo</name> | <name>scooby-doo</name> | |||
</cert-to-name> | </cert-to-name> | |||
</cert-maps> | </cert-maps> | |||
</client-auth> | ||||
</tls-client-auth> | ||||
</tls> | </tls> | |||
</endpoint> | </endpoint> | |||
</listen> | </listen> | |||
<!-- calling home to SSH and TLS based NETCONF clients --> | <!-- calling home to SSH and TLS based NETCONF clients --> | |||
<call-home> | <call-home> | |||
<netconf-client> <!-- SSH-based client --> | <netconf-client> <!-- SSH-based client --> | |||
<name>config-mgr</name> | <name>config-mgr</name> | |||
<endpoints> | <endpoints> | |||
<endpoint> | <endpoint> | |||
<name>east-data-center</name> | <name>east-data-center</name> | |||
<ssh> | <ssh> | |||
<address>east.config-mgr.example.com</address> | <remote-address>east.config-mgr.example.com</remote-addr\ | |||
<server-identity> | \ess> | |||
<ssh-server-identity> | ||||
<host-key> | <host-key> | |||
<name>deployment-specific-certificate</name> | <name>deployment-specific-certificate</name> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | <local-definition> | |||
etf-crypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang\ | |||
<private-key>base64encodedvalue==</private-key> | \:ietf-crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </ssh-server-identity> | |||
<client-cert-auth> | <ssh-client-cert-auth> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</\ | <pinned-client-certs>explicitly-trusted-client-certs</\ | |||
pinned-client-certs> | \pinned-client-certs> | |||
</client-cert-auth> | </ssh-client-cert-auth> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
<endpoint> | <endpoint> | |||
<name>west-data-center</name> | <name>west-data-center</name> | |||
<ssh> | <ssh> | |||
<address>west.config-mgr.example.com</address> | <remote-address>west.config-mgr.example.com</remote-addr\ | |||
<server-identity> | \ess> | |||
<ssh-server-identity> | ||||
<host-key> | <host-key> | |||
<name>deployment-specific-certificate</name> | <name>deployment-specific-certificate</name> | |||
<public-key> | <public-key> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:i\ | <local-definition> | |||
etf-crypto-types">ct:rsa2048</algorithm> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang\ | |||
<private-key>base64encodedvalue==</private-key> | \:ietf-crypto-types">ct:rsa2048</algorithm> | |||
<public-key>base64encodedvalue==</public-key> | <private-key>base64encodedvalue==</private-key> | |||
<public-key>base64encodedvalue==</public-key> | ||||
</local-definition> | ||||
</public-key> | </public-key> | |||
</host-key> | </host-key> | |||
</server-identity> | </ssh-server-identity> | |||
<client-cert-auth> | <ssh-client-cert-auth> | |||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</\ | <pinned-client-certs>explicitly-trusted-client-certs</\ | |||
pinned-client-certs> | \pinned-client-certs> | |||
</client-cert-auth> | </ssh-client-cert-auth> | |||
</ssh> | </ssh> | |||
</endpoint> | </endpoint> | |||
</endpoints> | </endpoints> | |||
<connection-type> | <connection-type> | |||
<periodic> | <periodic> | |||
<idle-timeout>300</idle-timeout> | <idle-timeout>300</idle-timeout> | |||
<period>60</period> | <period>60</period> | |||
</periodic> | </periodic> | |||
</connection-type> | </connection-type> | |||
<reconnect-strategy> | <reconnect-strategy> | |||
<start-with>last-connected</start-with> | <start-with>last-connected</start-with> | |||
<max-attempts>3</max-attempts> | <max-attempts>3</max-attempts> | |||
</reconnect-strategy> | </reconnect-strategy> | |||
</netconf-client> | </netconf-client> | |||
<netconf-client> <!-- TLS-based client --> | <netconf-client> <!-- TLS-based client --> | |||
<name>data-collector</name> | <name>data-collector</name> | |||
<endpoints> | <endpoints> | |||
<endpoint> | <endpoint> | |||
<name>east-data-center</name> | <name>east-data-center</name> | |||
<tls> | <tls> | |||
<address>east.analytics.example.com</address> | <remote-address>east.analytics.example.com</remote-addre\ | |||
<server-identity> | \ss> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | <tls-server-identity> | |||
crypto-types">ct:rsa2048</algorithm> | <local-definition> | |||
<private-key>base64encodedvalue==</private-key> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:iet\ | |||
<public-key>base64encodedvalue==</public-key> | \f-crypto-types">ct:rsa2048</algorithm> | |||
<cert>base64encodedvalue==</cert> | <private-key>base64encodedvalue==</private-key> | |||
</server-identity> | <public-key>base64encodedvalue==</public-key> | |||
<client-auth> | <cert>base64encodedvalue==</cert> | |||
</local-definition> | ||||
</tls-server-identity> | ||||
<tls-client-auth> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</\ | <pinned-client-certs>explicitly-trusted-client-certs</\ | |||
pinned-client-certs> | \pinned-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
<cert-to-name> | <cert-to-name> | |||
<id>2</id> | <id>2</id> | |||
<fingerprint>B3:4F:A1:8C:54</fingerprint> | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |||
<map-type>x509c2n:specified</map-type> | <map-type>x509c2n:specified</map-type> | |||
<name>scooby-doo</name> | <name>scooby-doo</name> | |||
</cert-to-name> | </cert-to-name> | |||
</cert-maps> | </cert-maps> | |||
</client-auth> | </tls-client-auth> | |||
<tcp-keepalives> | ||||
<idle-time>15</idle-time> | ||||
<max-probes>3</max-probes> | ||||
<probe-interval>30</probe-interval> | ||||
</tcp-keepalives> | ||||
<tls-keepalives> | ||||
<max-wait>30</max-wait> | ||||
<max-attempts>3</max-attempts> | ||||
</tls-keepalives> | ||||
</tls> | </tls> | |||
</endpoint> | </endpoint> | |||
<endpoint> | <endpoint> | |||
<name>west-data-center</name> | <name>west-data-center</name> | |||
<tls> | <tls> | |||
<address>west.analytics.example.com</address> | <remote-address>west.analytics.example.com</remote-addre\ | |||
<server-identity> | \ss> | |||
<algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:ietf-\ | <tls-server-identity> | |||
crypto-types">ct:rsa2048</algorithm> | <local-definition> | |||
<private-key>base64encodedvalue==</private-key> | <algorithm xmlns:ct="urn:ietf:params:xml:ns:yang:iet\ | |||
<public-key>base64encodedvalue==</public-key> | \f-crypto-types">ct:rsa2048</algorithm> | |||
<cert>base64encodedvalue==</cert> | <private-key>base64encodedvalue==</private-key> | |||
</server-identity> | <public-key>base64encodedvalue==</public-key> | |||
<client-auth> | <cert>base64encodedvalue==</cert> | |||
</local-definition> | ||||
</tls-server-identity> | ||||
<tls-client-auth> | ||||
<pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | <pinned-ca-certs>explicitly-trusted-client-ca-certs</p\ | |||
inned-ca-certs> | \inned-ca-certs> | |||
<pinned-client-certs>explicitly-trusted-client-certs</\ | <pinned-client-certs>explicitly-trusted-client-certs</\ | |||
pinned-client-certs> | \pinned-client-certs> | |||
<cert-maps> | <cert-maps> | |||
<cert-to-name> | <cert-to-name> | |||
<id>1</id> | <id>1</id> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
<map-type>x509c2n:san-any</map-type> | <map-type>x509c2n:san-any</map-type> | |||
</cert-to-name> | </cert-to-name> | |||
<cert-to-name> | <cert-to-name> | |||
<id>2</id> | <id>2</id> | |||
<fingerprint>B3:4F:A1:8C:54</fingerprint> | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |||
<map-type>x509c2n:specified</map-type> | <map-type>x509c2n:specified</map-type> | |||
<name>scooby-doo</name> | <name>scooby-doo</name> | |||
</cert-to-name> | </cert-to-name> | |||
</cert-maps> | </cert-maps> | |||
</client-auth> | </tls-client-auth> | |||
<tcp-keepalives> | ||||
<idle-time>15</idle-time> | ||||
<max-probes>3</max-probes> | ||||
<probe-interval>30</probe-interval> | ||||
</tcp-keepalives> | ||||
<tls-keepalives> | ||||
<max-wait>30</max-wait> | ||||
<max-attempts>3</max-attempts> | ||||
</tls-keepalives> | ||||
</tls> | </tls> | |||
</endpoint> | </endpoint> | |||
</endpoints> | </endpoints> | |||
<connection-type> | <connection-type> | |||
<persistent> | <persistent/> | |||
<keep-alives> | ||||
<max-wait>30</max-wait> | ||||
<max-attempts>3</max-attempts> | ||||
</keep-alives> | ||||
</persistent> | ||||
</connection-type> | </connection-type> | |||
<reconnect-strategy> | <reconnect-strategy> | |||
<start-with>first-listed</start-with> | <start-with>first-listed</start-with> | |||
<max-attempts>3</max-attempts> | <max-attempts>3</max-attempts> | |||
</reconnect-strategy> | </reconnect-strategy> | |||
</netconf-client> | </netconf-client> | |||
</call-home> | </call-home> | |||
</netconf-server> | </netconf-server> | |||
4.3. YANG Module | 4.3. YANG Module | |||
This YANG module has normative references to [RFC6242], [RFC6991], | This YANG module has normative references to [RFC6242], [RFC6991], | |||
[RFC7407], [RFC7589], [RFC8071], | [RFC7407], [RFC7589], [RFC8071], | |||
[I-D.kwatsen-netconf-tcp-client-server], | ||||
[I-D.ietf-netconf-ssh-client-server], and | [I-D.ietf-netconf-ssh-client-server], and | |||
[I-D.ietf-netconf-tls-client-server]. | [I-D.ietf-netconf-tls-client-server]. | |||
This YANG module imports YANG types from [RFC6991], and YANG | This YANG module imports YANG types from [RFC6991], and YANG | |||
groupings from [RFC7407], [I-D.ietf-netconf-ssh-client-server] and | groupings from [RFC7407], [I-D.ietf-netconf-ssh-client-server] and | |||
[I-D.ietf-netconf-ssh-client-server]. | [I-D.ietf-netconf-ssh-client-server]. | |||
<CODE BEGINS> file "ietf-netconf-server@2018-10-22.yang" | <CODE BEGINS> file "ietf-netconf-server@2019-03-09.yang" | |||
module ietf-netconf-server { | module ietf-netconf-server { | |||
yang-version 1.1; | yang-version 1.1; | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | |||
prefix "ncs"; | prefix "ncs"; | |||
import ietf-yang-types { | import ietf-yang-types { | |||
prefix yang; | prefix yang; | |||
reference | reference | |||
"RFC 6991: Common YANG Data Types"; | "RFC 6991: Common YANG Data Types"; | |||
} | } | |||
import ietf-inet-types { | ||||
prefix inet; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-x509-cert-to-name { | import ietf-x509-cert-to-name { | |||
prefix x509c2n; | prefix x509c2n; | |||
reference | reference | |||
"RFC 7407: A YANG Data Model for SNMP Configuration"; | "RFC 7407: A YANG Data Model for SNMP Configuration"; | |||
} | } | |||
import ietf-tcp-client { | ||||
prefix tcpc; | ||||
reference | ||||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | ||||
} | ||||
import ietf-tcp-server { | ||||
prefix tcps; | ||||
reference | ||||
"RFC AAAA: YANG Groupings for TCP Clients and TCP Servers"; | ||||
} | ||||
import ietf-ssh-server { | import ietf-ssh-server { | |||
prefix ss; | prefix sshs; | |||
revision-date 2018-10-22; // stable grouping definitions | revision-date 2019-03-09; // stable grouping definitions | |||
reference | reference | |||
"RFC YYYY: YANG Groupings for SSH Clients and SSH Servers"; | "RFC YYYY: YANG Groupings for SSH Clients and SSH Servers"; | |||
} | } | |||
import ietf-tls-server { | import ietf-tls-server { | |||
prefix ts; | prefix tlss; | |||
revision-date 2018-10-22; // stable grouping definitions | revision-date 2019-03-09; // stable grouping definitions | |||
reference | reference | |||
"RFC ZZZZ: YANG Groupings for TLS Clients and TLS Servers"; | "RFC ZZZZ: YANG Groupings for TLS Clients and TLS Servers"; | |||
} | } | |||
organization | organization | |||
"IETF NETCONF (Network Configuration) Working Group"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
contact | contact | |||
"WG Web: <http://datatracker.ietf.org/wg/netconf/> | "WG Web: <http://datatracker.ietf.org/wg/netconf/> | |||
WG List: <mailto:netconf@ietf.org> | WG List: <mailto:netconf@ietf.org> | |||
Author: Kent Watsen <mailto:kent+ietf@watsen.net> | ||||
Author: Kent Watsen | Author: Gary Wu <mailto:garywu@cisco.com> | |||
<mailto:kwatsen@juniper.net> | ||||
Author: Gary Wu | ||||
<mailto:garywu@cisco.com> | ||||
Author: Juergen Schoenwaelder | Author: Juergen Schoenwaelder | |||
<mailto:j.schoenwaelder@jacobs-university.de>"; | <mailto:j.schoenwaelder@jacobs-university.de>"; | |||
description | description | |||
"This module contains a collection of YANG definitions for | "This module contains a collection of YANG definitions for | |||
configuring NETCONF servers. | configuring NETCONF servers. | |||
Copyright (c) 2017 IETF Trust and the persons identified as | 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 [RFC2119] | ||||
[RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
Copyright (c) 2019 IETF Trust and the persons identified as | ||||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Simplified BSD | to the license terms contained in, the Simplified BSD | |||
License set forth in Section 4.c of the IETF Trust's | License set forth in Section 4.c of the IETF Trust's | |||
Legal Provisions Relating to IETF Documents | Legal Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see | This version of this YANG module is part of RFC XXXX; see | |||
the RFC itself for full legal notices."; | the RFC itself for full legal notices."; | |||
revision "2018-10-22" { | revision "2019-03-09" { | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC XXXX: NETCONF Client and Server Models"; | "RFC XXXX: NETCONF Client and Server Models"; | |||
} | } | |||
// Features | // Features | |||
feature listen { | feature listen { | |||
description | description | |||
skipping to change at page 40, line 21 ¶ | skipping to change at page 42, line 49 ¶ | |||
feature tls-call-home { | feature tls-call-home { | |||
description | description | |||
"The 'tls-call-home' feature indicates that the NETCONF | "The 'tls-call-home' feature indicates that the NETCONF | |||
server supports initiating a NETCONF over TLS call | server supports initiating a NETCONF over TLS call | |||
home connection to NETCONF clients."; | home connection to NETCONF clients."; | |||
reference | reference | |||
"RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | "RFC 8071: NETCONF Call Home and RESTCONF Call Home"; | |||
} | } | |||
// protocol accessible nodes | // Groupings | |||
container netconf-server { | ||||
uses netconf-server-grouping; | ||||
description | ||||
"Top-level container for NETCONF server configuration."; | ||||
} | ||||
// reusable groupings | ||||
grouping netconf-server-grouping { | grouping netconf-server-grouping { | |||
description | description | |||
"Top-level grouping for NETCONF server configuration."; | "Top-level grouping for NETCONF server configuration."; | |||
container listen { | container listen { | |||
if-feature listen; | if-feature listen; | |||
presence "Enables server to listen for TCP connections"; | presence "Enables server to listen for TCP connections"; | |||
description "Configures listen behavior"; | description "Configures listen behavior"; | |||
leaf idle-timeout { | leaf idle-timeout { | |||
type uint16; | type uint16; | |||
skipping to change at page 41, line 24 ¶ | skipping to change at page 43, line 43 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature ssh-listen; | if-feature ssh-listen; | |||
container ssh { | container ssh { | |||
description | description | |||
"SSH-specific listening configuration for inbound | "SSH-specific listening configuration for inbound | |||
connections."; | connections."; | |||
leaf address { | uses tcps:tcp-server-grouping { | |||
type inet:ip-address; | refine "local-port" { | |||
mandatory true; | default 830; | |||
description | description | |||
"The IP address to listen on for incoming | "The NETCONF server will listen on the IANA- | |||
connections. The NETCONF server will listen | assigned well-known port value for 'netconf-ssh' | |||
on all configured interfaces if no value is | (830) if no value is specified."; | |||
specified. INADDR_ANY (0.0.0.0) or INADDR6_ANY | } | |||
(0:0:0:0:0:0:0:0 a.k.a. ::) MUST be used when | ||||
the server is to listen on all IPv4 or IPv6 | ||||
addresses, respectively."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 830; | ||||
description | ||||
"The local port number to listen on. If no value | ||||
is specified, the IANA-assigned port value for | ||||
'netconf-ssh' (830) is used."; | ||||
} | } | |||
uses ss:ssh-server-grouping; | uses sshs:ssh-server-grouping; | |||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature tls-listen; | if-feature tls-listen; | |||
container tls { | container tls { | |||
description | description | |||
"TLS-specific listening configuration for inbound | "TLS-specific listening configuration for inbound | |||
connections."; | connections."; | |||
leaf address { | uses tcps:tcp-server-grouping { | |||
type inet:ip-address; | refine "local-port" { | |||
mandatory true; | default 6513; | |||
description | description | |||
"The IP address to listen on for incoming | "The NETCONF server will listen on the IANA- | |||
connections. The NETCONF server will listen | assigned well-known port value for 'netconf-tls' | |||
on all configured interfaces if no value is | (6513) if no value is specified."; | |||
specified. INADDR_ANY (0.0.0.0) or INADDR6_ANY | } | |||
(0:0:0:0:0:0:0:0 a.k.a. ::) MUST be used when | ||||
the server is to listen on all IPv4 or IPv6 | ||||
addresses, respectively."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 6513; | ||||
description | ||||
"The local port number to listen on. If no value | ||||
is specified, the IANA-assigned port value for | ||||
'netconf-tls' (6513) is used."; | ||||
} | } | |||
uses ts:tls-server-grouping { | uses tlss:tls-server-grouping { | |||
refine "client-auth" { | refine "tls-client-auth" { | |||
must 'pinned-ca-certs or pinned-client-certs'; | must 'pinned-ca-certs or pinned-client-certs'; | |||
description | description | |||
"NETCONF/TLS servers MUST validate client | "NETCONF/TLS servers MUST validate client | |||
certiticates."; | certiticates."; | |||
} | } | |||
augment "client-auth" { | augment "tls-client-auth" { | |||
description | description | |||
"Augments in the cert-to-name structure."; | "Augments in the cert-to-name structure."; | |||
container cert-maps { | container cert-maps { | |||
uses x509c2n:cert-to-name; | uses x509c2n:cert-to-name; | |||
description | description | |||
"The cert-maps container is used by a TLS- | "The cert-maps container is used by a TLS- | |||
based NETCONF server to map the NETCONF | based NETCONF server to map the NETCONF | |||
client's presented X.509 certificate to a | client's presented X.509 certificate to a | |||
NETCONF username. If no matching and valid | NETCONF username. If no matching and valid | |||
cert-to-name list entry can be found, then | cert-to-name list entry can be found, then | |||
skipping to change at page 43, line 51 ¶ | skipping to change at page 45, line 48 ¶ | |||
choice transport { | choice transport { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available transports."; | "Selects between available transports."; | |||
case ssh { | case ssh { | |||
if-feature ssh-call-home; | if-feature ssh-call-home; | |||
container ssh { | container ssh { | |||
description | description | |||
"Specifies SSH-specific call-home transport | "Specifies SSH-specific call-home transport | |||
configuration."; | configuration."; | |||
leaf address { | uses tcpc:tcp-client-grouping { | |||
type inet:host; | refine "remote-port" { | |||
mandatory true; | default 4334; | |||
description | description | |||
"The IP address or hostname of the endpoint. | "The NETCONF server will attempt to connect | |||
If a domain name is configured, then the | to the IANA-assigned well-known port for | |||
DNS resolution should happen on each usage | 'netconf-ch-tls' (4334) if no value is | |||
attempt. If the the DNS resolution results | specified."; | |||
in multiple IP addresses, the IP addresses | } | |||
will be tried according to local preference | ||||
order until a connection has been established | ||||
or until all IP addresses have failed."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 4334; | ||||
description | ||||
"The IP port for this endpoint. The NETCONF | ||||
server will use the IANA-assigned well-known | ||||
port for 'netconf-ch-ssh' (4334) if no value | ||||
is specified."; | ||||
} | } | |||
uses ss:ssh-server-grouping; | uses sshs:ssh-server-grouping; | |||
} | } | |||
} | } | |||
case tls { | case tls { | |||
if-feature tls-call-home; | if-feature tls-call-home; | |||
container tls { | container tls { | |||
description | description | |||
"Specifies TLS-specific call-home transport | "Specifies TLS-specific call-home transport | |||
configuration."; | configuration."; | |||
leaf address { | uses tcpc:tcp-client-grouping { | |||
type inet:host; | refine "remote-port" { | |||
mandatory true; | default 4335; | |||
description | description | |||
"The IP address or hostname of the endpoint. | "The NETCONF server will attempt to connect | |||
If a domain name is configured, then the | to the IANA-assigned well-known port for | |||
DNS resolution should happen on each usage | 'netconf-ch-tls' (4335) if no value is | |||
attempt. If the the DNS resolution results | specified."; | |||
in multiple IP addresses, the IP addresses | } | |||
will be tried according to local preference | ||||
order until a connection has been established | ||||
or until all IP addresses have failed."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
default 4335; | ||||
description | ||||
"The IP port for this endpoint. The NETCONF | ||||
server will use the IANA-assigned well-known | ||||
port for 'netconf-ch-tls' (4335) if no value | ||||
is specified."; | ||||
} | } | |||
uses ts:tls-server-grouping { | uses tlss:tls-server-grouping { | |||
refine "client-auth" { | refine "tls-client-auth" { | |||
must 'pinned-ca-certs or pinned-client-certs'; | must 'pinned-ca-certs or pinned-client-certs'; | |||
description | description | |||
"NETCONF/TLS servers MUST validate client | "NETCONF/TLS servers MUST validate client | |||
certiticates."; | certiticates."; | |||
} | } | |||
augment "client-auth" { | augment "tls-client-auth" { | |||
description | description | |||
"Augments in the cert-to-name structure."; | "Augments in the cert-to-name structure."; | |||
container cert-maps { | container cert-maps { | |||
uses x509c2n:cert-to-name; | uses x509c2n:cert-to-name; | |||
description | description | |||
"The cert-maps container is used by a | "The cert-maps container is used by a | |||
TLS-based NETCONF server to map the | TLS-based NETCONF server to map the | |||
NETCONF client's presented X.509 | NETCONF client's presented X.509 | |||
certificate to a NETCONF username. If | certificate to a NETCONF username. If | |||
no matching and valid cert-to-name list | no matching and valid cert-to-name list | |||
skipping to change at page 45, line 31 ¶ | skipping to change at page 47, line 4 ¶ | |||
TLS-based NETCONF server to map the | TLS-based NETCONF server to map the | |||
NETCONF client's presented X.509 | NETCONF client's presented X.509 | |||
certificate to a NETCONF username. If | certificate to a NETCONF username. If | |||
no matching and valid cert-to-name list | no matching and valid cert-to-name list | |||
entry can be found, then the NETCONF | entry can be found, then the NETCONF | |||
server MUST close the connection, and | server MUST close the connection, and | |||
MUST NOT accept NETCONF messages over | MUST NOT accept NETCONF messages over | |||
it."; | it."; | |||
reference | reference | |||
"RFC WWWW: NETCONF over TLS, Section 7"; | "RFC WWWW: NETCONF over TLS, Section 7"; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} // end tls | } // tls | |||
} // end choice | } // choice | |||
} // end endpoint | } // endpoint | |||
} | } // endpoints | |||
container connection-type { | container connection-type { | |||
description | description | |||
"Indicates the kind of connection to use."; | "Indicates the NETCONF server's preference for how the | |||
NETCONF connection is maintained."; | ||||
choice connection-type { | choice connection-type { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Selects between available connection types."; | "Selects between available connection types."; | |||
case persistent-connection { | case persistent-connection { | |||
container persistent { | container persistent { | |||
presence | presence | |||
"Indicates that a persistent connection is to be | "Indicates that a persistent connection is to be | |||
maintained."; | maintained."; | |||
description | description | |||
"Maintain a persistent connection to the NETCONF | "Maintain a persistent connection to the NETCONF | |||
client. If the connection goes down, immediately | client. If the connection goes down, immediately | |||
start trying to reconnect to it, using the | start trying to reconnect to it, using the | |||
reconnection strategy. | reconnection strategy. | |||
This connection type minimizes any NETCONF client | This connection type minimizes any NETCONF client | |||
to NETCONF server data-transfer delay, albeit at | to NETCONF server data-transfer delay, albeit at | |||
the expense of holding resources longer."; | the expense of holding resources longer."; | |||
container keep-alives { | } // container persistent | |||
description | } // case persistent-connection | |||
"Configures the keep-alive policy, to | ||||
proactively test the aliveness of the SSH/TLS | ||||
client. An unresponsive SSH/TLS client will | ||||
be dropped after approximately max-attempts * | ||||
max-wait seconds."; | ||||
reference | ||||
"RFC 8071: NETCONF Call Home and RESTCONF | ||||
Call Home, Section 4.1, item S7"; | ||||
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 SSH/TLS client, a SSH/TLS-level message | ||||
will be sent to test the aliveness of the | ||||
SSH/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 SSH/TLS client before | ||||
assuming the SSH/TLS client is no longer | ||||
alive."; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
case periodic-connection { | case periodic-connection { | |||
container periodic { | container periodic { | |||
presence | presence | |||
"Indicates that a periodic connection is to be | "Indicates that a periodic connection is to be | |||
maintained."; | maintained."; | |||
description | description | |||
"Periodically connect to the NETCONF client. The | "Periodically connect to the NETCONF client. The | |||
NETCONF client should close the underlying TLS | NETCONF client should close the underlying TLS | |||
connection upon completing planned activities. | connection upon completing planned activities. | |||
skipping to change at page 47, line 49 ¶ | skipping to change at page 48, line 37 ¶ | |||
units "seconds"; | units "seconds"; | |||
default 120; // two minutes | default 120; // two minutes | |||
description | description | |||
"Specifies the maximum number of seconds that | "Specifies the maximum number of seconds that | |||
a NETCONF session may remain idle. A NETCONF | a NETCONF session may remain idle. A NETCONF | |||
session will be dropped if it is idle for an | session will be dropped if it is idle for an | |||
interval longer than this number of seconds. | interval longer than this number of seconds. | |||
If set to zero, then the server will never | If set to zero, then the server will never | |||
drop a session because it is idle."; | drop a session because it is idle."; | |||
} | } | |||
} | } // container periodic | |||
} | } // case periodic-connection | |||
} | } // choice connection-type | |||
} // container connection-type | ||||
} | ||||
container reconnect-strategy { | container reconnect-strategy { | |||
description | description | |||
"The reconnection strategy directs how a NETCONF server | "The reconnection strategy directs how a NETCONF server | |||
reconnects to a NETCONF client, after discovering its | reconnects to a NETCONF client, after discovering its | |||
connection to the client has dropped, even if due to a | connection to the client has dropped, even if due to a | |||
reboot. The NETCONF server starts with the specified | reboot. The NETCONF server starts with the specified | |||
endpoint and tries to connect to it max-attempts times | endpoint and tries to connect to it max-attempts times | |||
before trying the next endpoint in the list (round | before trying the next endpoint in the list (round | |||
robin)."; | robin)."; | |||
leaf start-with { | leaf start-with { | |||
skipping to change at page 49, line 4 ¶ | skipping to change at page 49, line 40 ¶ | |||
leaf max-attempts { | leaf max-attempts { | |||
type uint8 { | type uint8 { | |||
range "1..max"; | range "1..max"; | |||
} | } | |||
default 3; | default 3; | |||
description | description | |||
"Specifies the number times the NETCONF server tries | "Specifies the number times the NETCONF server tries | |||
to connect to a specific endpoint before moving on | to connect to a specific endpoint before moving on | |||
to the next endpoint in the list (round robin)."; | to the next endpoint in the list (round robin)."; | |||
} | } | |||
} // container reconnect-strategy | ||||
} // list netconf-client | ||||
} // container call-home | ||||
} // grouping netconf-server-grouping | ||||
// Protocol accessible node, for servers that *implement* | ||||
// this module. | ||||
container netconf-server { | ||||
uses netconf-server-grouping; | ||||
description | ||||
"Top-level container for NETCONF server configuration."; | ||||
} | ||||
} | ||||
} | ||||
} | } | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
5. Design Considerations | 5. Design Considerations | |||
Editorial: this section is a hold over from before, previously called | Editorial: this section is a hold over from before, previously called | |||
"Objectives". It was only written two support the "server" (not the | "Objectives". It was only written two support the "server" (not the | |||
"client"). The question is if it's better to add the missing | "client"). The question is if it's better to add the missing | |||
"client" parts, or remove this section altogether. | "client" parts, or remove this section altogether. | |||
skipping to change at page 53, line 35 ¶ | skipping to change at page 54, line 35 ¶ | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-server | namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-server | |||
prefix: ncs | prefix: ncs | |||
reference: RFC XXXX | reference: RFC XXXX | |||
8. References | 8. References | |||
8.1. Normative References | 8.1. Normative References | |||
[I-D.ietf-netconf-keystore] | [I-D.ietf-netconf-keystore] | |||
Watsen, K., "YANG Data Model for a Centralized Keystore | Watsen, K., "YANG Data Model for a Centralized Keystore | |||
Mechanism", draft-ietf-netconf-keystore-06 (work in | Mechanism", draft-ietf-netconf-keystore-08 (work in | |||
progress), September 2018. | progress), March 2019. | |||
[I-D.ietf-netconf-ssh-client-server] | [I-D.ietf-netconf-ssh-client-server] | |||
Watsen, K. and G. Wu, "YANG Groupings for SSH Clients and | Watsen, K., Wu, G., and L. Xia, "YANG Groupings for SSH | |||
SSH Servers", draft-ietf-netconf-ssh-client-server-07 | Clients and SSH Servers", draft-ietf-netconf-ssh-client- | |||
(work in progress), September 2018. | server-08 (work in progress), October 2018. | |||
[I-D.ietf-netconf-tls-client-server] | [I-D.ietf-netconf-tls-client-server] | |||
Watsen, K. and G. Wu, "YANG Groupings for TLS Clients and | Watsen, K., Wu, G., and L. Xia, "YANG Groupings for TLS | |||
TLS Servers", draft-ietf-netconf-tls-client-server-07 | Clients and TLS Servers", draft-ietf-netconf-tls-client- | |||
(work in progress), September 2018. | server-08 (work in progress), October 2018. | |||
[I-D.kwatsen-netconf-tcp-client-server] | ||||
Watsen, K., "YANG Groupings for TCP Clients and TCP | ||||
Servers", draft-kwatsen-netconf-tcp-client-server-00 (work | ||||
in progress), March 2019. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | |||
the Network Configuration Protocol (NETCONF)", RFC 6020, | the Network Configuration Protocol (NETCONF)", RFC 6020, | |||
DOI 10.17487/RFC6020, October 2010, | DOI 10.17487/RFC6020, October 2010, | |||
<https://www.rfc-editor.org/info/rfc6020>. | <https://www.rfc-editor.org/info/rfc6020>. | |||
skipping to change at page 56, line 19 ¶ | skipping to change at page 57, line 19 ¶ | |||
o Renamed "keychain" to "keystore". | o Renamed "keychain" to "keystore". | |||
A.2. 01 to 02 | A.2. 01 to 02 | |||
o Added to ietf-netconf-client ability to connected to a cluster of | o Added to ietf-netconf-client ability to connected to a cluster of | |||
endpoints, including a reconnection-strategy. | endpoints, including a reconnection-strategy. | |||
o Added to ietf-netconf-client the ability to configure connection- | o Added to ietf-netconf-client the ability to configure connection- | |||
type and also keep-alive strategy. | type and also keep-alive strategy. | |||
o Updated both modules to accomodate new groupings in the ssh/tls | o Updated both modules to accommodate new groupings in the ssh/tls | |||
drafts. | drafts. | |||
A.3. 02 to 03 | A.3. 02 to 03 | |||
o Refined use of tls-client-grouping to add a must statement | o Refined use of tls-client-grouping to add a must statement | |||
indicating that the TLS client must specify a client-certificate. | indicating that the TLS client must specify a client-certificate. | |||
o Changed 'netconf-client' to be a grouping (not a container). | o Changed 'netconf-client' to be a grouping (not a container). | |||
A.4. 03 to 04 | A.4. 03 to 04 | |||
skipping to change at page 57, line 33 ¶ | skipping to change at page 58, line 33 ¶ | |||
o Reduced the periodic-connection's "idle-timeout" from 5 to 2 | o Reduced the periodic-connection's "idle-timeout" from 5 to 2 | |||
minutes. | minutes. | |||
o Replaced reconnect-timeout with period/anchor-time combo. | o Replaced reconnect-timeout with period/anchor-time combo. | |||
A.8. 07 to 08 | A.8. 07 to 08 | |||
o Modified examples to be compatible with new crypto-types algs | o Modified examples to be compatible with new crypto-types algs | |||
Appendix B. 08 to 09 | ||||
o Corrected use of "mandatory true" for "address" leafs. | ||||
o Updated examples to reflect update to groupings defined in the | ||||
keystore draft. | ||||
o Updated to use groupings defined in new TCP and HTTP drafts. | ||||
o Updated copyright date, boilerplate template, affiliation, and | ||||
folding algorithm. | ||||
Acknowledgements | Acknowledgements | |||
The authors would like to thank for following for lively discussions | The authors would like to thank for following for lively discussions | |||
on list and in the halls (ordered by last name): Andy Bierman, Martin | on list and in the halls (ordered by last name): Andy Bierman, Martin | |||
Bjorklund, Benoit Claise, Mehmet Ersue, Balazs Kovacs, David | Bjorklund, Benoit Claise, Ramkumar Dhanapal, Mehmet Ersue, Balazs | |||
Lamparter, Alan Luchuk, Ladislav Lhotka, Radek Krejci, Tom Petch, | Kovacs, David Lamparter, Alan Luchuk, Ladislav Lhotka, Radek Krejci, | |||
Juergen Schoenwaelder, Phil Shafer, Sean Turner, and Bert Wijnen. | Tom Petch, Juergen Schoenwaelder, Phil Shafer, Sean Turner, and Bert | |||
Wijnen. | ||||
Author's Address | Author's Address | |||
Kent Watsen | Kent Watsen | |||
Juniper Networks | Watsen Networks | |||
EMail: kwatsen@juniper.net | EMail: kent+ietf@watsen.net | |||
End of changes. 177 change blocks. | ||||
955 lines changed or deleted | 1022 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |