rfc8886v2.xml   rfc8886.xml 
skipping to change at line 40 skipping to change at line 40
<postal> <postal>
<street>1133 Innovation Way</street> <street>1133 Innovation Way</street>
<city>Sunnyvale</city> <city>Sunnyvale</city>
<region>CA</region> <region>CA</region>
<code>94089</code> <code>94089</code>
<country>United States of America</country> <country>United States of America</country>
</postal> </postal>
<email>cdoyle@juniper.net</email> <email>cdoyle@juniper.net</email>
</address> </address>
</author> </author>
<date month="August" year="2020"/> <date month="September" year="2020"/>
<keyword>autoboot</keyword> <keyword>autoboot</keyword>
<keyword>auto-boot</keyword> <keyword>auto-boot</keyword>
<keyword>autoinstall</keyword> <keyword>autoinstall</keyword>
<keyword>tftp</keyword> <keyword>tftp</keyword>
<keyword>install</keyword> <keyword>install</keyword>
<keyword>bunny</keyword> <keyword>bunny</keyword>
<abstract> <abstract>
skipping to change at line 214 skipping to change at line 214
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Device Key Generation</name> <name>Device Key Generation</name>
<t>Each device requires a public-private key pair and for the <t>Each device requires a public-private key pair and for the
public part to be published and retrievable by the operator. The public part to be published and retrievable by the operator. The
cryptographic algorithm and key lengths to be used are out of the scope cryptographic algorithm and key lengths to be used are out of the scope
of this document. This section illustrates one method, but, as with of this document. This section illustrates one method, but, as with
much of this document, the exact mechanism may vary by vendor. much of this document, the exact mechanism may vary by vendor.
Enrollment over Secure Transport <xref target="RFC7030" Enrollment over Secure Transport <xref target="RFC7030"
format="default"/> and possibly the Simple Certificate Enrollment format="default"/> and possibly the Simple Certificate Enrollment
Protocol <xref target="I-D.gutmann-scep" format="default"/> are Protocol <xref target="RFC8894" format="default"/> are
methods that vendors may want to consider.</t> methods that vendors may want to consider.</t>
<t>During the manufacturing stage, when the device is initially powered <t>During the manufacturing stage, when the device is initially powered
on, it will generate a public-private key pair. It will send its unique device on, it will generate a public-private key pair. It will send its unique device
identifier and the public key to the vendor's directory server identifier and the public key to the vendor's directory server
<xref target="RFC5280" format="default"/> to be published. The vendor's directory server <xref target="RFC5280" format="default"/> to be published. The vendor's directory server
should only accept certificates that are from the manufacturing should only accept certificates that are from the manufacturing
facility and that match vendor-defined policies (for example, extended facility and that match vendor-defined policies (for example, extended
key usage and extensions). key usage and extensions).
Note that some devices may be constrained and so may send Note that some devices may be constrained and so may send
skipping to change at line 522 skipping to change at line 522
<t>Even when using a secure bootstrap mechanism, security-conscious <t>Even when using a secure bootstrap mechanism, security-conscious
operators may wish to bootstrap devices with a minimal or less-sensitive operators may wish to bootstrap devices with a minimal or less-sensitive
configuration and then replace this with a more complete one after configuration and then replace this with a more complete one after
install.</t> install.</t>
</section> </section>
</middle> </middle>
<back> <back>
<displayreference target="I-D.ietf-anima-bootstrapping-keyinfra" to="BRSKI"/> <displayreference target="I-D.ietf-anima-bootstrapping-keyinfra" to="BRSKI"/>
<displayreference target="I-D.gutmann-scep" to="SCEP"/>
<displayreference target="I-D.ietf-opsawg-tacacs" to="TACACS"/> <displayreference target="I-D.ietf-opsawg-tacacs" to="TACACS"/>
<references> <references>
<name>Informative References</name> <name>Informative References</name>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8572.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8572.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4122.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4122.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2131.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2131.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8415.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8415.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2865.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2865.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1350.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1350.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8551.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8551.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7030.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7030.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/> <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8894.xml"/>
<xi:include
href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.gutmann-scep.xml"/>
<reference anchor='I-D.ietf-opsawg-tacacs'> <reference anchor='I-D.ietf-opsawg-tacacs'>
<front> <front>
<title>The TACACS+ Protocol</title> <title>The TACACS+ Protocol</title>
<author initials='T' surname='Dahm' fullname='Thorsten Dahm'> <author initials='T' surname='Dahm' fullname='Thorsten Dahm'>
<organization /> <organization />
</author> </author>
<author initials='A' surname='Ota' fullname='Andrej Ota'> <author initials='A' surname='Ota' fullname='Andrej Ota'>
skipping to change at line 613 skipping to change at line 611
in production.</t> in production.</t>
<t>It uses OpenSSL from the command line. In production, something more <t>It uses OpenSSL from the command line. In production, something more
automated would be used. In this example, the unique device identifier is the automated would be used. In this example, the unique device identifier is the
serial number of the router, SN19842256.</t> serial number of the router, SN19842256.</t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 1: Generating the Certificate</name> <name>Step 1: Generating the Certificate</name>
<t>This step is performed by the router. It generates a key, then a <t>This step is performed by the router. It generates a key, then a
Certificate Signing Request (CSR), and then a self-signed certificate.</t> Certificate Signing Request (CSR), and then a self-signed certificate.</t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 1.1: Generate the Private Key</name> <name>Step 1.1: Generate the Private Key</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl ecparam -out privatekey.key -name prime256v1 -genkey $ openssl ecparam -out privatekey.key -name prime256v1 -genkey
$ $
]]></artwork> ]]></sourcecode>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 1.2: Generate the Certificate Signing Request</name> <name>Step 1.2: Generate the Certificate Signing Request</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl req -new -key key.pem -out SN19842256.csr $ openssl req -new -key key.pem -out SN19842256.csr
Common Name (e.g., server FQDN or YOUR name) []:SN19842256 Common Name (e.g., server FQDN or YOUR name) []:SN19842256
]]></artwork> ]]></sourcecode>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 1.3: Generate the (Self-Signed) Certificate Itself</name> <name>Step 1.3: Generate the (Self-Signed) Certificate Itself</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl req -x509 -days 36500 -key key.pem -in SN19842256.csr $ openssl req -x509 -days 36500 -key key.pem -in SN19842256.csr
-out SN19842256.crt -out SN19842256.crt
]]></artwork> ]]></sourcecode>
<t>The router then sends the key to the vendor's key server for <t>The router then sends the key to the vendor's key server for
publication (not shown).</t> publication (not shown).</t>
</section> </section>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 2: Generating the Encrypted Configuration</name> <name>Step 2: Generating the Encrypted Configuration</name>
<t>The operator now wants to deploy the new router.</t> <t>The operator now wants to deploy the new router.</t>
<t>They generate the initial configuration (using whatever magic tool <t>They generate the initial configuration (using whatever magic tool
generates router configs!), fetch the router's certificate, and generates router configs!), fetch the router's certificate, and
encrypt the configuration file to that key. This is done by the operator.</t> encrypt the configuration file to that key. This is done by the operator.</t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 2.1: Fetch the Certificate</name> <name>Step 2.1: Fetch the Certificate</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ wget http://keyserv.example.net/certificates/SN19842256.crt $ wget http://keyserv.example.net/certificates/SN19842256.crt
]]></artwork> ]]></sourcecode>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 2.2: Encrypt the Configuration File</name> <name>Step 2.2: Encrypt the Configuration File</name>
<t>S/MIME is used here because it is simple to demonstrate. This is <t>S/MIME is used here because it is simple to demonstrate. This is
almost definitely not the best way to do this.</t> almost definitely not the best way to do this.</t>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl smime -encrypt -aes-256-cbc -in SN19842256.cfg\ $ openssl smime -encrypt -aes-256-cbc -in SN19842256.cfg\
-out SN19842256.enc -outform PEM SN19842256.crt -out SN19842256.enc -outform PEM SN19842256.crt
$ more SN19842256.enc $ more SN19842256.enc
-----BEGIN PKCS7----- -----BEGIN PKCS7-----
MIICigYJKoZIhvcNAQcDoIICezCCAncCAQAxggE+MIIBOgIBADAiMBUxEzARBgNV MIICigYJKoZIhvcNAQcDoIICezCCAncCAQAxggE+MIIBOgIBADAiMBUxEzARBgNV
BAMMClNOMTk4NDIyNTYCCQDJVuBlaTOb1DANBgkqhkiG9w0BAQEFAASCAQBABvM3 BAMMClNOMTk4NDIyNTYCCQDJVuBlaTOb1DANBgkqhkiG9w0BAQEFAASCAQBABvM3
... ...
LZoq08jqlWhZZWhTKs4XPGHUdmnZRYIP8KXyEtHt LZoq08jqlWhZZWhTKs4XPGHUdmnZRYIP8KXyEtHt
-----END PKCS7----- -----END PKCS7-----
]]></artwork> ]]></sourcecode>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 2.3: Copy Configuration to the Configuration Server</name> <name>Step 2.3: Copy Configuration to the Configuration Server</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ scp SN19842256.enc config.example.com:/tftpboot $ scp SN19842256.enc config.example.com:/tftpboot
]]></artwork> ]]></sourcecode>
</section> </section>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 3: Decrypting and Using the Configuration</name> <name>Step 3: Decrypting and Using the Configuration</name>
<t>When the router connects to the operator's network, it will detect <t>When the router connects to the operator's network, it will detect
that it does not have a valid configuration file and will start the that it does not have a valid configuration file and will start the
"autoboot" process. This is a well-documented process, but "autoboot" process. This is a well-documented process, but
the high-level overview is that it will use DHCP to obtain an IP the high-level overview is that it will use DHCP to obtain an IP
address and configuration server. It will then use TFTP to download a address and configuration server. It will then use TFTP to download a
configuration file, based upon its serial number (this document configuration file, based upon its serial number (this document
modifies the solution to fetch an encrypted configuration file (ending in modifies the solution to fetch an encrypted configuration file (ending in
.enc)). It will then decrypt the configuration file and install it.</t> .enc)). It will then decrypt the configuration file and install it.</t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 3.1: Fetch Encrypted Configuration File from Configuration Server</name> <name>Step 3.1: Fetch Encrypted Configuration File from Configuration Server</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ tftp 2001:0db8::23 -c get SN19842256.enc $ tftp 2001:0db8::23 -c get SN19842256.enc
]]></artwork> ]]></sourcecode>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Step 3.2: Decrypt and Use the Configuration</name> <name>Step 3.2: Decrypt and Use the Configuration</name>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\ $ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\
-out config.cfg -inkey key.pem -out config.cfg -inkey key.pem
]]></artwork> ]]></sourcecode>
<t>If an attacker does not have the correct key, they will not be <t>If an attacker does not have the correct key, they will not be
able to decrypt the configuration file:</t> able to decrypt the configuration file:</t>
<artwork name="" type="" align="left" alt=""><![CDATA[ <sourcecode name="" type=""><![CDATA[
$ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\ $ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\
-out config.cfg -inkey wrongkey.pem -out config.cfg -inkey wrongkey.pem
Error decrypting PKCS#7 structure Error decrypting PKCS#7 structure
140352450692760:error:06065064:digital envelope 140352450692760:error:06065064:digital envelope
routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592: routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592:
$ echo $? $ echo $?
4]]></artwork> 4]]></sourcecode>
</section> </section>
</section> </section>
</section> </section>
<section numbered="false" toc="default"> <section numbered="false" toc="default">
<name>Acknowledgments</name> <name>Acknowledgments</name>
<t>The authors wish to thank everyone who contributed, including <t>The authors wish to thank everyone who contributed, including
<contact fullname="Benoit Claise"/>, <contact fullname="Francis <contact fullname="Benoit Claise"/>, <contact fullname="Francis
Dupont"/>, <contact fullname="Mirja Kuehlewind"/>, <contact Dupont"/>, <contact fullname="Mirja Kuehlewind"/>, <contact
fullname="Sam Ribeiro"/>, <contact fullname="Michael Richardson"/>, fullname="Sam Ribeiro"/>, <contact fullname="Michael Richardson"/>,
<contact fullname="Sean Turner"/>, and <contact fullname="Kent <contact fullname="Sean Turner"/>, and <contact fullname="Kent
 End of changes. 21 change blocks. 
26 lines changed or deleted 24 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/