Thanks for getting back to me.
I have updated the server-side configuration file as suggested:
Here is my /etc/openvpn/server.conf file:
verb 4
user nobody
group nogroup
dev tun0
port 1194
proto udp
server 10.13.1.0 255.255.255.0
topology subnet
client-to-client
keepalive 10 120
push "dhcp-option DNS 10.13.0.1"
push "dhcp-option DOMAIN lan"
push "redirect-gateway def1"
log "/tmp/openvpn.log"
<dh>
-----BEGIN DH PARAMETERS-----
bunch of spagheti
-----END DH PARAMETERS-----
</dh>
<tls-crypt>
-----BEGIN OpenVPN Static key V1-----
bunch of spagheti
-----END OpenVPN Static key V1-----
</tls-crypt>
<ca>
-----BEGIN CERTIFICATE-----
bunch of spagheti
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
bunch of spagheti
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
bunch of spagheti
-----END PRIVATE KEY-----
</key>
On the laptop side, I (now) have the following in my client.ovpn file:
verb 4
dev tun
nobind
client
remote my_host 1194 udp
auth-nocache
remote-cert-tls server
<tls-crypt>
-----BEGIN OpenVPN Static key V1-----
bunch of spagheti
-----END OpenVPN Static key V1-----
</tls-crypt>
<ca>
-----BEGIN CERTIFICATE-----
bunch of spagheti
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
bunch of spagheti
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
bunch of spagheti
-----END PRIVATE KEY-----
</key>
serverlogs:
Thu Mar 12 10:39:44 2020 us=915250 OpenVPN 2.4.5 arm-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD]
Thu Mar 12 10:39:44 2020 us=915450 library versions: OpenSSL 1.0.2u 20 Dec 2019, LZO 2.10
Thu Mar 12 10:39:44 2020 us=916001 WARNING: you are using user/group/chroot/setcon without persist-tun -- this may cause restarts to fail
Thu Mar 12 10:39:44 2020 us=916204 WARNING: you are using user/group/chroot/setcon without persist-key -- this may cause restarts to fail
Thu Mar 12 10:39:44 2020 us=918161 Diffie-Hellman initialized with 2048 bit key
Thu Mar 12 10:39:44 2020 us=920090 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
Thu Mar 12 10:39:44 2020 us=920335 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
Thu Mar 12 10:39:44 2020 us=920516 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
Thu Mar 12 10:39:44 2020 us=920695 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
Thu Mar 12 10:39:44 2020 us=920875 TLS-Auth MTU parms [ L:1621 D:1156 EF:94 EB:0 ET:0 EL:3 ]
Thu Mar 12 10:39:44 2020 us=927162 TUN/TAP device tun0 opened
Thu Mar 12 10:39:44 2020 us=927999 TUN/TAP TX queue length set to 100
Thu Mar 12 10:39:44 2020 us=928224 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Thu Mar 12 10:39:44 2020 us=928426 /sbin/ifconfig tun0 10.13.1.1 netmask 255.255.255.0 mtu 1500 broadcast 10.13.1.255
Thu Mar 12 10:39:44 2020 us=959257 Data Channel MTU parms [ L:1621 D:1450 EF:121 EB:406 ET:0 EL:3 ]
Thu Mar 12 10:39:44 2020 us=959636 Could not determine IPv4/IPv6 protocol. Using AF_INET
Thu Mar 12 10:39:44 2020 us=959827 Socket Buffers: R=[163840->163840] S=[163840->163840]
Thu Mar 12 10:39:44 2020 us=960012 UDPv4 link local (bound): [AF_INET][undef]:1194
Thu Mar 12 10:39:44 2020 us=960155 UDPv4 link remote: [AF_UNSPEC]
Thu Mar 12 10:39:44 2020 us=960314 GID set to nogroup
Thu Mar 12 10:39:44 2020 us=960477 UID set to nobody
Thu Mar 12 10:39:44 2020 us=960647 MULTI: multi_init called, r=256 v=256
Thu Mar 12 10:39:44 2020 us=960879 IFCONFIG POOL: base=10.13.1.2 size=252, ipv6=0
Thu Mar 12 10:39:44 2020 us=961652 Initialization Sequence Completed
Thu Mar 12 10:39:53 2020 us=113015 tls-crypt unwrap error: packet too short
Thu Mar 12 10:39:53 2020 us=113373 TLS Error: tls-crypt unwrapping failed from [AF_INET]10.13.0.43:63346
Thu Mar 12 10:39:54 2020 us=181245 tls-crypt unwrap error: packet too short
Thu Mar 12 10:39:54 2020 us=181656 TLS Error: tls-crypt unwrapping failed from [AF_INET]10.13.0.43:63346
Thu Mar 12 10:39:55 2020 us=177893 tls-crypt unwrap error: packet too short
Thu Mar 12 10:39:55 2020 us=178204 TLS Error: tls-crypt unwrapping failed from [AF_INET]10.13.0.43:63346
Thu Mar 12 10:39:56 2020 us=249367 tls-crypt unwrap error: packet too short
Thu Mar 12 10:39:56 2020 us=249713 TLS Error: tls-crypt unwrapping failed from [AF_INET]10.13.0.43:63346
client logs (located at /Library/Application\ Support/OpenVPN/log/openvpn.log on my macbook):
2020-03-12 09:47:00-0400 [-] Profile approve: profile u'my_host' signed_by=None has been remembered for automatic future approval
2020-03-12 09:47:00-0400 [-] OpenVPN my_host_p3929 instantiated
2020-03-12 09:47:00-0400 [-] pyovpn.client.vpncli.MyOMIServer starting on "u'/Library/Application Support/OpenVPN/sock/ovpn-0bIKAZK92QLE.sock'"
2020-03-12 09:47:00-0400 [-] (Port None Closed)
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u">INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info"
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'>HOLD:Waiting for hold release'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['state on']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: real-time state notification set to ON'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['echo on']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: real-time echo notification set to ON'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['bytecount 1']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: bytecount interval changed'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['hold off']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: hold flag set to OFF'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['hold release']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: hold release succeeded'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] OpenVPN start: name='my_host_p3929' sev='info' msg='process started successfully'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] *** API CALL f=xmlrpc_Poll args=['sess_TrackActiveProfiles_OtgRlLdSe4G7S0G2_7', 10] kw={} ret=[{'type': 'PROFILE', 'state': 'connect', 'profile_id': 'my_host_p3929', 'cookie': 'TRAY_CLIENT_anJ0_7iPXhica', 'timestamp': 1584020820}]
2020-03-12 09:47:00-0400 [MyOMIClient,0,] *** API CALL f=xmlrpc_Connect args=[{'new_only': True, 'cookie': 'TRAY_CLIENT_anJ0_7iPXhica', 'profile_id': 'my_host_p3929', 'type': 'static', 'non_interactive': False}, ['STATE', 'PASSWORD', 'ACTIVE', 'CERT_APPROVAL', 'INFO', 'CONNECTED_USER', 'FATAL', 'SCRIPT', 'CHALLENGE', 'DELETE_PENDING', 'NOTIFY', 'RSA_SIGN', 'CONNECT_TIMEOUT', 'BYTECOUNT'], {}] kw={} ret='sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'>REMOTE:my_host,1194,udp'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] TO OMI: ['remote ACCEPT']
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'SUCCESS: remote command succeeded'
2020-03-12 09:47:00-0400 [HTTPChannel,4711,] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'active': True, 'timestamp': 1584020820, 'type': 'ACTIVE', 'last': None}]
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'>STATE:1584020820,RESOLVE,,,'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] *** STATE 1584020820,RESOLVE,,,
2020-03-12 09:47:00-0400 [MyOMIClient,0,] FROM OMI: u'>STATE:1584020820,WAIT,,,'
2020-03-12 09:47:00-0400 [MyOMIClient,0,] *** STATE 1584020820,WAIT,,,
2020-03-12 09:47:00-0400 [HTTPChannel,4713,] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'timestamp': 1584020820, 'state': u'RESOLVE', 'type': 'STATE'}, {'timestamp': 1584020820, 'state': u'WAIT', 'type': 'STATE'}]
2020-03-12 09:47:10-0400 [MyOMIClient,0,] FROM OMI: u'>STATE:1584020830,RECONNECTING,,,'
2020-03-12 09:47:10-0400 [MyOMIClient,0,] *** STATE 1584020830,RECONNECTING,,,
2020-03-12 09:47:10-0400 [MyOMIClient,0,] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'timestamp': 1584020830, 'state': u'RECONNECTING', 'type': 'STATE'}]
2020-03-12 09:47:10-0400 [MyOMIClient,0,] FROM OMI: u'>STATE:1584020830,WAIT,,,'
2020-03-12 09:47:10-0400 [MyOMIClient,0,] *** STATE 1584020830,WAIT,,,
2020-03-12 09:47:10-0400 [HTTPChannel,4724,] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'timestamp': 1584020830, 'state': u'WAIT', 'type': 'STATE'}]
2020-03-12 09:47:11-0400 [HTTPChannel,4728,] TO OMI: ['exit']
2020-03-12 09:47:12-0400 [MyOMIClient,0,] OMI Cancel pending deferred ['exit']
2020-03-12 09:47:12-0400 [-] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'active': False, 'timestamp': 1584020832, 'type': 'ACTIVE', 'last': True}]
2020-03-12 09:47:12-0400 [-] OpenVPN my_host_p3929 stop: process stopped with exit code 0
2020-03-12 09:47:12-0400 [-] *** API CALL f=xmlrpc_Poll args=['sess_TrackActiveProfiles_OtgRlLdSe4G7S0G2_7', 10] kw={} ret=[{'timestamp': 1584020832, 'state': 'disconnect', 'profile_id': 'my_host_p3929', 'type': 'PROFILE'}]
2020-03-12 09:47:12-0400 [-] *** API CALL f=xmlrpc_DisconnectAll args=[] kw={} ret=[(True, ('my_host_p3929', 0))]
2020-03-12 09:47:12-0400 [HTTPChannel,4729,] *** API CALL f=xmlrpc_Poll args=['sess_my_host_p3929_vT8SxFB3Q98AZ3gr_1', 10] kw={} ret=[{'timestamp': 1584020832, 'type': 'DELETE_PENDING'}]
2020-03-12 09:47:12-0400 [HTTPChannel,4730,] *** API CALL f=xmlrpc_EnumProfiles args=[] kw={} ret=[{'hash': '8bcfbe1e36ecf77e13a8b0a059adc31e9e3e2ba6774741653f635597a024aeaf', 'name': u'my_host', 'global': False, 'host': u'my_host', 'snapshot': {'active': {'active': False, 'timestamp': 1584020832, 'type': 'ACTIVE', 'last': True}, 'state': {'timestamp': 1584020830, 'state': 'DISCONNECTED', 'type': 'STATE'}, 'delete_pending': True, 'cookie': 'TRAY_CLIENT_anJ0_7iPXhica', 'bytecount': {'timestamp': 1584020831, 'out': u'154', 'type': 'BYTECOUNT', 'in': u'0'}}, 'owner': u'jrt', 'remote_hosts': [u'my_host'], 'type': ['static'], 'id': u'my_host_p3929', 'access_allowed': True}]