Yesterday I showed how to bootstrap a Catalyst8000v from the CLI. Today, I will show how to put a file on bootflash which includes the configuration but also the root certificate and the certificate of the device. This is a bit of a more streamlined process and can also be useful if you don’t know what CLI commands to use as vManage will generate the configuration for you.
Starting out, we have a freshly booted router that is in autonomous mode (non-SD-WAN):
Router#sh ver | i operating Router operating mode: Autonomous
To generate the bootstrap configuration, the process is to first go through the regular process of attaching a device to a template. Go to Configuration -> Templates and select Attach Devices:

Select the correct device:

Fill in the information needed:

Click Update to reflect the edits:

Then click Next:

Click Configure Devices and vManage will try to push the config but the device is offline:

Once this is done, vManage has all the information it needs to generate the bootstrap. Go to Configuration -> Devices and select the correct device and then Generate Bootstrap Configuration:

Then vManage will disply the following window. Choose Cloud-Init and have the box selected to Include Default Root Certificate:

Click OK and vManage will generate the entire bootstrap configuration, including root certificate and certificate:

When generating the bootstrap configuration, I recommend to use a simplified template only used for onboarding. Don’t include the full configuration as that means there is more potential for errors in the config. I did for example run into a problem regarding how subinterfaces are handled where I had used a template using the newer way of doing it, but where the router was shipped with older code so my bootstrap configuration could not be applied to the device.
The bootstrap configuration will be named something like C8K-17BB2865-6837-D0A5-9EB1-CD90C9E14146.cfg and look something like this:
Content-Type: multipart/mixed; boundary="===============6473818395825475233=="
MIME-Version: 1.0
--===============6473818395825475233==
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="tmpioh5v7hs"
#cloud-config
vinitparam:
- uuid : C8K-17BB2865-6837-D0A5-9EB1-CD90C9E14146
- otp : 4677ccee4c41413f9773e6e649a1e186
- vbond : 192.0.2.44
- org : sd-wan-lab-daniel
- rcc : true
ca-certs:
remove-defaults: false
trusted:
- |
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Snip
-----END CERTIFICATE-----
--===============6473818395825475233==
Content-Type: text/cloud-boothook; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="config-C8K-17BB2865-6837-D0A5-9EB1-CD90C9E14146.txt"
#cloud-boothook
system
ztp-status success
pseudo-confirm-commit 300
personality vedge
device-model vedge-C8000V
chassis-number C8K-17BB2865-6837-D0A5-9EB1-CD90C9E14146
system-ip 10.236.1.1
overlay-id 1
site-id 1000
no transport-gateway enable
port-offset 0
control-session-pps 300
admin-tech-on-failure
sp-organization-name sd-wan-lab-daniel
organization-name sd-wan-lab-daniel
port-hop
track-transport
track-default-gateway
console-baud-rate 9600
config-template-name ST6-BRANCH
no on-demand enable
on-demand idle-timeout 10
vbond 192.0.2.44 port 12346
logging
disk
enable
!
!
!
bfd default-dscp 48
bfd app-route multiplier 6
bfd app-route poll-interval 120000
security
ipsec
rekey 86400
replay-window 512
authentication-type sha1-hmac ah-sha1-hmac
integrity-type esp ip-udp-esp
!
!
sslproxy
no enable
rsa-key-modulus 2048
certificate-lifetime 730
eckey-type P256
ca-tp-label PROXY-SIGNING-CA
settings expired-certificate drop
settings untrusted-certificate drop
settings unknown-status drop
settings certificate-revocation-check none
settings unsupported-protocol-versions drop
settings unsupported-cipher-suites drop
settings failure-mode close
settings minimum-tls-ver TLSv1
dual-side optimization enable
!
sdwan
interface GigabitEthernet1.536
tunnel-interface
encapsulation ipsec weight 1
no border
color gold
no last-resort-circuit
no low-bandwidth-link
no vbond-as-stun-server
vmanage-connection-preference 5
port-hop
carrier default
nat-refresh-interval 5
hello-interval 1000
hello-tolerance 12
no allow-service all
no allow-service bgp
allow-service dhcp
allow-service dns
allow-service icmp
no allow-service sshd
no allow-service netconf
no allow-service ntp
no allow-service ospf
no allow-service stun
allow-service https
no allow-service snmp
no allow-service bfd
exit
exit
appqoe
no tcpopt enable
no dreopt enable
no httpopt enable
!
omp
no shutdown
send-path-limit 16
ecmp-limit 8
graceful-restart
no as-dot-notation
timers
holdtime 60
advertisement-interval 1
graceful-restart-timer 43200
eor-timer 300
exit
address-family ipv4
advertise bgp
advertise connected
advertise static
!
address-family ipv6
advertise connected
advertise static
!
!
!
banner login Un authorised Logins tracked
banner motd Restricted Use
service tcp-keepalives-in
service tcp-keepalives-out
no service tcp-small-servers
no service udp-small-servers
hostname Branch
username admin privilege 15 secret 9 snip
vrf definition 100
description MAIN VRF
rd 1:100
address-family ipv4
route-target export 1:100
route-target import 1:100
exit-address-family
!
address-family ipv6
exit-address-family
!
!
vrf definition 200
description MGMT VRF
rd 1:200
address-family ipv4
route-target export 1:200
route-target import 1:200
exit-address-family
!
address-family ipv6
exit-address-family
!
!
vrf definition Mgmt-intf
description OOB_MGMT
rd 1:512
address-family ipv4
route-target export 1:512
route-target import 1:512
exit-address-family
!
address-family ipv6
exit-address-family
!
!
ip arp proxy disable
no ip finger
no ip rcmd rcp-enable
no ip rcmd rsh-enable
no ip dhcp use class
no ip ftp passive
ip route 0.0.0.0 0.0.0.0 192.0.2.33
ip bootp server
no ip source-route
no ip ssh bulk-mode
no ip http server
no ip http secure-server
no ip http ctc authentication
ip nat settings central-policy
interface GigabitEthernet1.536
description GOLD
no shutdown
arp timeout 1200
encapsulation dot1Q 536
ip address 192.0.2.34 255.255.255.252
no ip redirects
ip mtu 1500
exit
interface GigabitEthernet3
description OOB_IF
no shutdown
arp timeout 1200
vrf forwarding Mgmt-intf
ip address dhcp client-id GigabitEthernet3
no ip redirects
ip dhcp client default-router distance 1
ip mtu 1500
load-interval 30
mtu 1500
negotiation auto
exit
interface Loopback0
description MGMT_loopback
no shutdown
arp timeout 1200
vrf forwarding 200
ip address 10.236.1.1 255.255.255.255
no ip redirects
ip mtu 1500
exit
interface Tunnel536001
no shutdown
ip unnumbered GigabitEthernet1.536
no ip redirects
ipv6 unnumbered GigabitEthernet1.536
no ipv6 redirects
tunnel source GigabitEthernet1.536
tunnel mode sdwan
exit
clock timezone UTC 0 0
logging persistent size 104857600 filesize 10485760
no logging monitor
logging buffered 512000
logging console
aaa authentication login default local
aaa authorization exec default local
aaa server radius dynamic-author
!
no crypto ikev2 diagnose error
no crypto isakmp diagnose error
no network-clock revertive
snmp-server ifindex persist
fhrp version vrrp v2
line con 0
speed 9600
stopbits 1
!
line vty 0 4
transport input ssh
!
line vty 5 80
transport input ssh
!
lldp run
nat64 translation timeout tcp 3600
nat64 translation timeout udp 300
!
!
--===============6473818395825475233==--
This file needs to be uploaded to bootflash of the device, the same process can be used for HW devices and be stored on bootflash or more commonly USB device to not have to login to the device to apply the configuration. For the device to load the configuration, the file must be renamed to ciscosdwan.cfg for HW devices but ciscosdwan_cloud_init.cfg for SW devices.
Upload the file to bootflash of the device using for example FTP:
Router#copy ftp://user:password@ip/ciscosdwan_cloud_init.cfg bootflash: Destination filename [ciscosdwan_cloud_init.cfg]? Accessing ftp://*:*@ip/ciscosdwan_cloud_init.cfg...! [OK - 33708/4096 bytes] 33708 bytes copied in 0.337 secs (100024 bytes/sec) Router#dir bootflash: Directory of bootflash:/ 30 -rw- 33708 Jul 8 2023 05:10:22 +00:00 ciscosdwan_cloud_init.cfg
Now configure the device to be in controller mode (it should be able to detect mode based on the file but this didn’t work on my router):
Router#controller-mode enable Enabling controller mode will erase the nvram filesystem, remove all configuration files, and reload the box! Ensure the BOOT variable points to a valid image Continue? [confirm] % Warning: Bootstrap config file needed for Day-0 boot is missing Do you want to abort? (yes/[no]): no
Now verify that the root cert is there:
Branch#show sdwan certificate root-ca-cert | i sd-wan
Issuer: C = X, ST = X, L = X, O = sd-wan-lab-daniel, CN = vManage
Subject: C = X, ST = X, L = X, O = sd-wan-lab-daniel, CN = vManage
Verify that the device has a certificate:
Branch#show sdwan control local-properties personality vedge sp-organization-name sd-wan-lab-daniel organization-name sd-wan-lab-daniel root-ca-chain-status Installed root-ca-crl-status Not-Installed certificate-status Installed certificate-validity Valid certificate-not-valid-before Jul 8 06:11:21 2023 GMT certificate-not-valid-after Jul 5 06:11:21 2033 GMT enterprise-cert-status Not Applicable enterprise-cert-validity Not Applicable enterprise-cert-not-valid-before Not Applicable enterprise-cert-not-valid-after Not Applicable dns-name 192.0.2.44 site-id 1000 domain-id 1 protocol dtls tls-port 0 system-ip 10.236.1.1 chassis-num/unique-id C8K-17BB2865-6837-D0A5-9EB1-CD90C9E14146 serial-num 8FBCE3B3 subject-serial-num N/A enterprise-serial-num No certificate installed token Invalid keygen-interval 1:00:00:00 retry-interval 0:00:00:15 no-activity-exp-interval 0:00:00:20 dns-cache-ttl 0:00:00:00 port-hopped FALSE time-since-last-port-hop 0:00:00:00 embargo-check success device-role edge-router region-id-set N/A number-vbond-peers 1
Verify that control connections are up:
Branch#show sdwan control connections
PEER PEER CONTROLLER
PEER PEER PEER SITE DOMAIN PEER PRIV PEER PUB GROUP
TYPE PROT SYSTEM IP ID ID PRIVATE IP PORT PUBLIC IP PORT ORGANIZATION LOCAL COLOR PROXY STATE UPTIME ID
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vsmart dtls 10.240.126.3 xxxxxxxxxx 1 192.0.2.43 12446 192.0.2.43 12446 sd-wan-lab-daniel gold No up 0:00:05:02 0
vsmart dtls 10.240.127.3 xxxxxxxxxx 1 192.0.2.51 12446 192.0.2.51 12446 sd-wan-lab-daniel gold No up 0:00:05:02 0
vmanage dtls 10.241.126.1 xxxxxxxxxx 0 192.0.2.42 13046 192.0.2.42 13046 sd-wan-lab-daniel gold No up 0:00:05:02 0
The advantage to using this type of bootstrap configuration is that it includes the root cert and certificate so there is no need to manually copy the root cert to the device or request to install a certificate. I hope this post has been useful in showing options in bootstrapping a device.