The public/private key pairs were generated with the following commands:

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem


The signature was generated by:

1) Take the contents of payload.json and base64url encode them:
cat payload.json | tr -d \\n | base64 -w0 | tr / _ | tr + \- | tr -d '=' > payload_encoded.txt

2) Put the contents of payload_encoded.txt into the "payload" field of
verified_contents.json.

3) Copy the contents of the "protected" field from verified_contents.json into
protected.txt.

4) Concatenate the "protected" and "payload" fields with a '.' separator.

echo -n '.' | cat protected.txt - payload_encoded.txt > signature_input.txt

5) Sign it

tr -d \\n < signature_input.txt | openssl dgst -sha256 -sign private_key.pem -binary | base64 -w0  | tr / _ | tr + \- | tr -d '=' > signature.txt

6) Put the contents of signature.txt into the "signature" field in
verified_contents.json.