|
 |
9a1adf |
#!/usr/bin/env bash
|
|
 |
9a1adf |
set -e
|
|
 |
9a1adf |
|
|
 |
9a1adf |
PROG="$(basename "$0")"
|
|
 |
9a1adf |
|
|
 |
9a1adf |
printUsage() {
|
|
 |
9a1adf |
echo "Usage: $PROG ENTITY-ID ENDPOINT-URL"
|
|
 |
9a1adf |
echo ""
|
|
 |
9a1adf |
echo "Example:"
|
|
 |
9a1adf |
echo " $PROG urn:someservice https://sp.example.org/mellon"
|
|
 |
9a1adf |
echo ""
|
|
 |
9a1adf |
}
|
|
 |
9a1adf |
|
|
 |
9a1adf |
if [ "$#" -lt 2 ]; then
|
|
 |
9a1adf |
printUsage
|
|
 |
9a1adf |
exit 1
|
|
 |
9a1adf |
fi
|
|
 |
9a1adf |
|
|
 |
9a1adf |
ENTITYID="$1"
|
|
 |
9a1adf |
if [ -z "$ENTITYID" ]; then
|
|
 |
9a1adf |
echo "$PROG: An entity ID is required." >&2
|
|
 |
9a1adf |
exit 1
|
|
 |
9a1adf |
fi
|
|
 |
9a1adf |
|
|
 |
9a1adf |
BASEURL="$2"
|
|
 |
9a1adf |
if [ -z "$BASEURL" ]; then
|
|
 |
9a1adf |
echo "$PROG: The URL to the MellonEndpointPath is required." >&2
|
|
 |
9a1adf |
exit 1
|
|
 |
9a1adf |
fi
|
|
 |
9a1adf |
|
|
 |
9a1adf |
if ! echo "$BASEURL" | grep -q '^https\?://'; then
|
|
 |
9a1adf |
echo "$PROG: The URL must start with \"http://\" or \"https://\"." >&2
|
|
 |
9a1adf |
exit 1
|
|
 |
9a1adf |
fi
|
|
 |
9a1adf |
|
|
 |
9a1adf |
HOST="$(echo "$BASEURL" | sed 's#^[a-z]*://\([^/]*\).*#\1#')"
|
|
 |
9a1adf |
BASEURL="$(echo "$BASEURL" | sed 's#/$##')"
|
|
 |
9a1adf |
|
|
 |
9a1adf |
OUTFILE="$(echo "$ENTITYID" | sed 's/[^0-9A-Za-z.]/_/g' | sed 's/__*/_/g')"
|
|
 |
9a1adf |
echo "Output files:"
|
|
 |
9a1adf |
echo "Private key: $OUTFILE.key"
|
|
 |
9a1adf |
echo "Certificate: $OUTFILE.cert"
|
|
 |
9a1adf |
echo "Metadata: $OUTFILE.xml"
|
|
 |
9a1adf |
echo "Host: $HOST"
|
|
 |
9a1adf |
echo
|
|
 |
9a1adf |
echo "Endpoints:"
|
|
 |
9a1adf |
echo "SingleLogoutService (SOAP): $BASEURL/logout"
|
|
 |
9a1adf |
echo "SingleLogoutService (HTTP-Redirect): $BASEURL/logout"
|
|
 |
9a1adf |
echo "AssertionConsumerService (HTTP-POST): $BASEURL/postResponse"
|
|
 |
9a1adf |
echo "AssertionConsumerService (HTTP-Artifact): $BASEURL/artifactResponse"
|
|
 |
9a1adf |
echo "AssertionConsumerService (PAOS): $BASEURL/paosResponse"
|
|
 |
9a1adf |
echo
|
|
 |
9a1adf |
|
|
 |
9a1adf |
|
|
 |
9a1adf |
umask 0077
|
|
 |
9a1adf |
|
|
 |
9a1adf |
TEMPLATEFILE="$(mktemp -t mellon_create_sp.XXXXXXXXXX)"
|
|
 |
9a1adf |
|
|
 |
