Project

General

Profile

Trusted Platform Module 2.0 » History » Version 114

Andreas Steffen, 02.01.2021 08:55

1 17 Andreas Steffen
h1. Trusted Platform Module 2.0
2 1 Andreas Steffen
3 6 Andreas Steffen
{{>toc}}
4 6 Andreas Steffen
5 51 Andreas Steffen
h2. Connect to a TPM 2.0 Device
6 1 Andreas Steffen
7 88 Andreas Steffen
h3. Install the tpm2-tss Software Stack and the tpm2-tools Command Set
8 51 Andreas Steffen
9 90 Andreas Steffen
In order to connect to a TPM 2.0 hardware or firmware device a software stack implementing the "TCG TSS 2.0 System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-system-level-api-sapi-specification/ is needed. An excellent open source "tpm2-tss":https://github.com/tpm2-software/tpm2-tss library is available from the "tpm2-software":https://github.com/tpm2-software project which also offers a set of "tpm2-tools":https://github.com/tpm2-software/tpm2-tools which itself uses the "TCG TSS 2.0 Enhanced System Level API":https://trustedcomputinggroup.org/resource/tcg-tss-2-0-enhanced-system-api-esapi-specification/.
10 1 Andreas Steffen
11 89 Andreas Steffen
When using the latest *strongswan-5.9.1* version with a *Linux 5.4* kernel or newer, we recommend these latest versions:
12 1 Andreas Steffen
13 89 Andreas Steffen
* *tpm2-tss* version 3.0.3: https://github.com/tpm2-software/tpm2-tss/releases/tag/3.0.3
14 79 Andreas Steffen
15 89 Andreas Steffen
* *tpm2-tools* version 5.0: https://github.com/tpm2-software/tpm2-tools/releases/tag/5.0
16 79 Andreas Steffen
17 90 Andreas Steffen
Support for earlier strongSwan versions and Linux kernels can be found [[TpmPluginOld|here]].
18 71 Andreas Steffen
19 91 Andreas Steffen
In order to test if we can connect to the TPM 2.0 device we list all persistent keys stored in the Non-Volatile (NV) RAM:
20 3 Andreas Steffen
<pre>
21 91 Andreas Steffen
tpm2_getcap handles-persistent
22 91 Andreas Steffen
- 0x81000001
23 91 Andreas Steffen
- 0x81000002
24 91 Andreas Steffen
- 0x81010001
25 18 Andreas Steffen
</pre>
26 1 Andreas Steffen
27 93 Andreas Steffen
A manual showing all *tpm2-tools* functions with their arguments can be found "here":https://github.com/tpm2-software/tpm2-tools/tree/5.0/man. The access to the */dev/tpmrm0* TPM resource manager device requires *root* rights on most Linux platforms. But e.g. with Ubuntu, adding the user to the *tss* group enables direct access to the TPM device:
28 92 Andreas Steffen
<pre>
29 92 Andreas Steffen
sudo usermod -a -G tss <username>
30 92 Andreas Steffen
</pre>
31 96 Andreas Steffen
32 51 Andreas Steffen
h3. Enable the strongSwan tpm Plugin
33 51 Andreas Steffen
34 51 Andreas Steffen
The strongSwan libtpmtss *tpm* plugin and the TSS2 interface are enabled and built with the following options
35 51 Andreas Steffen
36 1 Andreas Steffen
  ./configure --enable-tss-tss2 --enable-tpm  ...
37 96 Andreas Steffen
38 96 Andreas Steffen
With the strongSwan *pki* tool we can now list the persistent key stored under the handle *0x81010001*
39 96 Andreas Steffen
<pre>
40 96 Andreas Steffen
pki --print --type priv --keyid 0x81010001 --debug 2
41 97 Andreas Steffen
</pre>
42 98 Andreas Steffen
With debug level 2 some basic information on the TPM device is shown; A second generation Intel firmware TPM running on the Intel Management Engine is employed. Both SHA1 and SHA256 PCR banks are available:
43 97 Andreas Steffen
<pre>
44 96 Andreas Steffen
TPM 2.0 - manufacturer: INTC (Intel) rev: 01.38 2018 
45 96 Andreas Steffen
TPM 2.0 - algorithms: RSA SHA1 HMAC AES MGF1 KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH ECDAA ECSCHNORR KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CTR OFB CBC CFB ECB
46 96 Andreas Steffen
TPM 2.0 - ECC curves: NIST_P256 BN_P256
47 96 Andreas Steffen
TPM 2.0 - PCR banks: SHA1 SHA256
48 97 Andreas Steffen
</pre>
49 99 Andreas Steffen
Apparently the analyzed persistent key can be used for encryption only because no signature algorithm is defined:
50 97 Andreas Steffen
<pre>
51 96 Andreas Steffen
TPM 2.0 via TSS2 v2 available
52 96 Andreas Steffen
signature algorithm is NULL with ERROR hash
53 97 Andreas Steffen
</pre>
54 98 Andreas Steffen
Debug level 2 shows that the *pki* tool extracts the public key from the TPM and converts it into a standard PKCS#1 format:
55 97 Andreas Steffen
<pre>
56 96 Andreas Steffen
L0 - subjectPublicKeyInfo:
57 96 Andreas Steffen
L1 - algorithm:
58 96 Andreas Steffen
L2 - algorithmIdentifier:
59 96 Andreas Steffen
L3 - algorithm:
60 96 Andreas Steffen
  'rsaEncryption'
61 96 Andreas Steffen
L1 - subjectPublicKey:
62 96 Andreas Steffen
-- > --
63 96 Andreas Steffen
L0 - RSAPublicKey:
64 96 Andreas Steffen
L1 - modulus:
65 96 Andreas Steffen
L1 - publicExponent:
66 96 Andreas Steffen
-- < --
67 97 Andreas Steffen
</pre>
68 98 Andreas Steffen
At the end of the output the fingerprint of the 2048 bit RSA key is listed:
69 97 Andreas Steffen
<pre>
70 96 Andreas Steffen
  privkey:   RSA 2048 bits
71 96 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
72 1 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
73 97 Andreas Steffen
</pre>
74 7 Andreas Steffen
75 20 Andreas Steffen
h2. Derive a Persistent RSA Endorsement Key
76 1 Andreas Steffen
77 103 Andreas Steffen
The following *tpm2-tools* command derives a 2048 bit RSA Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and makes the key persistent in the non-volatile memory of the TPM under the object handle *0x81010002*
78 11 Andreas Steffen
79 100 Andreas Steffen
 tpm2_createek -G rsa -c 0x81010002
