1c6623b6fSZbigniew Kurzynski# How to configure the server TLS certificates for authentication 2c6623b6fSZbigniew Kurzynski 3*f4febd00SPatrick WilliamsAuthor: Zbigniew Kurzynski <zbigniew.kurzynski@intel.com> 4*f4febd00SPatrick Williams 5*f4febd00SPatrick WilliamsCreated: May 8, 2020 6c6623b6fSZbigniew Kurzynski 7c6623b6fSZbigniew KurzynskiRelated documents: 8*f4febd00SPatrick Williams 9*f4febd00SPatrick Williams- [Redfish TLS User Authentication](https://github.com/openbmc/docs/blob/master/designs/redfish-tls-user-authentication.md) 10c6623b6fSZbigniew Kurzynski 11c6623b6fSZbigniew Kurzynski## Introduction 12*f4febd00SPatrick Williams 13*f4febd00SPatrick WilliamsWith help of this guidebook you should be able to create both client and server 14*f4febd00SPatrick Williamscertificates signed by a CA that can be used to authenticate user requests to an 15*f4febd00SPatrick WilliamsOpenBMC server. You will also learn how to enable and test the OpenBMC TLS 16*f4febd00SPatrick Williamsauthentication. 17c6623b6fSZbigniew Kurzynski 18c6623b6fSZbigniew Kurzynski## Certificates 19c6623b6fSZbigniew Kurzynski 20*f4febd00SPatrick WilliamsFor a certificate to be marked as valid, it (and every certificate in the chain) 21*f4febd00SPatrick Williamshas to meet these conditions: 22*f4febd00SPatrick Williams 23*f4febd00SPatrick Williams- `KeyUsage` contains required purpose `digitalSignature` and `keyAgreement` 24c6623b6fSZbigniew Kurzynski (see rfc 3280 4.2.1.3) 25*f4febd00SPatrick Williams- `ExtendedKeyUsage` contains required purpose `clientAuth` for client 26c6623b6fSZbigniew Kurzynski certificate and `serverAuth` for server certificate (see rfc 3280 4.2.1.13) 27*f4febd00SPatrick Williams- public key meets minimal bit length requirement 28*f4febd00SPatrick Williams- certificate has to be in its validity period 29*f4febd00SPatrick Williams- `notBefore` and `notAfter` fields have to contain valid time 30*f4febd00SPatrick Williams- has to be properly signed by certificate authority 31*f4febd00SPatrick Williams- certificate is well-formed according to X.509 32*f4febd00SPatrick Williams- issuer name has to match CA's subject name for client certificate 33*f4febd00SPatrick Williams- issuer name has to match the fully qualified domain name of your OpenBMC host 34c6623b6fSZbigniew Kurzynski 35*f4febd00SPatrick WilliamsIf you already have certificates you can skip to 36*f4febd00SPatrick Williams[Enable TLS authentication ](#Enable-TLS-authentication) or go to 37*f4febd00SPatrick Williams[Verify certificates](#Verify-certificates) and check if they meet the above 38*f4febd00SPatrick Williamsrequirements. 39c6623b6fSZbigniew Kurzynski 40c6623b6fSZbigniew Kurzynski### Prepare configuration files 41c6623b6fSZbigniew Kurzynski 42*f4febd00SPatrick WilliamsTo generate certificates with required parameters some modification must be made 43*f4febd00SPatrick Williamsto the default openssl configuration file. 44c6623b6fSZbigniew Kurzynski 45*f4febd00SPatrick WilliamsFirst create a new folder named `ca` and create a configuration file using the 46*f4febd00SPatrick Williamsdefault configuration as a template (we do not want to change the original one). 47*f4febd00SPatrick WilliamsThe location of the configuration file may vary depending on the operating 48*f4febd00SPatrick Williamssystem. For Ubuntu it is usually `/usr/lib/ssl/openssl.cnf`, but can also can be 49*f4febd00SPatrick Williamsat `/etc/ssl/openssl.cnf`. For Cygwin it might be 50c6623b6fSZbigniew Kurzynski`/etc/defaults/etc/pki/tls/openssl.cnf` or `/etc/pki/tls/openssl.cnf`. 51c6623b6fSZbigniew Kurzynski 52c6623b6fSZbigniew Kurzynski``` 53c6623b6fSZbigniew Kurzynskimkdir ~/ca 54c6623b6fSZbigniew Kurzynskicd ~/ca 55c6623b6fSZbigniew Kurzynskicp /usr/lib/ssl/openssl.cnf openssl-client.cnf 56c6623b6fSZbigniew Kurzynski``` 57c6623b6fSZbigniew Kurzynski 58*f4febd00SPatrick WilliamsThen open the client `~/ca/openssl-client.cnf` file in your favorite editor, for 59*f4febd00SPatrick Williamsexample `vi`. 60c6623b6fSZbigniew Kurzynski 61c6623b6fSZbigniew Kurzynski``` 62c6623b6fSZbigniew Kurzynskivi ~/ca/openssl-client.cnf 63c6623b6fSZbigniew Kurzynski``` 64c6623b6fSZbigniew Kurzynski 65c6623b6fSZbigniew KurzynskiFind the sections listed below and add or choose the presented values. 66c6623b6fSZbigniew Kurzynski 67c6623b6fSZbigniew Kurzynski``` 68c6623b6fSZbigniew Kurzynski[ req ] 69c6623b6fSZbigniew Kurzynskireq_extensions = v3_req 70c6623b6fSZbigniew Kurzynski 71c6623b6fSZbigniew Kurzynski[ usr_cert ] 72c6623b6fSZbigniew KurzynskiextendedKeyUsage = clientAuth 73c6623b6fSZbigniew Kurzynski 74c6623b6fSZbigniew Kurzynski[ v3_req ] 75c6623b6fSZbigniew KurzynskiextendedKeyUsage = clientAuth 76c6623b6fSZbigniew KurzynskikeyUsage = digitalSignature, keyAgreement 77c6623b6fSZbigniew Kurzynski``` 78c6623b6fSZbigniew Kurzynski 79c6623b6fSZbigniew KurzynskiNow create a server configuration `openssl-server.cnf` by copying the client 80c6623b6fSZbigniew Kurzynskifile 81c6623b6fSZbigniew Kurzynski 82c6623b6fSZbigniew Kurzynski``` 83c6623b6fSZbigniew Kurzynskicp ~/ca/openssl-client.cnf openssl-server.cnf 84c6623b6fSZbigniew Kurzynski``` 85c6623b6fSZbigniew Kurzynski 86c6623b6fSZbigniew Kurzynskiand changing values presented in the sections listed below. 87c6623b6fSZbigniew Kurzynski 88c6623b6fSZbigniew Kurzynski``` 89c6623b6fSZbigniew Kurzynski[ usr_cert ] 90c6623b6fSZbigniew KurzynskiextendedKeyUsage = serverAuth 91c6623b6fSZbigniew Kurzynski 92c6623b6fSZbigniew Kurzynski[ v3_req ] 93c6623b6fSZbigniew KurzynskiextendedKeyUsage = serverAuth 94c6623b6fSZbigniew Kurzynski``` 95c6623b6fSZbigniew Kurzynski 96c6623b6fSZbigniew KurzynskiCreate two additional configuration files `myext-client.cnf` and 97*f4febd00SPatrick Williams`myext-server.cnf` for the client and server certificates respectively. Without 98*f4febd00SPatrick Williamsthese files no extensions are added to the certificate. 99c6623b6fSZbigniew Kurzynski 100c6623b6fSZbigniew Kurzynski``` 101c6623b6fSZbigniew Kurzynskicat << END > myext-client.cnf 102c6623b6fSZbigniew Kurzynski[ my_ext_section ] 103c6623b6fSZbigniew KurzynskikeyUsage = digitalSignature, keyAgreement 104c6623b6fSZbigniew KurzynskiextendedKeyUsage = clientAuth 105c6623b6fSZbigniew KurzynskiauthorityKeyIdentifier = keyid 106c6623b6fSZbigniew KurzynskiEND 107c6623b6fSZbigniew Kurzynski``` 108*f4febd00SPatrick Williams 109c6623b6fSZbigniew Kurzynski``` 110c6623b6fSZbigniew Kurzynskicat << END > myext-server.cnf 111c6623b6fSZbigniew Kurzynski[ my_ext_section ] 112c6623b6fSZbigniew KurzynskikeyUsage = digitalSignature, keyAgreement 113c6623b6fSZbigniew KurzynskiextendedKeyUsage = serverAuth 114c6623b6fSZbigniew KurzynskiauthorityKeyIdentifier = keyid 115c6623b6fSZbigniew KurzynskiEND 116c6623b6fSZbigniew Kurzynski``` 117c6623b6fSZbigniew Kurzynski 118c6623b6fSZbigniew Kurzynski### Create a new CA certificate 119*f4febd00SPatrick Williams 120c6623b6fSZbigniew KurzynskiFirst we need to create a private key to sign the CA certificate. 121*f4febd00SPatrick Williams 122c6623b6fSZbigniew Kurzynski``` 123c6623b6fSZbigniew Kurzynskiopenssl genrsa -out CA-key.pem 2048 124c6623b6fSZbigniew Kurzynski``` 125c6623b6fSZbigniew Kurzynski 126*f4febd00SPatrick WilliamsNow we can create a CA certificate, using the previously generated key. You will 127*f4febd00SPatrick Williamsbe prompted for information which will be incorporated into the certificate, 128*f4febd00SPatrick Williamssuch as Country, City, Company Name, etc. 129c6623b6fSZbigniew Kurzynski 130c6623b6fSZbigniew Kurzynski``` 131c6623b6fSZbigniew Kurzynskiopenssl req -new -config openssl-client.cnf -key CA-key.pem -x509 -days 1000 -out CA-cert.pem 132c6623b6fSZbigniew Kurzynski``` 133c6623b6fSZbigniew Kurzynski 134c6623b6fSZbigniew Kurzynski### Create client certificate signed by given CA certificate 135*f4febd00SPatrick Williams 136c6623b6fSZbigniew KurzynskiTo create a client certificate, a signing request must be created first. For 137c6623b6fSZbigniew Kurzynskithis another private key will be needed. 138c6623b6fSZbigniew Kurzynski 139c6623b6fSZbigniew KurzynskiGenerate a new key that will be used to sign the certificate signing request: 140*f4febd00SPatrick Williams 141c6623b6fSZbigniew Kurzynski``` 142c6623b6fSZbigniew Kurzynskiopenssl genrsa -out client-key.pem 2048 143c6623b6fSZbigniew Kurzynski``` 144*f4febd00SPatrick Williams 145c6623b6fSZbigniew KurzynskiGenerate a certificate signing request. 146c6623b6fSZbigniew Kurzynski 147c6623b6fSZbigniew KurzynskiYou will be prompted for the same information as during CA generation, but 148*f4febd00SPatrick Williamsprovide **the OpenBMC system user name** for the `CommonName` attribute of this 149*f4febd00SPatrick Williamscertificate. In this example, use **root**. 150c6623b6fSZbigniew Kurzynski 151c6623b6fSZbigniew Kurzynski``` 152c6623b6fSZbigniew Kurzynskiopenssl req -new -config openssl-client.cnf -key client-key.pem -out signingReqClient.csr 153c6623b6fSZbigniew Kurzynski``` 154c6623b6fSZbigniew Kurzynski 155c6623b6fSZbigniew KurzynskiSign the certificate using your `CA-cert.pem` certificate with following 156c6623b6fSZbigniew Kurzynskicommand: 157*f4febd00SPatrick Williams 158c6623b6fSZbigniew Kurzynski``` 159c6623b6fSZbigniew Kurzynskiopenssl x509 -req -extensions my_ext_section -extfile myext-client.cnf -days 365 -in signingReqClient.csr -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -out client-cert.pem 160c6623b6fSZbigniew Kurzynski``` 161*f4febd00SPatrick Williams 162c6623b6fSZbigniew KurzynskiThe file `client-cert.pem` now contains a signed client certificate. 163c6623b6fSZbigniew Kurzynski 164c6623b6fSZbigniew Kurzynski### Create server certificate signed by given CA certificate 165*f4febd00SPatrick Williams 166*f4febd00SPatrick WilliamsFor convenience we will use the same CA generated in paragraph 167*f4febd00SPatrick Williams[Create a new CA certificate](#Create-a-new-CA-certificate), although a 168*f4febd00SPatrick Williamsdifferent one could be used. 169c6623b6fSZbigniew Kurzynski 170c6623b6fSZbigniew KurzynskiGenerate a new key that will be used to sign the server certificate signing 171c6623b6fSZbigniew Kurzynskirequest: 172*f4febd00SPatrick Williams 173c6623b6fSZbigniew Kurzynski``` 174c6623b6fSZbigniew Kurzynskiopenssl genrsa -out server-key.pem 2048 175c6623b6fSZbigniew Kurzynski``` 176*f4febd00SPatrick Williams 177c6623b6fSZbigniew KurzynskiGenerate a certificate signing request. You will be prompted for the same 178*f4febd00SPatrick Williamsinformation as during CA generation, but provide **the fully qualified domain 179*f4febd00SPatrick Williamsname of your OpenBMC server** for the `CommonName` attribute of this 180*f4febd00SPatrick Williamscertificate. In this example it will be `bmc.example.com`. A wildcard can be 181*f4febd00SPatrick Williamsused to protect multiple host, for example a certificate configured for 182c6623b6fSZbigniew Kurzynski`*.example.com` will secure www.example.com, as well as mail.example.com, 183c6623b6fSZbigniew Kurzynskiblog.example.com, and others. 184c6623b6fSZbigniew Kurzynski 185c6623b6fSZbigniew Kurzynski``` 186c6623b6fSZbigniew Kurzynskiopenssl req -new -config openssl-server.cnf -key server-key.pem -out signingReqServer.csr 187c6623b6fSZbigniew Kurzynski``` 188c6623b6fSZbigniew Kurzynski 189c6623b6fSZbigniew KurzynskiSign the certificate using your `CA-cert.pem` certificate with following 190c6623b6fSZbigniew Kurzynskicommand: 191*f4febd00SPatrick Williams 192c6623b6fSZbigniew Kurzynski``` 193c6623b6fSZbigniew Kurzynskiopenssl x509 -req -extensions my_ext_section -extfile myext-server.cnf -days 365 -in signingReqServer.csr -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -out server-cert.pem 194c6623b6fSZbigniew Kurzynski``` 195*f4febd00SPatrick Williams 19694687a16SPatrick WilliamsThe file `server-cert.pem` now contains a signed server certificate. 197c6623b6fSZbigniew Kurzynski 198c6623b6fSZbigniew Kurzynski### Verify certificates 199*f4febd00SPatrick Williams 200c6623b6fSZbigniew KurzynskiTo verify the signing request and both certificates you can use following 201c6623b6fSZbigniew Kurzynskicommands. 202c6623b6fSZbigniew Kurzynski 203c6623b6fSZbigniew Kurzynski``` 204c6623b6fSZbigniew Kurzynskiopenssl x509 -in CA-cert.pem -text -noout 205c6623b6fSZbigniew Kurzynskiopenssl x509 -in client-cert.pem -text -noout 206c6623b6fSZbigniew Kurzynskiopenssl x509 -in server-cert.pem -text -noout 207c6623b6fSZbigniew Kurzynskiopenssl req -in signingReqClient.csr -noout -text 208c6623b6fSZbigniew Kurzynskiopenssl req -in signingReqServer.csr -noout -text 209c6623b6fSZbigniew Kurzynski``` 210c6623b6fSZbigniew Kurzynski 211c6623b6fSZbigniew KurzynskiBelow are example listings that you can compare with your results. Pay special 212c6623b6fSZbigniew Kurzynskiattention to attributes like: 213*f4febd00SPatrick Williams 214*f4febd00SPatrick Williams- Validity in both certificates, 215*f4febd00SPatrick Williams- `Issuer` in `client-cert.pem`, it must match to `Subject` in `CA-cert.pem`, 216*f4febd00SPatrick Williams- Section _X509v3 extensions_ in `client-cert.pem` it should contain proper 217c6623b6fSZbigniew Kurzynski values, 218*f4febd00SPatrick Williams- `Public-Key` length, it cannot be less than 2048 bits. 219*f4febd00SPatrick Williams- `Subject` CN in `client-cert.pem`, it should match existing OpemBMC user name. 220c6623b6fSZbigniew Kurzynski In this example it is **root**. 221*f4febd00SPatrick Williams- `Subject` CN in `server-cert.pem`, it should match OpemBMC host name. In this 222*f4febd00SPatrick Williams example it is **bmc.example.com **. (see rfc 3280 4.2.1.11 for name 223*f4febd00SPatrick Williams constraints) 224c6623b6fSZbigniew Kurzynski 225c6623b6fSZbigniew KurzynskiBelow are fragments of generated certificates that you can compare with. 226*f4febd00SPatrick Williams 227c6623b6fSZbigniew Kurzynski``` 228c6623b6fSZbigniew KurzynskiCA-cert.pem 229c6623b6fSZbigniew Kurzynski Data: 230c6623b6fSZbigniew Kurzynski Version: 3 (0x2) 231c6623b6fSZbigniew Kurzynski Serial Number: 16242916899984461675 (0xe16a6edca3c34f6b) 232c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 233c6623b6fSZbigniew Kurzynski Issuer: C=US, ST=California, L=San Francisco, O=Intel, CN=Test CA 234c6623b6fSZbigniew Kurzynski Validity 235c6623b6fSZbigniew Kurzynski Not Before: May 11 11:40:48 2020 GMT 236c6623b6fSZbigniew Kurzynski Not After : Feb 5 11:40:48 2023 GMT 237c6623b6fSZbigniew Kurzynski Subject: C=US, ST=California, L=San Francisco, O=Intel, CN=Test CA 238c6623b6fSZbigniew Kurzynski Subject Public Key Info: 239c6623b6fSZbigniew Kurzynski Public Key Algorithm: rsaEncryption 240c6623b6fSZbigniew Kurzynski Public-Key: (2048 bit) 241c6623b6fSZbigniew Kurzynski Modulus: 242c6623b6fSZbigniew Kurzynski 00:d4:24:c1:1d:ac:85:8c:5b:42:e4:f8:a8:d8:7c: 243c6623b6fSZbigniew Kurzynski ... 244c6623b6fSZbigniew Kurzynski 55:83:8b:aa:ac:ac:6e:e3:01:2b:ce:f7:ee:87:21: 245c6623b6fSZbigniew Kurzynski f9:2b 246c6623b6fSZbigniew Kurzynski Exponent: 65537 (0x10001) 247c6623b6fSZbigniew Kurzynski X509v3 extensions: 248c6623b6fSZbigniew Kurzynski X509v3 Subject Key Identifier: 249c6623b6fSZbigniew Kurzynski ED:FF:80:A7:F8:DA:99:7F:94:35:95:F0:92:74:1A:55:CD:DF:BA:FE 250c6623b6fSZbigniew Kurzynski X509v3 Authority Key Identifier: 251c6623b6fSZbigniew Kurzynski keyid:ED:FF:80:A7:F8:DA:99:7F:94:35:95:F0:92:74:1A:55:CD:DF:BA:FE 252c6623b6fSZbigniew Kurzynski 253c6623b6fSZbigniew Kurzynski X509v3 Basic Constraints: 254c6623b6fSZbigniew Kurzynski CA:TRUE 255c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 256c6623b6fSZbigniew Kurzynski cc:8b:61:6a:55:60:2b:26:55:9f:a6:0c:42:b0:47:d4:ec:e0: 257c6623b6fSZbigniew Kurzynski ... 258c6623b6fSZbigniew Kurzynski 45:47:91:62:10:bd:3e:a8:da:98:33:65:cc:11:23:95:06:1b: 259c6623b6fSZbigniew Kurzynski ee:d3:78:84 260c6623b6fSZbigniew Kurzynski``` 261*f4febd00SPatrick Williams 262c6623b6fSZbigniew Kurzynski``` 263c6623b6fSZbigniew Kurzynskiclient-cert.pem 264c6623b6fSZbigniew Kurzynski Data: 265c6623b6fSZbigniew Kurzynski Version: 3 (0x2) 266c6623b6fSZbigniew Kurzynski Serial Number: 10150871893861973895 (0x8cdf2434b223bf87) 267c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 268c6623b6fSZbigniew Kurzynski Issuer: C=US, ST=California, L=San Francisco, O=Intel, CN=Test CA 269c6623b6fSZbigniew Kurzynski Validity 270c6623b6fSZbigniew Kurzynski Not Before: May 11 11:42:58 2020 GMT 271c6623b6fSZbigniew Kurzynski Not After : May 11 11:42:58 2021 GMT 272c6623b6fSZbigniew Kurzynski Subject: C=US, ST=California, L=San Francisco, O=Intel, CN=root 273c6623b6fSZbigniew Kurzynski Subject Public Key Info: 274c6623b6fSZbigniew Kurzynski Public Key Algorithm: rsaEncryption 275c6623b6fSZbigniew Kurzynski Public-Key: (2048 bit) 276c6623b6fSZbigniew Kurzynski Modulus: 277c6623b6fSZbigniew Kurzynski 00:cf:d6:d0:a2:09:62:df:e9:a9:b1:e1:3d:7f:2f: 278c6623b6fSZbigniew Kurzynski ... 279c6623b6fSZbigniew Kurzynski 30:7b:48:dc:c5:2c:3f:a9:c0:d1:b6:04:d4:1a:c8: 280c6623b6fSZbigniew Kurzynski 8a:51 281c6623b6fSZbigniew Kurzynski Exponent: 65537 (0x10001) 282c6623b6fSZbigniew Kurzynski X509v3 extensions: 283c6623b6fSZbigniew Kurzynski X509v3 Key Usage: 284c6623b6fSZbigniew Kurzynski Digital Signature, Key Agreement 285c6623b6fSZbigniew Kurzynski X509v3 Extended Key Usage: 286c6623b6fSZbigniew Kurzynski TLS Web Client Authentication 287c6623b6fSZbigniew Kurzynski X509v3 Authority Key Identifier: 288c6623b6fSZbigniew Kurzynski keyid:ED:FF:80:A7:F8:DA:99:7F:94:35:95:F0:92:74:1A:55:CD:DF:BA:FE 289c6623b6fSZbigniew Kurzynski 290c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 291c6623b6fSZbigniew Kurzynski 7f:a4:57:f5:97:48:2a:c4:8e:d3:ef:d8:a1:c9:65:1b:20:fd: 292c6623b6fSZbigniew Kurzynski ... 293c6623b6fSZbigniew Kurzynski 25:cb:5e:0a:37:fb:a1:ab:b0:c4:62:fe:51:d3:1c:1b:fb:11: 294c6623b6fSZbigniew Kurzynski 56:57:4c:6a 295c6623b6fSZbigniew Kurzynski``` 296*f4febd00SPatrick Williams 297c6623b6fSZbigniew Kurzynski``` 298c6623b6fSZbigniew Kurzynskiserver-cert.pem 299c6623b6fSZbigniew Kurzynski Data: 300c6623b6fSZbigniew Kurzynski Version: 3 (0x2) 301c6623b6fSZbigniew Kurzynski Serial Number: 10622848005881387807 (0x936beffaa586db1f) 302c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 303c6623b6fSZbigniew Kurzynski Issuer: C=US, ST=z, L=z, O=z, OU=z, CN=bmc.example.com 304c6623b6fSZbigniew Kurzynski Validity 305c6623b6fSZbigniew Kurzynski Not Before: May 22 13:46:02 2020 GMT 306c6623b6fSZbigniew Kurzynski Not After : May 22 13:46:02 2021 GMT 307c6623b6fSZbigniew Kurzynski Subject: C=US, ST=z, L=z, O=z, OU=z, CN=bmc.example.com 308c6623b6fSZbigniew Kurzynski Subject Public Key Info: 309c6623b6fSZbigniew Kurzynski Public Key Algorithm: rsaEncryption 310c6623b6fSZbigniew Kurzynski Public-Key: (2048 bit) 311c6623b6fSZbigniew Kurzynski Modulus: 312c6623b6fSZbigniew Kurzynski 00:d9:34:9c:da:83:c6:eb:af:8f:e8:11:56:2a:59: 313c6623b6fSZbigniew Kurzynski ... 314c6623b6fSZbigniew Kurzynski 92:60:09:fc:f9:66:82:d0:27:03:44:2f:9d:6d:c0: 315c6623b6fSZbigniew Kurzynski a5:6d 316c6623b6fSZbigniew Kurzynski Exponent: 65537 (0x10001) 317c6623b6fSZbigniew Kurzynski X509v3 extensions: 318c6623b6fSZbigniew Kurzynski X509v3 Key Usage: 319c6623b6fSZbigniew Kurzynski Digital Signature, Key Agreement 320c6623b6fSZbigniew Kurzynski X509v3 Extended Key Usage: 321c6623b6fSZbigniew Kurzynski TLS Web Server Authentication 322c6623b6fSZbigniew Kurzynski X509v3 Authority Key Identifier: 323c6623b6fSZbigniew Kurzynski keyid:5B:1D:0E:76:CC:54:B8:BF:AE:46:10:43:6F:79:0B:CA:14:5C:E0:90 324c6623b6fSZbigniew Kurzynski 325c6623b6fSZbigniew Kurzynski Signature Algorithm: sha256WithRSAEncryption 326c6623b6fSZbigniew Kurzynski bf:41:e2:2f:87:44:25:d8:54:9c:4e:dc:cc:b3:f9:af:5a:a3: 327c6623b6fSZbigniew Kurzynski ... 328c6623b6fSZbigniew Kurzynski ef:0f:90:a6 329c6623b6fSZbigniew Kurzynski 330c6623b6fSZbigniew Kurzynski``` 331c6623b6fSZbigniew Kurzynski 332c6623b6fSZbigniew Kurzynski## Installing CA certificate on OpenBMC 333c6623b6fSZbigniew Kurzynski 334c6623b6fSZbigniew KurzynskiThe CA certificate can be installed via Redfish Service. The file `CA-cert.pem` 335*f4febd00SPatrick Williamscan not be uploaded directly but must be sent embedded in a valid JSON string, 336*f4febd00SPatrick Williamswhich requires `\`, `"`, and control characters must be escaped. This means all 337*f4febd00SPatrick Williamscontent is placed in a single string on a single line by encoding the line 338*f4febd00SPatrick Williamsendings as `\n`. The command below prepares a whole POST body and puts it into a 339*f4febd00SPatrick Williamsfile named: `install_ca.json`. 340c6623b6fSZbigniew Kurzynski 341c6623b6fSZbigniew Kurzynski``` 342c6623b6fSZbigniew Kurzynskicat << END > install_ca.json 343c6623b6fSZbigniew Kurzynski{ 344c6623b6fSZbigniew Kurzynski "CertificateString":"$(cat CA-cert.pem | sed -n -e '1h;1!H;${x;s/\n/\\n/g;p;}')", 345c6623b6fSZbigniew Kurzynski "CertificateType": "PEM" 346c6623b6fSZbigniew Kurzynski} 347c6623b6fSZbigniew KurzynskiEND 348c6623b6fSZbigniew Kurzynski``` 349c6623b6fSZbigniew Kurzynski 350c6623b6fSZbigniew KurzynskiTo install the CA certificate on the OpenBMC server post the content of 351c6623b6fSZbigniew Kurzynski`install_ca.json` with this command: 352c6623b6fSZbigniew Kurzynski 353*f4febd00SPatrick WilliamsWhere `${bmc}` should be `bmc.example.com`. It is convenient to export it as an 354*f4febd00SPatrick Williamsenvironment variable. 355c6623b6fSZbigniew Kurzynski 356c6623b6fSZbigniew Kurzynski``` 357c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -d @install_ca.json -k -X POST https://${bmc}/redfish/v1/Managers/bmc/Truststore/Certificates 358c6623b6fSZbigniew Kurzynski 359c6623b6fSZbigniew Kurzynski``` 360c6623b6fSZbigniew Kurzynski 361c6623b6fSZbigniew KurzynskiCredentials `root:0penBmc` can be replaced with any system user name and 362c6623b6fSZbigniew Kurzynskipassword of your choice but with proper access rights to resources used here. 363c6623b6fSZbigniew Kurzynski 364*f4febd00SPatrick WilliamsAfter successful certificate installation you should get positive HTTP response 365*f4febd00SPatrick Williamsand a new certificate should be available under this resource collection. 366c6623b6fSZbigniew Kurzynski 367c6623b6fSZbigniew Kurzynski``` 368c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -k https://${bmc}/redfish/v1/Managers/bmc/Truststore/Certificates 369c6623b6fSZbigniew Kurzynski 370c6623b6fSZbigniew Kurzynski``` 371c6623b6fSZbigniew Kurzynski 372*f4febd00SPatrick WilliamsAn auto-generated self-signed server certificate is already present on OpenBMC 373*f4febd00SPatrick Williamsby default. To use the certificate signed by our CA it must be replaced. 374*f4febd00SPatrick WilliamsAdditionally we must upload to OpenBMC the private key that was used to sign the 375*f4febd00SPatrick Williamsserver certificate. A proper message mody can be prepared the with this command: 376c6623b6fSZbigniew Kurzynski 377c6623b6fSZbigniew Kurzynski``` 378c6623b6fSZbigniew Kurzynskicat << END > replace_cert.json 379c6623b6fSZbigniew Kurzynski{ 380c6623b6fSZbigniew Kurzynski "CertificateString":"$(cat server-key.pem server-cert.pem | sed -n -e '1h;1!H;${x;s/\n/\\n/g;p;}')", 381c6623b6fSZbigniew Kurzynski "CertificateUri": 382c6623b6fSZbigniew Kurzynski { 383c6623b6fSZbigniew Kurzynski "@odata.id": "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/1" 384c6623b6fSZbigniew Kurzynski }, 385c6623b6fSZbigniew Kurzynski "CertificateType": "PEM" 386c6623b6fSZbigniew Kurzynski} 387c6623b6fSZbigniew KurzynskiEND 388c6623b6fSZbigniew Kurzynski``` 389c6623b6fSZbigniew Kurzynski 390c6623b6fSZbigniew KurzynskiTo replace the server certificate on the OpenBMC server post the content of 391c6623b6fSZbigniew Kurzynski`replace_cert.json` with this command: 392c6623b6fSZbigniew Kurzynski 393c6623b6fSZbigniew Kurzynski``` 394c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -d @replace_cert.json -k -X POST https://${bmc}/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate/ 395c6623b6fSZbigniew Kurzynski 396c6623b6fSZbigniew Kurzynski``` 397c6623b6fSZbigniew Kurzynski 398c6623b6fSZbigniew Kurzynski## Enable TLS authentication 399c6623b6fSZbigniew Kurzynski 400c6623b6fSZbigniew KurzynskiTo check current state of the TLS authentication method use this command: 401c6623b6fSZbigniew Kurzynski 402c6623b6fSZbigniew Kurzynski``` 403c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -k https://${bmc}/redfish/v1/AccountService 404c6623b6fSZbigniew Kurzynski``` 405*f4febd00SPatrick Williams 406c6623b6fSZbigniew Kurzynskiand verify that the attribute `Oem->OpenBMC->AuthMethods->TLS` is set to true. 407c6623b6fSZbigniew Kurzynski 408c6623b6fSZbigniew KurzynskiTo enable TLS authentication use this command: 409c6623b6fSZbigniew Kurzynski 410c6623b6fSZbigniew Kurzynski``` 411c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -k -X PATCH -H "ContentType:application/json" --data '{"Oem": {"OpenBMC": {"AuthMethods": { "TLS": true} } } }' https://${bmc}/redfish/v1/AccountService 412c6623b6fSZbigniew Kurzynski``` 413c6623b6fSZbigniew Kurzynski 414c6623b6fSZbigniew KurzynskiTo disable TLS authentication use this command: 415c6623b6fSZbigniew Kurzynski 416c6623b6fSZbigniew Kurzynski``` 417c6623b6fSZbigniew Kurzynskicurl --user root:0penBmc -k -X PATCH -H "ContentType:application/json" --data '{"Oem": {"OpenBMC": {"AuthMethods": { "TLS": false} } } }' https://${bmc}/redfish/v1/AccountService 418c6623b6fSZbigniew Kurzynski``` 419c6623b6fSZbigniew Kurzynski 420c6623b6fSZbigniew KurzynskiOther authentication methods like basic authentication can be enabled or 421*f4febd00SPatrick Williamsdisabled as well using the same mechanism. All supported authentication methods 422*f4febd00SPatrick Williamsare available under attribute `Oem->OpenBMC->AuthMethods` of the 423c6623b6fSZbigniew Kurzynski`/redfish/v1/AccountService` resource. 424c6623b6fSZbigniew Kurzynski 425c6623b6fSZbigniew Kurzynski## Using TLS to access OpenBMC resources 426c6623b6fSZbigniew Kurzynski 427*f4febd00SPatrick WilliamsIf TLS is enabled, valid CA certificate was uploaded and the server certificate 428*f4febd00SPatrick Williamswas replaced it should be possible to execute curl requests using only client 429*f4febd00SPatrick Williamscertificate, key, and CA like below. 430c6623b6fSZbigniew Kurzynski 431c6623b6fSZbigniew Kurzynski``` 432c6623b6fSZbigniew Kurzynskicurl --cert client-cert.pem --key client-key.pem -vvv --cacert CA-cert.pem https://${bmc}/redfish/v1/SessionService/Sessions 433c6623b6fSZbigniew Kurzynski``` 434*f4febd00SPatrick Williams 435c6623b6fSZbigniew Kurzynski## Common mistakes during TLS configuration 436c6623b6fSZbigniew Kurzynski 437*f4febd00SPatrick Williams- Invalid date and time on OpenBMC, 438c6623b6fSZbigniew Kurzynski 439*f4febd00SPatrick Williams- Testing Redfish resources, like `https://${bmc}/redfish/v1` which are always 440*f4febd00SPatrick Williams available without any authentication will always result with success, even 441*f4febd00SPatrick Williams when TLS is disabled or certificates are invalid. 442c6623b6fSZbigniew Kurzynski 443*f4febd00SPatrick Williams- Certificates do not meet the requirements. See paragraphs 444c6623b6fSZbigniew Kurzynski [Verify certificates](#Verify-certificates). 445c6623b6fSZbigniew Kurzynski 446*f4febd00SPatrick Williams- Attempting to load the same certificate twice will end up with an error. 447b685fd04SJohn Edward Broadbent 448*f4febd00SPatrick Williams- Not having phosphor-bmcweb-cert-config in the build. 449