9a1adf |
cat >"$TEMPLATEFILE" <
|
|
 |
9a1adf |
RANDFILE = /dev/urandom
|
|
 |
9a1adf |
[req]
|
|
 |
9a1adf |
default_bits = 2048
|
|
 |
9a1adf |
default_keyfile = privkey.pem
|
|
 |
9a1adf |
distinguished_name = req_distinguished_name
|
|
 |
9a1adf |
prompt = no
|
|
 |
9a1adf |
policy = policy_anything
|
|
 |
9a1adf |
[req_distinguished_name]
|
|
 |
9a1adf |
commonName = $HOST
|
|
 |
9a1adf |
EOF
|
|
 |
9a1adf |
|
|
 |
9a1adf |
openssl req -utf8 -batch -config "$TEMPLATEFILE" -new -x509 -days 3652 -nodes -out "$OUTFILE.cert" -keyout "$OUTFILE.key" 2>/dev/null
|
|
 |
9a1adf |
|
|
 |
9a1adf |
rm -f "$TEMPLATEFILE"
|
|
 |
9a1adf |
|
|
 |
9a1adf |
CERT="$(grep -v '^-----' "$OUTFILE.cert")"
|
|
 |
9a1adf |
|
|
 |
9a1adf |
cat >"$OUTFILE.xml" <
|
|
 |
9a1adf |
|
|
 |
9a1adf |
|
|
 |
9a1adf |
entityID="$ENTITYID"
|
|
 |
9a1adf |
xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
|
|
 |
9a1adf |
|
|
 |
9a1adf |
AuthnRequestsSigned="true"
|
|
 |
9a1adf |
WantAssertionsSigned="true"
|
|
 |
9a1adf |
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
|
|
 |
9a1adf |
<KeyDescriptor use="signing">
|
|
 |
9a1adf |
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
|
 |
9a1adf |
<ds:X509Data>
|
|
 |
9a1adf |
<ds:X509Certificate>$CERT</ds:X509Certificate>
|
|
 |
9a1adf |
</ds:X509Data>
|
|
 |
9a1adf |
</ds:KeyInfo>
|
|
 |
9a1adf |
</KeyDescriptor>
|
|
 |
9a1adf |
<KeyDescriptor use="encryption">
|
|
 |
9a1adf |
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
|
 |
9a1adf |
<ds:X509Data>
|
|
 |
9a1adf |
<ds:X509Certificate>$CERT</ds:X509Certificate>
|
|
 |
9a1adf |
</ds:X509Data>
|
|
 |
9a1adf |
</ds:KeyInfo>
|
|
 |
9a1adf |
</KeyDescriptor>
|
|
 |
9a1adf |
|
|
 |
9a1adf |
Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
|
|
 |
9a1adf |
Location="$BASEURL/logout" />
|
|
 |
9a1adf |
|
|
 |
9a1adf |
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
|
|
 |
9a1adf |
Location="$BASEURL/logout" />
|
|
 |
9a1adf |
<NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
|
|
 |
9a1adf |
|
|
 |
9a1adf |
index="0"
|
|
 |
9a1adf |
isDefault="true"
|
|
 |
9a1adf |
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
|
|
 |
9a1adf |
Location="$BASEURL/postResponse" />
|
|
 |
9a1adf |
|
|
 |
9a1adf |
index="1"
|
|
 |
9a1adf |
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
|
|
 |
9a1adf |
Location="$BASEURL/artifactResponse" />
|
|
 |
9a1adf |
|
|
 |
9a1adf |
index="2"
|
|
 |
9a1adf |
Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS"
|
|
 |
9a1adf |
Location="$BASEURL/paosResponse" />
|
|
 |
9a1adf |
</SPSSODescriptor>
|
|
 |
9a1adf |
</EntityDescriptor>
|
|
 |
9a1adf |
EOF
|
|
 |
9a1adf |
|
|
 |
9a1adf |
umask 0777
|
|
 |
9a1adf |
chmod go+r "$OUTFILE.xml"
|
|
 |
9a1adf |
chmod go+r "$OUTFILE.cert"
|