80 1 Andreas Steffen
81 100 Andreas Steffen
We can check that the newly derived Endorsement Key has been persisted in the NV RAM
82 100 Andreas Steffen
<pre>
83 100 Andreas Steffen
tpm2_getcap handles-persistent
84 100 Andreas Steffen
- 0x81000001
85 100 Andreas Steffen
- 0x81000002
86 100 Andreas Steffen
- 0x81010001
87 100 Andreas Steffen
- 0x81010002
88 100 Andreas Steffen
</pre>
89 101 Andreas Steffen
Listing the key properties shows that the 2048 bit Endorsement Key already exists under the handle *0x81010001* analyzed in the previous section
90 1 Andreas Steffen
91 100 Andreas Steffen
 pki --print --type priv --keyid 0x81010002
92 1 Andreas Steffen
93 100 Andreas Steffen
<pre>
94 100 Andreas Steffen
TPM 2.0 via TSS2 v2 available
95 100 Andreas Steffen
signature algorithm is NULL with ERROR hash
96 100 Andreas Steffen
  privkey:   RSA 2048 bits
97 100 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
98 100 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
99 100 Andreas Steffen
</pre>
100 1 Andreas Steffen
101 100 Andreas Steffen
We therefore delete the duplicate key with the following *tpm2-tools* command
102 100 Andreas Steffen
<pre>
103 100 Andreas Steffen
tpm2_evictcontrol -c 0x81010002
104 100 Andreas Steffen
persistent-handle: 0x81010002
105 100 Andreas Steffen
action: evicted
106 100 Andreas Steffen
</pre>
107 100 Andreas Steffen
The key removal can be verified with
108 100 Andreas Steffen
<pre>
109 100 Andreas Steffen
tpm2_getcap handles-persistent
110 100 Andreas Steffen
- 0x81000001
111 100 Andreas Steffen
- 0x81000002
112 102 Andreas Steffen
- 0x81010001
113 100 Andreas Steffen
</pre>
114 1 Andreas Steffen
115 103 Andreas Steffen
h2. Derive a Persistent ECC Endorsement Key
116 103 Andreas Steffen
117 103 Andreas Steffen
The following *tpm2-tools* command derives a 256 bit ECC Endorsement Key (EK) in a deterministic way from the secret _Endorsement Primary Seed_ *unique* to each TPM device and makes the key persistent in the non-volatile memory of the TPM under the object handle *0x81010002*:
118 103 Andreas Steffen
119 103 Andreas Steffen
 tpm2_createek -G ecc -c 0x81010002 -u ek_ecc.pub
120 103 Andreas Steffen
121 103 Andreas Steffen
Optionally we saved the public key in a TPM 2.0 proprietary format in the file *ek_ecc.pub*. The fingerprint of the ECC EK private key can be directly displayed with the command
122 105 Andreas Steffen
123 105 Andreas Steffen
<pre>
124 111 Andreas Steffen
pki --print --type priv --keyid 0x81010002
125 104 Andreas Steffen
TPM 2.0 via TSS2 v2 available
126 104 Andreas Steffen
signature algorithm is NULL with ERROR hash
127 103 Andreas Steffen
  privkey:   ECDSA 256 bits
128 103 Andreas Steffen
  keyid:     25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a
129 103 Andreas Steffen
  subjkey:   9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
130 103 Andreas Steffen
</pre>
131 103 Andreas Steffen
132 103 Andreas Steffen
h2. Endorsement Key Certificates
133 103 Andreas Steffen
134 113 Andreas Steffen
Endorsement Key certificates issued for Intel firmware TPMs can be automatically downloaded from an Intel web server using the following *tpm-tools* command:
135 106 Andreas Steffen
136 112 Andreas Steffen
 tpm2_getekcertificate -o ek_ecc.crt -u ek_ecc.pub
137 106 Andreas Steffen
138 108 Andreas Steffen
For successful retrieval the public key *ek_ecc.pub* in the TPM 2.0 proprietary format is required. Using the *pki* tool we can list the downloaded EK certificate belonging to the ECC key:
139 106 Andreas Steffen
<pre>
140 106 Andreas Steffen
pki --print --type x509 --in ek_ecc.crt
141 106 Andreas Steffen
  subject:  ""
142 106 Andreas Steffen
  issuer:   "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com"
143 106 Andreas Steffen
  validity:  not before Sep 04 02:00:00 2019, ok
144 106 Andreas Steffen
             not after  Jan 01 00:59:59 2050, ok (expires in 10600 days)
145 106 Andreas Steffen
  serial:    07:99:3b:c6:88:aa:7d:72:b0:24:24:05:09:01:bb:42:55:70:1a:43
146 106 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000
147 106 Andreas Steffen
  CRL URIs:  https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl
148 106 Andreas Steffen
  certificatePolicies:
149 106 Andreas Steffen
             1.2.840.113741.1.5.2.1
150 106 Andreas Steffen
             CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf
151 106 Andreas Steffen
  authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39
152 106 Andreas Steffen
  subjkeyId: 9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
153 106 Andreas Steffen
  pubkey:    ECDSA 256 bits
154 106 Andreas Steffen
  keyid:     25:db:73:13:0f:c9:c8:91:68:30:8e:02:89:c1:0d:65:bd:ad:69:2a
155 106 Andreas Steffen
  subjkey:   9c:b9:fb:b0:32:81:24:82:a7:07:b2:bd:bd:d3:7c:2b:22:7f:74:bf
156 106 Andreas Steffen
</pre>
157 106 Andreas Steffen
For the RSA 2048 Endorsement Key we first have to extract the public keyfile *ek_rsa.pub* in the TPM 2.0 proprietary format because we forgot to do this in the first place:
158 109 Andreas Steffen
159 110 Andreas Steffen
 tpm2_readpublic -Q -c 0x81010001 -o ek_rsa.pub
160 106 Andreas Steffen
161 110 Andreas Steffen
Now we can retrieve the RSA EK certificate, too:
162 106 Andreas Steffen
163 114 Andreas Steffen
 tpm2_getekcertificate -o ek_rsa.crt -u ek_rsa.pub
