1*** Settings *** 2 3 4Documentation Suite to test certificate via DMTF redfishtool. 5 6Library OperatingSystem 7Library String 8Library Collections 9Library JSONLibrary 10 11Resource ../../lib/resource.robot 12Resource ../../lib/bmc_redfish_resource.robot 13Resource ../../lib/openbmc_ffdc.robot 14Resource ../../lib/certificate_utils.robot 15Resource ../../lib/dmtf_redfishtool_utils.robot 16 17Suite Setup Suite Setup Execution 18 19Force Tags Redfishtool_Certificate 20 21*** Variables *** 22 23${root_cmd_args} = SEPARATOR= 24... redfishtool raw -r ${OPENBMC_HOST}:${HTTPS_PORT} -u ${OPENBMC_USERNAME} -p ${OPENBMC_PASSWORD} -S Always 25${invalid_value} abc 26${keybit_length} ${2048} 27 28*** Test Cases *** 29 30 31Verify Redfishtool Replace Server Certificate Valid CertKey 32 [Documentation] Verify replace server certificate. 33 [Tags] Verify_Redfishtool_Replace_Server_Certificate_Valid_CertKey 34 35 Verify Redfishtool Replace Certificate Server Valid Certificate Valid Privatekey ok 36 37 38Verify Redfishtool Replace Client Certificate Valid CertKey 39 [Documentation] Verify replace client certificate. 40 [Tags] Verify_Redfishtool_Replace_Client_Certificate_Valid_CertKey 41 42 Verify Redfishtool Replace Certificate Client Valid Certificate Valid Privatekey ok 43 44 45Verify Redfishtool Replace CA Certificate Valid Cert 46 [Documentation] Verify replace CA certificate. 47 [Tags] Verify_Redfishtool_Replace_CA_Certificate_Valid_Cert 48 49 Verify Redfishtool Replace Certificate CA Valid Certificate ok 50 51 52Verify Redfishtool Client Certificate Install Valid CertKey 53 [Documentation] Verify client certificate installation. 54 [Tags] Verify_Redfishtool_Client_Certificate_Install_Valid_CertKey 55 56 Verify Redfishtool Install Certificate Client Valid Certificate Valid Privatekey ok 57 58 59Verify Redfishtool CA Certificate Install Valid Cert 60 [Documentation] Verify CA Certificate installation. 61 [Tags] Verify_Redfishtool_CA_Certificate_Install_Valid_Cert 62 63 Verify Redfishtool Install Certificate CA Valid Certificate ok 64 65 66Verify Redfishtool Replace Server Certificate Errors 67 [Documentation] Verify error while replacing invalid server certificate. 68 [Tags] Verify_Redfishtool_Replace_Server_Certificate_Errors 69 [Template] Verify Redfishtool Replace Certificate 70 71 Server Empty Certificate Empty Privatekey error 72 Server Empty Certificate Valid Privatekey error 73 Server Valid Certificate Empty Privatekey error 74 75 76Verify Redfishtool Replace Client Certificate Errors 77 [Documentation] Verify error while replacing invalid client certificate. 78 [Tags] Verify_Redfishtool_Replace_Client_Certificate_Errors 79 [Template] Verify Redfishtool Replace Certificate 80 81 Client Empty Certificate Empty Privatekey error 82 Client Empty Certificate Valid Privatekey error 83 Client Valid Certificate Empty Privatekey error 84 85 86Verify Redfishtool Replace CA Certificate Errors 87 [Documentation] Verify error while replacing invalid CA certificate. 88 [Tags] Verify_Redfishtool_Replace_CA_Certificate_Errors 89 [Template] Verify Redfishtool Replace Certificate 90 91 CA Empty Certificate error 92 93 94Verify Redfishtool Client Certificate Install Errors 95 [Documentation] Verify error while installing invalid client certificate. 96 [Tags] Verify_Redfishtool_Client_Certificate_Install_Errors 97 [Template] Verify Redfishtool Install Certificate 98 99 Client Empty Certificate Empty Privatekey error 100 Client Empty Certificate Valid Privatekey error 101 Client Valid Certificate Empty Privatekey error 102 103 104Verify Redfishtool CA Certificate Install Errors 105 [Documentation] Verify error while installing invalid CA certificate. 106 [Tags] Verify_Redfishtool_CA_Certificate_Install_Errors 107 [Template] Verify Redfishtool Install Certificate 108 109 # cert_type cert_format expected_status 110 CA Empty Certificate error 111 112 113Verify Error While Uploading Same CA Certificate Via Redfishtool 114 [Documentation] Verify error while uploading same CA certificate two times. 115 [Tags] Verify_Error_While_Uploading_Same_CA_Certificate_Via_Redfishtool 116 117 # Create certificate file for uploading. 118 ${cert_file_path}= Generate Certificate File Via Openssl Valid Certificate 365 119 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 120 ${file_data}= Decode Bytes To String ${bytes} UTF-8 121 122 # Install CA certificate. 123 Redfishtool Install Certificate File On BMC ${REDFISH_CA_CERTIFICATE_URI} ok data=${file_data} 124 125 # Adding delay after certificate installation. 126 Sleep 30s 127 128 # Check error while uploading same certificate. 129 Redfishtool Install Certificate File On BMC ${REDFISH_CA_CERTIFICATE_URI} error data=${file_data} 130 131 132Install Server Certificate Using Redfishtool And Verify Via OpenSSL 133 [Documentation] Install server certificate using Redfishtool and verify via OpenSSL. 134 [Tags] Install_Server_Certificate_Using_Redfishtool_And_Verify_Via_OpenSSL 135 136 ${cert_file_path}= Generate Certificate File Via Openssl Valid Certificate Valid Privatekey 137 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 138 ${file_data}= Decode Bytes To String ${bytes} UTF-8 139 140 ${certificate_dict}= Create Dictionary 141 ... @odata.id=/redfish/v1/Managers/${MANAGER_ID}/NetworkProtocol/HTTPS/Certificates/1 142 143 ${dict_objects}= Create Dictionary CertificateString=${file_data} 144 ... CertificateType=PEM CertificateUri=${certificate_dict} 145 146 ${string}= Convert To String ${dict_objects} 147 ${string}= Replace String ${string} ' " 148 ${payload}= Set Variable '${string}' 149 150 ${response}= Redfishtool Post 151 ... ${payload} /redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate 152 153 Wait Until Keyword Succeeds 2 mins 15 secs Verify Certificate Visible Via OpenSSL ${cert_file_path} 154 155 156Verify CSR Generation For Server Certificate Via Redfishtool 157 [Documentation] Verify CSR generation for server certificate. 158 [Tags] Verify_CSR_Generation_For_Server_Certificate_Via_Redfishtool 159 [Template] Generate CSR Via Redfishtool 160 161 # csr_type key_pair_algorithm key_bit_length key_curv_id expected_status 162 Server RSA ${keybit_length} ${EMPTY} ok 163 Server EC ${EMPTY} prime256v1 ok 164 Server EC ${EMPTY} secp521r1 ok 165 Server EC ${EMPTY} secp384r1 ok 166 167 168Verify CSR Generation For Client Certificate Via Redfishtool 169 [Documentation] Verify CSR generation for client certificate. 170 [Tags] Verify_CSR_Generation_For_Client_Certificate_Via_Redfishtool 171 [Template] Generate CSR Via Redfishtool 172 173 # csr_type key_pair_algorithm key_bit_length key_curv_id expected_status 174 Client RSA ${keybit_length} ${EMPTY} ok 175 Client EC ${EMPTY} prime256v1 ok 176 Client EC ${EMPTY} secp521r1 ok 177 Client EC ${EMPTY} secp384r1 ok 178 179 180Verify CSR Generation For Server Certificate With Invalid Value Via Redfishtool 181 [Documentation] Verify error while generating CSR for server certificate with invalid value. 182 [Tags] Verify_CSR_Generation_For_Server_Certificate_With_Invalid_Value_Via_Redfishtool 183 [Template] Generate CSR Via Redfishtool 184 185 # csr_type key_pair_algorithm key_bit_length key_curv_id expected_status 186 Server ${invalid_value} ${keybit_length} prime256v1 error 187 Server RAS ${invalid_value} ${EMPTY} error 188 189 190Verify CSR Generation For Client Certificate With Invalid Value Via Redfishtool 191 [Documentation] Verify error while generating CSR for client certificate with invalid value. 192 [Tags] Verify_CSR_Generation_For_Client_Certificate_With_Invalid_Value_Via_Redfishtool 193 [Template] Generate CSR Via Redfishtool 194 195 Client ${invalid_value} ${keybit_length} prime256v1 error 196 Client RSA ${invalid_value} ${EMPTY} error 197 198*** Keywords *** 199 200 201Generate CSR Via Redfishtool 202 [Documentation] Generate CSR using Redfish. 203 [Arguments] ${cert_type} ${key_pair_algorithm} ${key_bit_length} ${key_curv_id} ${expected_status} 204 205 # Description of argument(s): 206 # cert_type Certificate type ("Server" or "Client"). 207 # key_pair_algorithm CSR key pair algorithm ("EC" or "RSA"). 208 # key_bit_length CSR key bit length ("2048"). 209 # key_curv_id CSR key curv id ("prime256v1" or "secp521r1" or "secp384r1"). 210 # expected_status Expected status of certificate replace Redfishtool request ("ok" or "error"). 211 212 ${certificate_uri}= Set Variable If 213 ... '${cert_type}' == 'Server' ${REDFISH_HTTPS_CERTIFICATE_URI}/ 214 ... '${cert_type}' == 'Client' ${REDFISH_LDAP_CERTIFICATE_URI}/ 215 216 ${certificate_dict}= Create Dictionary @odata.id=${certificate_uri} 217 218 ${csr_dict}= Create Dictionary City=Austin CertificateCollection=${certificate_dict} 219 ... CommonName=${OPENBMC_HOST} Country=US Organization=xyz 220 ... OrganizationalUnit=ISL State=AU KeyBitLength=${key_bit_length} 221 ... KeyPairAlgorithm=${key_pair_algorithm} KeyCurveId=${key_curv_id} 222 223 # Remove not applicable field for CSR generation. 224 Run Keyword If '${key_pair_algorithm}' == 'EC' Remove From Dictionary ${csr_dict} KeyBitLength 225 ... ELSE IF '${key_pair_algorithm}' == 'RSA' Remove From Dictionary ${csr_dict} KeyCurveId 226 227 ${expected_resp}= Set Variable If 228 ... '${expected_status}' == 'ok' ${HTTP_OK}, ${HTTP_NO_CONTENT} 229 ... '${expected_status}' == 'error' ${HTTP_BAD_REQUEST} 230 231 ${string}= Convert To String ${csr_dict} 232 233 ${string2}= Replace String ${string} ' " 234 235 ${payload}= Set Variable '${string2}' 236 237 ${response}= Redfishtool Post 238 ... ${payload} /redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR 239 ... expected_error=${expected_resp} 240 241 # Delay added between two CSR generation request. 242 Sleep 5s 243 244 245Verify Redfishtool Install Certificate 246 [Documentation] Install and verify certificate using Redfishtool. 247 [Arguments] ${cert_type} ${cert_format} ${expected_status} ${delete_cert}=${True} 248 ... ${install_type}=install 249 250 # Description of argument(s): 251 # cert_type Certificate type (e.g. "Client" or "CA"). 252 # cert_format Certificate file format 253 # expected_status Expected status of certificate install Redfishtool 254 # request (i.e. "ok" or "error"). 255 # delete_cert Certificate will be deleted before installing if this True. 256 257 Run Keyword If '${cert_type}' == 'CA' 258 ... Delete All CA Certificate Via Redfishtool ${delete_cert} 259 ... ELSE IF '${cert_type}' == 'Client' 260 ... Redfishtool Delete Certificate Via BMC CLI ${cert_type} ${delete_cert} 261 262 Return From Keyword If "${install_type}" != "install" and "${file_status}" != "Not Found" 263 264 ${cert_file_path}= Generate Certificate File Via Openssl ${cert_format} 265 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 266 ${file_data}= Decode Bytes To String ${bytes} UTF-8 267 268 ${certificate_uri}= Set Variable If 269 ... '${cert_type}' == 'Client' ${REDFISH_LDAP_CERTIFICATE_URI} 270 ... '${cert_type}' == 'CA' ${REDFISH_CA_CERTIFICATE_URI} 271 272 ${cert_id}= Redfishtool Install Certificate File On BMC 273 ... ${certificate_uri} ${expected_status} data=${file_data} 274 Logging Installed certificate id: ${cert_id} 275 276 # Adding delay after certificate installation. 277 Sleep 30s 278 279 ${cert_file_content}= OperatingSystem.Get File ${cert_file_path} 280 281 ${bmc_cert_content}= Run Keyword If '${expected_status}' == 'ok' 282 ... Redfishtool GetAttribute ${certificate_uri}/${cert_id} CertificateString 283 284 Run Keyword If '${expected_status}' == 'ok' Should Contain ${cert_file_content} ${bmc_cert_content} 285 286 287Delete All CA Certificate Via Redfishtool 288 [Documentation] Delete all CA certificate via Redfish. 289 [Arguments] ${delete_cert}=${True} 290 291 ${cmd_output}= Redfishtool Get /redfish/v1/Managers/${MANAGER_ID}/Truststore/Certificates 292 ${cmd_output}= Convert String to JSON ${cmd_output} 293 ${cert_list}= Set Variable ${cmd_output["Members"]} 294 ${uri_length}= Get Length ${cert_list} 295 ${file_status}= Set Variable If 296 ... "${uri_length}" == "0" Not Found 297 ... "${uri_length}" != "0" Found 298 ${cert_id}= Set Variable If 299 ... "${uri_length}" != "0" ${cert_list[-1]["@odata.id"].split("/")[-1].strip()} 300 ... "${uri_length}" == "0" None 301 Set Test Variable ${cert_id} 302 Set Test Variable ${file_status} 303 Return From Keyword If "${file_status}" != "Found" or "${delete_cert}" != "${True}" 304 FOR ${cert} IN @{cert_list} 305 Redfishtool Delete ${cert["@odata.id"]} ${root_cmd_args} 306 END 307 308 309Redfishtool Delete Certificate Via BMC CLI 310 [Documentation] Delete certificate via BMC CLI. 311 [Arguments] ${cert_type} ${delete_cert}=${True} 312 313 # Description of argument(s): 314 # cert_type Certificate type (e.g. "Client" or "CA"). 315 316 ${certificate_file_path} ${certificate_service} ${certificate_uri}= 317 ... Run Keyword If '${cert_type}' == 'Client' 318 ... Set Variable /etc/nslcd/certs/cert.pem phosphor-certificate-manager@nslcd.service 319 ... ${REDFISH_LDAP_CERTIFICATE_URI} 320 ... ELSE IF '${cert_type}' == 'CA' 321 ... Set Variable ${ROOT_CA_FILE_PATH} phosphor-certificate-manager@authority.service 322 ... ${REDFISH_CA_CERTIFICATE_URI} 323 324 ${file_status} ${stderr} ${rc}= BMC Execute Command 325 ... [ -f ${certificate_file_path} ] && echo "Found" || echo "Not Found" 326 327 Set Test Variable ${file_status} 328 Return From Keyword If "${file_status}" != "Found" or '${delete_cert}' != "${True}" 329 BMC Execute Command rm ${certificate_file_path} 330 BMC Execute Command systemctl restart ${certificate_service} 331 BMC Execute Command systemctl daemon-reload 332 333 334Redfishtool Install Certificate File On BMC 335 [Documentation] Install certificate file in BMC using POST operation. 336 [Arguments] ${uri} ${status}=ok &{kwargs} 337 338 # Description of argument(s): 339 # uri URI for installing certificate file via Redfishtool. 340 # e.g. "/redfish/v1/AccountService/LDAP/Certificates". 341 # status Expected status of certificate installation via Redfishtool. 342 # e.g. error, ok. 343 # kwargs A dictionary of keys/values to be passed directly to 344 # POST Request. 345 346 Initialize OpenBMC 20 ${quiet}=${1} ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} 347 348 ${headers}= Create Dictionary Content-Type=application/octet-stream 349 ... X-Auth-Token=${XAUTH_TOKEN} 350 Set To Dictionary ${kwargs} headers ${headers} 351 352 ${resp}= POST On Session openbmc ${uri} &{kwargs} expected_status=any 353 ${cert_id}= Set Variable If 354 ... '${resp.status_code}' == '${HTTP_OK}' ${resp.json()["Id"]} 355 ... '${resp.status_code}' == '${HTTP_NO_CONTENT}' ${resp.json()["Id"]} -1 356 357 Run Keyword If '${status}' == 'ok' 358 ... Should Contain Any "${resp.status_code}" ${HTTP_OK} ${HTTP_NO_CONTENT} 359 ... ELSE IF '${status}' == 'error' 360 ... Should Be Equal As Strings ${resp.status_code} ${HTTP_INTERNAL_SERVER_ERROR} 361 362 Delete All Sessions 363 364 [Return] ${cert_id} 365 366 367Verify Redfishtool Replace Certificate 368 [Documentation] Verify replace server certificate. 369 [Arguments] ${cert_type} ${cert_format} ${expected_status} 370 371 # Description of argument(s): 372 # cert_type Certificate type (e.g. "Client", "Server" or "CA"). 373 # cert_format Certificate file format 374 # (e.g. "Valid_Certificate_Valid_Privatekey"). 375 # expected_status Expected status of certificate replace Redfishtool 376 # request (i.e. "ok" or "error"). 377 378 # Install certificate before replacing client or CA certificate. 379 Run Keyword If '${cert_type}' == 'Client' 380 ... Verify Redfishtool Install Certificate ${cert_type} ${cert_format} ${expected_status} 381 ... ${False} replace 382 ... ELSE IF '${cert_type}' == 'CA' 383 ... Verify Redfishtool Install Certificate ${cert_type} ${cert_format} ${expected_status} 384 ... ${False} replace 385 386 ${cert_file_path}= Generate Certificate File Via Openssl ${cert_format} 387 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 388 ${file_data}= Decode Bytes To String ${bytes} UTF-8 389 390 ${certificate_uri}= Set Variable If 391 ... '${cert_type}' == 'Server' ${REDFISH_HTTPS_CERTIFICATE_URI}/1 392 ... '${cert_type}' == 'Client' ${REDFISH_LDAP_CERTIFICATE_URI}/1 393 ... '${cert_type}' == 'CA' ${REDFISH_CA_CERTIFICATE_URI}/${cert_id} 394 395 ${certificate_dict}= Create Dictionary @odata.id=${certificate_uri} 396 ${dict_objects}= Create Dictionary CertificateString=${file_data} 397 ... CertificateType=PEM CertificateUri=${certificate_dict} 398 ${string}= Convert To String ${dict_objects} 399 ${string}= Replace String ${string} ' " 400 ${payload}= Set Variable '${string}' 401 402 ${expected_resp}= Set Variable If 403 ... '${expected_status}' == 'ok' ${HTTP_OK}, ${HTTP_NO_CONTENT} 404 ... '${expected_status}' == 'error' ${HTTP_NOT_FOUND},${HTTP_INTERNAL_SERVER_ERROR} 405 406 ${response}= Redfishtool Post 407 ... ${payload} /redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate 408 ... expected_error=${expected_resp} 409 410 ${cert_file_content}= OperatingSystem.Get File ${cert_file_path} 411 Sleep 5s 412 ${bmc_cert_content}= Redfishtool GetAttribute ${certificate_uri} CertificateString 413 414 Run Keyword If '${expected_status}' == 'ok' 415 ... Should Contain ${cert_file_content} ${bmc_cert_content} 416 ... ELSE 417 ... Should Not Contain ${cert_file_content} ${bmc_cert_content} 418 419 420Redfishtool GetAttribute 421 [Documentation] Execute redfishtool for GET operation. 422 [Arguments] ${uri} ${Attribute} ${cmd_args}=${root_cmd_args} ${expected_error}="" 423 424 # Description of argument(s): 425 # uri URI for GET operation (e.g. /redfish/v1/AccountService/Accounts/). 426 # Attribute The specific attribute to be retrieved with the URI. 427 # cmd_args Commandline arguments. 428 # expected_error Expected error optionally provided in testcase (e.g. 401 / 429 # authentication error, etc. ). 430 431 ${rc} ${cmd_output}= Run and Return RC and Output ${cmd_args} GET ${uri} 432 Run Keyword If ${rc} != 0 Is HTTP error Expected ${cmd_output} ${expected_error} 433 434 ${cmd_output}= Convert String to JSON ${cmd_output} 435 436 [Return] ${cmd_output["CertificateString"]} 437 438 439Suite Setup Execution 440 [Documentation] Do suite setup execution. 441 442 ${tool_exist}= Run which redfishtool 443 Should Not Be Empty ${tool_exist} 444 445 # Create certificate sub-directory in current working directory. 446 Create Directory certificate_dir 447