#!/bin/bash # Generate a JWT, with signature verified using OpenSSL # # Prerequisites: openssl, jq # # Usage: source ./openssl_signing_console.sh # # For a more complete explanation, see ./openssl_signing_console.rst # Generate a key and extract the public part openssl ecparam -name secp256k1 -genkey -noout -out private.pem openssl ec -in private.pem -pubout -out public.pem # Use test data header='{"alg":"ES256K", "issuer": "", "typ":"JWT"}' payload='{"@context": "http://schema.org", "@type": "PlanAction", "identifier": "did:ethr:0xb86913f83A867b5Ef04902419614A6FF67466c12", "name": "Test", "description": "Me"}' header_b64=$(echo -n "$header" | jq -c -M . | tr -d '\n' | base64 | tr -d '=' | tr '+' '-' | tr '/' '_') payload_b64=$(echo -n "$payload" | jq -c -M . | tr -d '\n' | base64 | tr -d '=' | tr '+' '-' | tr '/' '_') signing_input="$header_b64.$payload_b64" signature=$(echo -n "$signing_input" | openssl dgst -sha256 -sign private.pem | openssl base64 -e) echo -n "$signing_input" | openssl dgst -sha256 -verify public.pem -signature <(echo -n "$signature" | openssl base64 -d) # Read binary signature and encode it to Base64 URL-Safe format signature_b64=$(echo -n "$signature" | base64 | tr -d '=' | tr '+' '-' | tr '/' '_') # Construct the JWT jwt="$signing_input.$signature_b64" echo Resulting JWT: $jwt