164 106 Andreas Steffen
165 106 Andreas Steffen
and view the contents with
166 106 Andreas Steffen
<pre>
167 106 Andreas Steffen
pki --print --type x509 --in ek_rsa.crt
168 106 Andreas Steffen
  subject:  ""
169 106 Andreas Steffen
  issuer:   "C=US, ST=CA, L=Santa Clara, O=Intel Corporation, OU=TPM EK intermediate for CNL_EPID_POST_B1LP_PROD_2 pid:9, CN=www.intel.com"
170 106 Andreas Steffen
  validity:  not before Sep 04 02:00:00 2019, ok
171 106 Andreas Steffen
             not after  Jan 01 00:59:59 2050, ok (expires in 10600 days)
172 106 Andreas Steffen
  serial:    14:26:0b:eb:12:a2:82:87:af:3b:75:e0:a1:a4:87:60:72:95:55:92
173 106 Andreas Steffen
  altNames:  tcg-at-tpmManufacturer=id:494E5443, tcg-at-tpmModel=CNL, tcg-at-tpmVersion=id:00020000
174 106 Andreas Steffen
  CRL URIs:  https://trustedservices.intel.com/content/CRL/ekcert/CNLEPIDPOSTB1LPPROD2_EK_Device.crl
175 106 Andreas Steffen
  certificatePolicies:
176 106 Andreas Steffen
             1.2.840.113741.1.5.2.1
177 106 Andreas Steffen
             CPS: https://trustedservices.intel.com/content/CRL/ekcert/EKcertPolicyStatement.pdf
178 106 Andreas Steffen
  authkeyId: 17:a0:05:75:d0:5e:58:e3:88:12:10:bb:98:b1:04:5b:b4:c3:06:39
179 106 Andreas Steffen
  subjkeyId: df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
180 106 Andreas Steffen
  pubkey:    RSA 2048 bits
181 106 Andreas Steffen
  keyid:     ee:c7:bf:5a:de:0f:11:84:2c:86:2b:69:84:ba:65:b9:81:d2:a9:45
182 106 Andreas Steffen
  subjkey:   df:f2:e9:e7:79:98:f0:d2:0b:62:db:c0:5c:2c:eb:45:73:85:e9:79
183 106 Andreas Steffen
</pre>
184 106 Andreas Steffen
185 107 Andreas Steffen
We can check that in both EK certificates the key fingerprints (__keyid__ and __subjkey__) match with those of the EK keys persisted in the TPM.
186 107 Andreas Steffen
187 11 Andreas Steffen
h2. Generate a Persistent RSA Attestation Key
188 20 Andreas Steffen
189 1 Andreas Steffen
A 2048 bit RSA Attestation Key (AK) bound to the EK with handle 0x81010001 can be created and made persistent under the handle 0x81010002 with the following tpm2-tools command
190 25 Andreas Steffen
191 1 Andreas Steffen
 tpm2_getpubak -E 0x81010001 -g rsa -D sha256 -s rsassa -k 0x81010002 -P 123456 -f ak_rsa2.pub -n ak_rsa2.name
192 82 Andreas Steffen
193 9 Andreas Steffen
This AK key is protected by the PIN (-P parameter) *123456*. The AK public key can now be exported in PKCS#1 format from the TPM using the *pki* tool
194 67 Andreas Steffen
195 9 Andreas Steffen
 pki --pub --keyid 0x81010002 --outform pem > ak_rsa_pub.pem
196 67 Andreas Steffen
197 9 Andreas Steffen
The fingerprint of the RSA AK public key can be displayed with the command
198 9 Andreas Steffen
199 9 Andreas Steffen
 pki --print --type pub --in ak_rsa_pub.pem
200 9 Andreas Steffen
  pubkey:    RSA 2048 bits
201 20 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
202 13 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
203 13 Andreas Steffen
204 13 Andreas Steffen
h2. Generate a Persistent ECC Attestation Key
205 84 Andreas Steffen
206 13 Andreas Steffen
A 256 bit ECC Attestation Key (AK) bound to the EK with handle 0x81010003 can be created and made persistent under the handle 0x81010004 with the following tpm2-tools command
207 13 Andreas Steffen
208 13 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010004 -f ak_ecc4.pub -n ak_ecc4.name
209 50 Andreas Steffen
210 13 Andreas Steffen
The AK public key can be exported in PKCS#1 format from the TPM using the *pki* tool
211 52 Andreas Steffen
212 13 Andreas Steffen
 pki --pub --keyid 0x81010004 > ak_ecc_pub.der
213 14 Andreas Steffen
214 1 Andreas Steffen
The fingerprint of the ECC AK public key can be displayed with the command
215 1 Andreas Steffen
216 1 Andreas Steffen
 pki --print --type pub --in ak_ecc_pub.der
217 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
218 20 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
219 15 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
220 15 Andreas Steffen
221 15 Andreas Steffen
h2. Generate Another ECC Attestation Key
222 85 Andreas Steffen
223 15 Andreas Steffen
Multiple AK keys bound to a common EK key can be generated
224 68 Andreas Steffen
225 15 Andreas Steffen
 tpm2_getpubak -E 0x81010003 -g ecc -D sha256 -s ecdsa -k 0x81010005 -f ak_ecc5.pub -n ak_ecc5.name
226 68 Andreas Steffen
227 15 Andreas Steffen
The fingerprint of the second ECC AK private key can be displayed with the command
228 15 Andreas Steffen
229 15 Andreas Steffen
 pki --print --type priv --in 0x81010005
230 15 Andreas Steffen
  pubkey:    ECDSA 256 bits
231 19 Andreas Steffen
  keyid:     c4:b4:9c:95:27:9e:ce:81:2f:98:42:c8:1b:f0:54:ff:d4:d1:24:34
232 15 Andreas Steffen
  subjkey:   cf:44:f4:f7:9d:97:09:ad:b1:09:3a:8e:6f:23:eb:9f:2c:35:94:c9
233 15 Andreas Steffen
234 15 Andreas Steffen
h2. Remove a Persistent Key Object
235 15 Andreas Steffen
236 1 Andreas Steffen
Since the non-volatile memory of the TPM is limited any persistent key object can be removed to free storage space.
237 18 Andreas Steffen
The following tpm2-tools command removes the ECC AK key with persistent handle 0x81010005
238 18 Andreas Steffen
239 18 Andreas Steffen
 tpm2_evictcontrol -A o -H 0x81010005 -S 0x81010005
