#!/bin/bash # Helper script to generate a certificate chain # alternative certificates might sign the OCSP responses. # # (C) 2022 Jack Lloyd # (C) 2022 René Meusel (Rohde & Schwarz Cybersecurity) # # Botan is released under the Simplified BSD License (see license.txt) if [ "$(date "+%y%m%d")" != "220922" ]; then echo "You should use a time machine to run this script..." echo "Use libfaketime to set the system clock back to the 22nd of September 2022. This recreates the certificates with the same timestamps as used in the tests and saves you from re-setting the validation reference dates." echo echo "Like so (path is for Ubuntu, might vary):" echo " LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 FAKETIME=\"2022-09-22 12:00:00\" $0 $*" exit 1 fi set -ex PREFIX="mychain_" ROOTkey="root.key" ROOTcsr="root.csr" ROOTcert="${PREFIX}root.pem" ROOTconf="root.conf" INTkey="int.key" INTcsr="int.csr" INTcert="${PREFIX}int.pem" INTconf="int.conf" DELRESPkey="int_ocsp_delegate_responder.key" DELRESPcsr="int_ocsp_delegate_responder.csr" DELRESPcert="${PREFIX}int_ocsp_delegate_responder.pem" DELRESPconf="int_ocsp_delegate_responder.conf" DELRESPnoOCSPcsr="int_ocsp_delegate_responder_no_ocsp_key_usage.csr" DELRESPnoOCSPcert="${PREFIX}int_ocsp_delegate_responder_no_ocsp_key_usage.pem" DELRESPnoOCSPconf="int_ocsp_delegate_responder_no_ocsp_key_usage.conf" EEkey="ee.key" EEcsr="ee.csr" EEcert="${PREFIX}ee.pem" EEconf="ee.conf" # # Create the Root CA # cat > $ROOTconf < $INTconf < $DELRESPconf < $DELRESPnoOCSPconf < $EEconf < "$CAindex" elif [ "$subjectStatus" = "revoked" ]; then formatted_currentdate=$(date "+%y%m%d%H%M%S") printf 'R\t%sZ\t%sZ\t%s\tunknown\t%s\n' "$formatted_enddate" "$formatted_currentdate" "$serial" "$subject" > "$CAindex" else echo "Don't understand OCSP response status: $subjectStatus" exit 1 fi if [ "$stapling" = "no_staple" ]; then staple="-resp_no_certs" else staple="" fi # generate an OCSP response using the just-created certificate openssl ocsp -issuer "$caCert" -cert "$subjectCert" -reqout $ocspReq -text -no_nonce openssl ocsp -reqin $ocspReq -rsigner "$responderCert" -rkey "$responderKey" -CA "$caCert" -index $CAindex -ndays 30 -respout "$ocspResponse" $staple -text } # (Malformed) OCSP response for Intermediate signed by Intermediate itself create_ocsp_response $INTcert $ROOTcert $INTcert $INTkey "valid" "${PREFIX}ocsp_for_int_self_signed.der" "no_staple" # (Malformed) OCSP response for End Entity signed by Root certificate create_ocsp_response $EEcert $INTcert $ROOTcert $ROOTkey "valid" "${PREFIX}ocsp_for_ee_root_signed.der" "no_staple" # OCSP response for End Entity signed by Intermediate certificate create_ocsp_response $EEcert $INTcert $INTcert $INTkey "valid" "${PREFIX}ocsp_for_ee.der" "no_staple" # OCSP response for End Entity signed by Delegate Responder of Intermediate certificate create_ocsp_response $EEcert $INTcert $DELRESPcert $DELRESPkey "valid" "${PREFIX}ocsp_for_ee_delegate_signed.der" "staple" # OCSP response for End Entity signed by Delegate Responder of Intermediate certificate that does not have sufficient key usage flags create_ocsp_response $EEcert $INTcert $DELRESPnoOCSPcert $DELRESPkey "valid" "${PREFIX}ocsp_for_ee_delegate_signed_malformed.der" "staple"