240 18 Andreas Steffen
241 18 Andreas Steffen
h2. List Persistent Objects
242 18 Andreas Steffen
243 18 Andreas Steffen
The following tpm2-tools command lists all persistent objects stored by the TPM in non-volatile memory
244 18 Andreas Steffen
245 18 Andreas Steffen
 tpm2_listpersistent
246 18 Andreas Steffen
247 18 Andreas Steffen
<pre>
248 18 Andreas Steffen
6 persistent objects defined.
249 18 Andreas Steffen
250 18 Andreas Steffen
0. Persistent handle: 0x81000001
251 18 Andreas Steffen
{
252 18 Andreas Steffen
        Type: 0x23
253 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
254 18 Andreas Steffen
        Attributes: 0x30072
255 18 Andreas Steffen
}
256 18 Andreas Steffen
1. Persistent handle: 0x81000002
257 18 Andreas Steffen
{
258 18 Andreas Steffen
        Type: 0x23
259 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
260 18 Andreas Steffen
        Attributes: 0x60072
261 18 Andreas Steffen
}
262 18 Andreas Steffen
2. Persistent handle: 0x81010001
263 18 Andreas Steffen
{
264 18 Andreas Steffen
        Type: 0x1
265 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
266 18 Andreas Steffen
        Attributes: 0x300b2
267 18 Andreas Steffen
}
268 18 Andreas Steffen
3. Persistent handle: 0x81010002
269 18 Andreas Steffen
{
270 18 Andreas Steffen
        Type: 0x1
271 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
272 18 Andreas Steffen
        Attributes: 0x50072
273 18 Andreas Steffen
}
274 18 Andreas Steffen
4. Persistent handle: 0x81010003
275 18 Andreas Steffen
{
276 18 Andreas Steffen
        Type: 0x23
277 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
278 18 Andreas Steffen
        Attributes: 0x300b2
279 18 Andreas Steffen
}
280 18 Andreas Steffen
5. Persistent handle: 0x81010004
281 18 Andreas Steffen
{
282 18 Andreas Steffen
        Type: 0x23
283 18 Andreas Steffen
        Hash algorithm(nameAlg): 0xb
284 13 Andreas Steffen
        Attributes: 0x50072
285 41 Andreas Steffen
}
286 41 Andreas Steffen
</pre>
287 41 Andreas Steffen
288 41 Andreas Steffen
h2. Create a Demo Root CA
289 41 Andreas Steffen
290 41 Andreas Steffen
The following *pki* command creates a 256 bit ECDSA private key for the Demo CA
291 41 Andreas Steffen
<pre>
292 41 Andreas Steffen
pki --gen --type ecdsa --size 256 --outform pem > demoCaKey.pem
293 41 Andreas Steffen
</pre>
294 41 Andreas Steffen
295 41 Andreas Steffen
Next we create a self-signed Root CA certificate
296 41 Andreas Steffen
<pre>
297 42 Andreas Steffen
pki --self --ca --type ecdsa --in demoCaKey.pem --dn="C=US, O=TNC Demo, CN=TNC Demo CA" --lifetime 3652 --outform pem > demoCaCert.pem
298 41 Andreas Steffen
</pre>
299 42 Andreas Steffen
300 41 Andreas Steffen
h2. Issue an RSA AIK Certificate
301 41 Andreas Steffen
302 41 Andreas Steffen
Based on the RSA AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
303 41 Andreas Steffen
<pre>
304 42 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_rsa_pub.der --dn "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_rsa_Cert.der
305 41 Andreas Steffen
</pre>
306 42 Andreas Steffen
307 41 Andreas Steffen
h2. Issue an ECC AIK Certificate
308 41 Andreas Steffen
309 41 Andreas Steffen
Based on the ECC AK public key exported from the TPM, the following *pki* command generates an Attestation Identity Key (AIK) certificate signed by the Demo CA
310 47 Andreas Steffen
<pre>
311 49 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pub --in ak_ecc_pub.der --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com --lifetime 3651 > raspi5_ak_ecc_Cert.der
312 47 Andreas Steffen
</pre>
313 50 Andreas Steffen
314 47 Andreas Steffen
Many certification authorities issue certificates based on PKCS#10 certificate requests. This approach is also possible. First a certificate request is generated on the host the TPM resides on
315 49 Andreas Steffen
<pre>
316 49 Andreas Steffen
 pki --req --keyid 0x81010004 --dn "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com" --san raspi5.example.com > ak_ecc_req.der
317 47 Andreas Steffen
</pre>
318 47 Andreas Steffen
When you are prompted for a smartcard PIN just press <enter> since this TPM private key is not protected by a PIN. In a second step the CA issues the AIK certificate based on the PKCS#10 certificate request
319 47 Andreas Steffen
<pre>
320 54 Andreas Steffen
pki --issue --cacert demoCaCert.pem --cakey demoCaKey.pem --type pkcs10 --in ak_ecc_req.der --lifetime 3651 > raspi5_ak_ecc_Cert.der
321 54 Andreas Steffen
</pre>
322 55 Andreas Steffen
323 54 Andreas Steffen
h2. Store the ECC AIK Certificate in the NV RAM of the TPM
324 54 Andreas Steffen
325 63 Andreas Steffen
A TPM 2.0 has a certain amount of Non Volatile Random Access Memory (NV RAM) that can be used to store arbitrary data, e.g. the X.509 certificates matching the persistent keys. IF both the certificates and keys are persisted in the TPM then the system disk of the host can be reformatted at any time without loosing the machine or user credentials.As with smartcards the needed amount of memory must be reserved first so we check the size of the X.509 ECC certificate
326 54 Andreas Steffen
<pre>
327 54 Andreas Steffen
ls -l raspi5_ak_ecc_Cert.der
328 54 Andreas Steffen
-rw-r--r-- 1 root root 449 Feb 17  2017 raspi5_ak_ecc_Cert.der
329 54 Andreas Steffen
</pre>
330 54 Andreas Steffen
331 54 Andreas Steffen
We then define a memory location with a size of 449 bytes that can be accessed via the handle 0x01800004 which is also called the NV index
332 54 Andreas Steffen
<pre>
333 54 Andreas Steffen
tpm2_nvdefine -x 0x01800004 -a 0x40000001 -s 449 -t 0x2000A
334 54 Andreas Steffen
</pre>
335 70 Andreas Steffen
336 54 Andreas Steffen
Then we write the certificate file to the NV RAM destination
337 54 Andreas Steffen
<pre>
338 62 Andreas Steffen
tpm2_nvwrite -x 0x01800004 -a 0x40000001 raspi5_ak_ecc_Cert.der
339 54 Andreas Steffen
</pre>
340 62 Andreas Steffen
341 57 Andreas Steffen
h2. List of NV Indexes
342 57 Andreas Steffen
343 57 Andreas Steffen
A list of all defined NV indexes can be obtained with
344 55 Andreas Steffen
345 54 Andreas Steffen
 tpm2_nvlist
346 54 Andreas Steffen
347 54 Andreas Steffen
<pre>
348 54 Andreas Steffen
2 NV indexes defined.
349 54 Andreas Steffen
350 54 Andreas Steffen
  0. NV Index: 0x1500015
351 54 Andreas Steffen
  {
352 54 Andreas Steffen
	Hash algorithm(nameAlg):4
353 54 Andreas Steffen
 	The Index attributes(attributes):0x44040004
354 54 Andreas Steffen
 	The size of the data area(dataSize):4
355 54 Andreas Steffen
   }
356 54 Andreas Steffen
  1. NV Index: 0x1800004
357 1 Andreas Steffen
  {
358 1 Andreas Steffen
	Hash algorithm(nameAlg):11
359 62 Andreas Steffen
 	The Index attributes(attributes):0x2002000a
360 62 Andreas Steffen
 	The size of the data area(dataSize):449
361 62 Andreas Steffen
   }
362 62 Andreas Steffen
</pre>
363 62 Andreas Steffen
364 62 Andreas Steffen
h2. Remove NV Index
365 62 Andreas Steffen
366 54 Andreas Steffen
The memory assigned to a given NV index can be released with the command
367 54 Andreas Steffen
<pre>
368 30 Andreas Steffen
tpm2_nvrelease -x 0x01800001 -a 0x40000001
369 1 Andreas Steffen
</pre>
370 23 Andreas Steffen
371 1 Andreas Steffen
h2. Configure TPM Private Key Access via VICI Interface
372 7 Andreas Steffen
373 1 Andreas Steffen
Configuration of TPM private key access as tokens in the secrets section of *swanctl.conf*
374 1 Andreas Steffen
375 46 Andreas Steffen
 secrets {
376 1 Andreas Steffen
    token_ak_rsa {
377 1 Andreas Steffen
       handle = 81010002
378 7 Andreas Steffen
       pin = 123456
379 1 Andreas Steffen
    }
380 1 Andreas Steffen
    token_ak_ecc {
381 46 Andreas Steffen
       handle = 81010004
382 30 Andreas Steffen
    }
383 30 Andreas Steffen
}
384 30 Andreas Steffen
Since the use of the RSA AK private key is password-protected, the PIN *123456* is added.
385 30 Andreas Steffen
386 30 Andreas Steffen
h2. Define IPsec Connection with RSA AK Client Key
387 30 Andreas Steffen
388 30 Andreas Steffen
This connection configuration in *swanctl.conf* uses the RSA AK certificate for client authentication
389 30 Andreas Steffen
<pre>
390 30 Andreas Steffen
connections {
391 30 Andreas Steffen
   rsa {
392 30 Andreas Steffen
      local_addrs  = 10.10.0.105
393 30 Andreas Steffen
      remote_addrs = 10.10.0.104
394 30 Andreas Steffen
395 30 Andreas Steffen
      local {
396 30 Andreas Steffen
         auth = pubkey 
397 30 Andreas Steffen
         certs = raspi5_ak_rsa_Cert.der
398 30 Andreas Steffen
      }
399 30 Andreas Steffen
      remote {
400 30 Andreas Steffen
         auth = pubkey 
401 30 Andreas Steffen
         id = raspi4.example.com
402 30 Andreas Steffen
      }
403 30 Andreas Steffen
      children {
404 30 Andreas Steffen
         rsa {
405 30 Andreas Steffen
            mode = transport
406 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
407 30 Andreas Steffen
         }
408 30 Andreas Steffen
      }
409 30 Andreas Steffen
      version = 2
410 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
411 30 Andreas Steffen
   }
412 30 Andreas Steffen
}
413 30 Andreas Steffen
</pre>
414 58 Andreas Steffen
415 30 Andreas Steffen
h2. Define IPsec Connection with ECC AK Client Key
416 30 Andreas Steffen
417 30 Andreas Steffen
This connection configuration in *swanctl.conf* references the ECC AK certificate used for client authentication via its handle, i.e. the NV index
418 30 Andreas Steffen
<pre>
419 30 Andreas Steffen
connections {
420 30 Andreas Steffen
   ecc {
421 30 Andreas Steffen
      local_addrs  = 10.10.0.105
422 1 Andreas Steffen
      remote_addrs = 10.10.0.104
423 58 Andreas Steffen
424 58 Andreas Steffen
      local {
425 58 Andreas Steffen
         auth = pubkey
426 30 Andreas Steffen
         cert-tpm {
427 30 Andreas Steffen
            handle = 0x01800004
428 30 Andreas Steffen
         }
429 30 Andreas Steffen
      }
430 30 Andreas Steffen
      remote {
431 30 Andreas Steffen
         auth = pubkey
432 30 Andreas Steffen
         id = raspi4.example.com
433 30 Andreas Steffen
      }
434 30 Andreas Steffen
      children {
435 30 Andreas Steffen
         ecc {
436 30 Andreas Steffen
            mode = transport
437 30 Andreas Steffen
            esp_proposals = aes128-sha256-curve25519
438 30 Andreas Steffen
         }
439 30 Andreas Steffen
      }
440 30 Andreas Steffen
      version = 2
441 30 Andreas Steffen
      proposals = aes128-sha256-curve25519
442 29 Andreas Steffen
   }
443 29 Andreas Steffen
}
444 29 Andreas Steffen
</pre>
445 29 Andreas Steffen
446 29 Andreas Steffen
h2. Starting the strongSwan Daemon
447 29 Andreas Steffen
448 29 Andreas Steffen
<pre>
449 29 Andreas Steffen
systemctl start strongswan-swanctl
450 44 Andreas Steffen
</pre>
451 44 Andreas Steffen
452 44 Andreas Steffen
<pre>
453 44 Andreas Steffen
Feb 19 10:52:01 raspi5 systemd[1]: Starting strongSwan IPsec IKEv1/IKEv2 daemon using swanctl...
454 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded plugins: charon-systemd charon-systemd random nonce x509 constraints openssl pem pkcs1 pkcs8 pkcs12 pubkey mgf1 ntru curve25519 eap-identity eap-ttls eap-tnc tnc-tnccs tnc-imc tnccs-20 socket-default kernel-netlink vici tpm
455 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: spawning 16 worker threads
456 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
457 59 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded certificate 'C=US, O=TNC Demo, CN=TNC Demo CA'
458 1 Andreas Steffen
</pre>
459 44 Andreas Steffen
460 53 Andreas Steffen
The RSA AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
461 44 Andreas Steffen
<pre>
462 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
463 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
464 44 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
465 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
466 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: AIK signature algorithm is RSASSA with SHA256 hash
467 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: loaded RSA private key from token
468 44 Andreas Steffen
F</pre>
469 44 Andreas Steffen
470 53 Andreas Steffen
The ECC AK private key is attached to the *charon-systemd* daemon via the TPM 2.0 resource manager
471 44 Andreas Steffen
<pre>
472 73 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
473 1 Andreas Steffen
Feb 19 10:52:01 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
474 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
475 1 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
476 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: AIK signature algorithm is ECDSA with SHA256 hash
477 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded ECDSA private key from token
478 59 Andreas Steffen
</pre>
479 59 Andreas Steffen
480 59 Andreas Steffen
The ECC AIK certificate is loaded by the *charon-systemd* daemon via the TPM 2.0 resource manager
481 59 Andreas Steffen
<pre>
482 73 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - manufacturer: IFX (SLB9670) rev: 01.16 2015
483 60 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - algorithms: RSA SHA1 HMAC AES KEYEDHASH XOR SHA256 RSASSA RSAES RSAPSS OAEP ECDSA ECDH SM2 KDF1_SP800_56A KDF1_SP800_108 ECC SYMCIPHER CFB
484 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 - ECC curves: NIST_P256 BN_P256
485 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: TPM 2.0 via TSS2 v2 available
486 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: loaded certificate from TPM NV index 0x01800004
487 59 Andreas Steffen
</pre>
488 1 Andreas Steffen
489 1 Andreas Steffen
The two connection definitions are received by the *charon-systemd* daemon from the *swanctl* command line tool via the VICI interface
490 1 Andreas Steffen
<pre>
491 44 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com'
492 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: rsa
493 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]:   id not specified, defaulting to cert subject 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com'
494 59 Andreas Steffen
Feb 19 10:52:02 raspi5 charon-systemd[21165]: added vici connection: ecc
495 59 Andreas Steffen
</pre>
496 44 Andreas Steffen
497 44 Andreas Steffen
The *swanctl* command line tool reports its actions
498 44 Andreas Steffen
<pre>
499 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509/raspi5_ak_rsa_Cert.der'
500 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded certificate from '/etc/swanctl/x509ca/demoCaCert.pem'
501 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_rsa from token [keyid: f49e857dde4e67f5fb870398673f207cf33f2b66]
502 44 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded key token_ak_ecc from token [keyid: c70e63f87f6ff65500e5057f5a3e6b6ce7d2d513]
503 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'rsa'
504 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: loaded connection 'ecc'
505 31 Andreas Steffen
Feb 19 10:52:02 raspi5 swanctl[21183]: successfully loaded 2 connections, 0 unloaded
506 44 Andreas Steffen
</pre>
507 31 Andreas Steffen
508 31 Andreas Steffen
<pre>
509 31 Andreas Steffen
Feb 19 10:52:02 raspi5 systemd[1]: Started strongSwan IPsec IKEv1/IKEv2 daemon using swanctl.
510 31 Andreas Steffen
</pre>
511 31 Andreas Steffen
512 31 Andreas Steffen
The following *swanctl* command shows the two loaded connections
513 31 Andreas Steffen
<pre>
514 31 Andreas Steffen
swanctl --list-conns
515 31 Andreas Steffen
</pre>
516 31 Andreas Steffen
517 31 Andreas Steffen
<pre>
518 31 Andreas Steffen
rsa: IKEv2, reauthentication every 10800s, no rekeying
519 31 Andreas Steffen
  local:  10.10.0.105
520 31 Andreas Steffen
  remote: 10.10.0.104
521 31 Andreas Steffen
  local public key authentication:
522 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
523 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com
524 31 Andreas Steffen
  remote public key authentication:
525 31 Andreas Steffen
    id: raspi4.example.com
526 31 Andreas Steffen
  rsa: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
527 31 Andreas Steffen
    local:  dynamic
528 31 Andreas Steffen
    remote: dynamic
529 31 Andreas Steffen
</pre>
530 31 Andreas Steffen
531 31 Andreas Steffen
<pre>
532 31 Andreas Steffen
ecc: IKEv2, reauthentication every 10800s, no rekeying
533 31 Andreas Steffen
  local:  10.10.0.105
534 31 Andreas Steffen
  remote: 10.10.0.104
535 31 Andreas Steffen
  local public key authentication:
536 31 Andreas Steffen
    id: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
537 31 Andreas Steffen
    certs: C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com
538 31 Andreas Steffen
  remote public key authentication:
539 32 Andreas Steffen
    id: raspi4.example.com
540 31 Andreas Steffen
  ecc: TRANSPORT, rekeying every 3600s or 300000000 bytes or 500000 packets
541 31 Andreas Steffen
    local:  dynamic
542 31 Andreas Steffen
    remote: dynamic
543 31 Andreas Steffen
</pre>
544 31 Andreas Steffen
545 31 Andreas Steffen
The loaded certificates can also be displayed
546 31 Andreas Steffen
<pre>
547 31 Andreas Steffen
swanctl --list-certs
548 31 Andreas Steffen
</pre>
549 31 Andreas Steffen
550 31 Andreas Steffen
You can clearly see that the connection between the AK certificates and their matching AK private key has been established (..., has private key)
551 31 Andreas Steffen
<pre>
552 31 Andreas Steffen
List of X.509 End Entity Certificates
553 31 Andreas Steffen
554 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
555 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
556 31 Andreas Steffen
  validity:  not before Feb 19 09:33:43 2017, ok
557 31 Andreas Steffen
             not after  Aug 29 10:33:43 2026, ok (expires in 3477 days)
558 31 Andreas Steffen
  serial:    11:57:33:3e:2a:8e:8a:32
559 31 Andreas Steffen
  altNames:  raspi5.example.com
560 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
561 31 Andreas Steffen
  subjkeyId: f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
562 31 Andreas Steffen
  pubkey:    RSA 2048 bits, has private key
563 31 Andreas Steffen
  keyid:     71:21:f5:d4:7e:59:4a:88:16:ca:57:85:98:3d:36:a7:b1:d5:75:fa
564 31 Andreas Steffen
  subjkey:   f4:9e:85:7d:de:4e:67:f5:fb:87:03:98:67:3f:20:7c:f3:3f:2b:66
565 31 Andreas Steffen
566 31 Andreas Steffen
  subject:  "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
567 31 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
568 31 Andreas Steffen
  validity:  not before Feb 17 23:17:19 2017, ok
569 31 Andreas Steffen
             not after  Aug 30 00:17:19 2026, ok (expires in 3478 days)
570 31 Andreas Steffen
  serial:    52:9d:3e:42:6f:71:63:3d
571 31 Andreas Steffen
  altNames:  raspi5.example.com
572 31 Andreas Steffen
  authkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
573 31 Andreas Steffen
  subjkeyId: c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
574 31 Andreas Steffen
  pubkey:    ECDSA 256 bits, has private key
575 31 Andreas Steffen
  keyid:     71:49:7c:42:41:e7:c6:81:bc:31:73:f0:0f:7e:4a:e1:2d:53:00:38
576 31 Andreas Steffen
  subjkey:   c7:0e:63:f8:7f:6f:f6:55:00:e5:05:7f:5a:3e:6b:6c:e7:d2:d5:13
577 31 Andreas Steffen
</pre>
578 31 Andreas Steffen
579 31 Andreas Steffen
<pre>
580 1 Andreas Steffen
List of X.509 CA Certificates
581 32 Andreas Steffen
582 32 Andreas Steffen
  subject:  "C=US, O=TNC Demo, CN=TNC Demo CA"
583 43 Andreas Steffen
  issuer:   "C=US, O=TNC Demo, CN=TNC Demo CA"
584 32 Andreas Steffen
  validity:  not before Aug 31 10:29:27 2016, ok
585 38 Andreas Steffen
             not after  Aug 31 10:29:27 2026, ok (expires in 3479 days)
586 32 Andreas Steffen
  serial:    02:c8:85:e1:ef:fa:8f:20
587 32 Andreas Steffen
  flags:     CA CRLSign self-signed 
588 32 Andreas Steffen
  subjkeyId: 21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
589 32 Andreas Steffen
  pubkey:    ECDSA 256 bits
590 32 Andreas Steffen
  keyid:     a1:b5:e0:29:d0:4c:a7:62:bd:ca:a3:b4:af:18:42:2c:4a:01:55:9a
591 32 Andreas Steffen
  subjkey:   21:02:7e:2d:de:8b:77:48:75:de:56:2f:b5:d4:62:ec:c3:09:15:f2
592 32 Andreas Steffen
</pre>
593 32 Andreas Steffen
594 32 Andreas Steffen
h2. IKEv2 Authentication with RSA AIK Certificate
595 32 Andreas Steffen
596 32 Andreas Steffen
With the following *swanctl* command the "rsa" connection is established
597 32 Andreas Steffen
<pre>
598 32 Andreas Steffen
swanctl --initiate --child rsa
599 45 Andreas Steffen
</pre>
600 32 Andreas Steffen
601 40 Andreas Steffen
<pre>
602 40 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: vici initiate 'rsa'
603 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: initiating IKE_SA rsa[1] to 10.10.0.104
604 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) V ]
605 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes)
606 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes)
607 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) V ]
608 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received strongSwan vendor ID
609 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
610 32 Andreas Steffen
Feb 19 10:52:21 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
611 32 Andreas Steffen
</pre>
612 32 Andreas Steffen
613 32 Andreas Steffen
The RSA AK private key stored in the TPM 2.0 is used to generate an *RSA_EMSA_PKCS1_SHA2_256* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload.
614 32 Andreas Steffen
<pre>
615 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' (myself) with RSA_EMSA_PKCS1_SHA2_256 successful
616 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com"
617 32 Andreas Steffen
</pre>
618 32 Andreas Steffen
<pre>
619 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: establishing CHILD_SA rsa
620 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH N(USE_TRANSP) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
621 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (1296 bytes)
622 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes)
623 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: parsed IKE_AUTH response 1 [ IDr CERT AUTH N(USE_TRANSP) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(NO_ADD_ADDR) ]
624 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com"
625 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
626 38 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
627 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
628 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
629 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: IKE_SA rsa[1] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
630 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: scheduling reauthentication in 10507s
631 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11587s
632 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: CHILD_SA rsa{1} established with SPIs c23deb9d_i ce48d08e_o and TS 10.10.0.105/32 === 10.10.0.104/32
633 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 10103s, scheduling reauthentication in 9023s
634 32 Andreas Steffen
Feb 19 10:52:24 raspi5 charon-systemd[21165]: peer supports MOBIKE
635 32 Andreas Steffen
</pre>
636 32 Andreas Steffen
637 32 Andreas Steffen
The following *swanctl* command shows the established IPsec connection
638 32 Andreas Steffen
<pre>
639 32 Andreas Steffen
 swanctl --list-sas
640 32 Andreas Steffen
</pre>
641 32 Andreas Steffen
<pre>
642 32 Andreas Steffen
rsa: #1, ESTABLISHED, IKEv2, 7ba3b4d06c051ecb_i* 14e1769a8aeb7f28_r
643 32 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com' @ 10.10.0.105[4500]
644 38 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
645 33 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
646 33 Andreas Steffen
  established 252s ago, reauth in 8771s
647 33 Andreas Steffen
  rsa: #1, reqid 1, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
648 33 Andreas Steffen
    installed 252s ago, rekeying in 3258s, expires in 3708s
649 33 Andreas Steffen
    in  c23deb9d,    640 bytes,    10 packets,     3s ago
650 33 Andreas Steffen
    out ce48d08e,    640 bytes,    10 packets,     3s ago
651 33 Andreas Steffen
    local  10.10.0.105/32
652 33 Andreas Steffen
    remote 10.10.0.104/32
653 33 Andreas Steffen
</pre>
654 33 Andreas Steffen
655 33 Andreas Steffen
With this *swanctl* command the "rsa" connection is terminated
656 33 Andreas Steffen
<pre>
657 33 Andreas Steffen
swanctl --terminate --ike rsa
658 33 Andreas Steffen
</pre>
659 33 Andreas Steffen
660 43 Andreas Steffen
<pre>
661 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'rsa'
662 38 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: deleting IKE_SA rsa[1] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK RSA, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
663 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA rsa[1]
664 32 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
665 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
666 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
667 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
668 33 Andreas Steffen
Feb 19 10:59:16 raspi5 charon-systemd[21165]: IKE_SA deleted
669 33 Andreas Steffen
</pre>
670 33 Andreas Steffen
671 33 Andreas Steffen
h2. IKEv2 Authentication with ECC AIK Certificate
672 33 Andreas Steffen
673 33 Andreas Steffen
Next we initiate the "ecc" connection
674 33 Andreas Steffen
<pre>
675 33 Andreas Steffen
swanctl --initiate --child ecc
676 45 Andreas Steffen
</pre>
677 33 Andreas Steffen
678 40 Andreas Steffen
<pre>
679 40 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: vici initiate 'ecc'
680 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: initiating IKE_SA ecc[2] to 10.10.0.104
681 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) V ]
682 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[500] to 10.10.0.104[500] (1257 bytes)
683 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[500] to 10.10.0.105[500] (1259 bytes)
684 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ N(HASH_ALG) V ]
685 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received strongSwan vendor ID
686 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: received cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
687 33 Andreas Steffen
Feb 19 11:00:32 raspi5 charon-systemd[21165]: sending cert request for "C=US, O=TNC Demo, CN=TNC Demo CA"
688 33 Andreas Steffen
</pre>
689 33 Andreas Steffen
690 33 Andreas Steffen
The ECC AK private key stored in the TPM 2.0 is used to generate an *ECDSA_WITH_SHA256_DER* signature which is sent in the AUTH payload of the IKE_AUTH request. The matching client certificate is sent int the CERT payload.
691 33 Andreas Steffen
<pre>
692 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' (myself) with ECDSA_WITH_SHA256_DER successful
693 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending end entity cert "C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com"
694 33 Andreas Steffen
</pre>
695 33 Andreas Steffen
<pre>
696 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: establishing CHILD_SA ecc
697 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH N(USE_TRANSP) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
698 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (912 bytes)
699 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (752 bytes)
700 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: parsed IKE_AUTH response 1 [ IDr CERT AUTH N(USE_TRANSP) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(NO_ADD_ADDR) ]
701 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received end entity cert "C=US, O=TNC Demo, CN=raspi4.example.com"
702 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using certificate "C=US, O=TNC Demo, CN=raspi4.example.com"
703 39 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   using trusted ca certificate "C=US, O=TNC Demo, CN=TNC Demo CA"
704 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]:   reached self-signed root ca with a path length of 0
705 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: authentication of 'raspi4.example.com' with ECDSA_WITH_SHA256_DER successful
706 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: IKE_SA ecc[2] established between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
707 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: scheduling reauthentication in 10180s
708 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: maximum IKE_SA lifetime 11260s
709 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: CHILD_SA ecc{2} established with SPIs c2c16cd0_i c47ea6f6_o and TS 10.10.0.105/32 === 10.10.0.104/32
710 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: received AUTH_LIFETIME of 9880s, scheduling reauthentication in 8800s
711 33 Andreas Steffen
Feb 19 11:00:34 raspi5 charon-systemd[21165]: peer supports MOBIKE
712 33 Andreas Steffen
</pre>
713 33 Andreas Steffen
714 33 Andreas Steffen
The establed IKE and CHILD SAs are displayed
715 33 Andreas Steffen
<pre>
716 33 Andreas Steffen
 swanctl --list-sas
717 1 Andreas Steffen
</pre>
718 1 Andreas Steffen
<pre>
719 34 Andreas Steffen
ecc: #2, ESTABLISHED, IKEv2, b7f2652777b0996a_i* 12282b5964ff0658_r
720 34 Andreas Steffen
  local  'C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com' @ 10.10.0.105[4500]
721 39 Andreas Steffen
  remote 'raspi4.example.com' @ 10.10.0.104[4500]
722 34 Andreas Steffen
  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
723 34 Andreas Steffen
  established 126s ago, reauth in 8674s
724 34 Andreas Steffen
  ecc: #2, reqid 2, INSTALLED, TRANSPORT, ESP:AES_CBC-128/HMAC_SHA2_256_128
725 34 Andreas Steffen
    installed 126s ago, rekeying in 3252s, expires in 3834s
726 34 Andreas Steffen
    in  c2c16cd0,    320 bytes,     5 packets,     2s ago
727 34 Andreas Steffen
    out c47ea6f6,    320 bytes,     5 packets,     2s ago
728 34 Andreas Steffen
    local  10.10.0.105/32
729 34 Andreas Steffen
    remote 10.10.0.104/32
730 34 Andreas Steffen
</pre>
731 34 Andreas Steffen
732 34 Andreas Steffen
The IKE and CHILD SAs are terminated
733 34 Andreas Steffen
<pre>
734 34 Andreas Steffen
swanctl --terminate --ike ecc
735 34 Andreas Steffen
</pre>
736 34 Andreas Steffen
737 34 Andreas Steffen
<pre>
738 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: vici terminate IKE_SA 'ecc'
739 39 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: deleting IKE_SA ecc[2] between 10.10.0.105[C=US, O=TNC Demo, OU=AIK ECC, CN=raspi5.example.com]...10.10.0.104[raspi4.example.com]
740 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending DELETE for IKE_SA ecc[2]
741 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: generating INFORMATIONAL request 2 [ D ]
742 34 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: sending packet: from 10.10.0.105[4500] to 10.10.0.104[4500] (80 bytes)
743 1 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: received packet: from 10.10.0.104[4500] to 10.10.0.105[4500] (80 bytes)
744 1 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: parsed INFORMATIONAL response 2 [ ]
745 1 Andreas Steffen
Feb 19 11:04:32 raspi5 charon-systemd[21165]: IKE_SA deleted
746 1 Andreas Steffen
</pre>