This has now been moved to a proper GitHub repository: https://github.com/njh/gen-webid-cert
Please submit issues and enhancements there.
This has now been moved to a proper GitHub repository: https://github.com/njh/gen-webid-cert
Please submit issues and enhancements there.
| #!/bin/sh | |
| # | |
| # gen-webid-cert.sh: WebID Self-signed Certificate Generator | |
| # | |
| # This is free and unencumbered software released into the public domain. | |
| # | |
| # Anyone is free to copy, modify, publish, use, compile, sell, or | |
| # distribute this software, either in source code form or as a compiled | |
| # binary, for any purpose, commercial or non-commercial, and by any | |
| # means. | |
| # | |
| # In jurisdictions that recognize copyright laws, the author or authors | |
| # of this software dedicate any and all copyright interest in the | |
| # software to the public domain. We make this dedication for the benefit | |
| # of the public at large and to the detriment of our heirs and | |
| # successors. We intend this dedication to be an overt act of | |
| # relinquishment in perpetuity of all present and future rights to this | |
| # software under copyright law. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
| # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
| # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
| # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
| # OTHER DEALINGS IN THE SOFTWARE. | |
| # | |
| # For more information, please refer to <http://unlicense.org/> | |
| # | |
| # Be safe about permissions | |
| umask 077 | |
| echo "WebID Self-signed Certificate Generator." | |
| echo "This script will create a certificate and snippet of RDF for you." | |
| echo "For more information about WebID visit: http://webid.info/" | |
| echo | |
| # Check that OpenSSL is available | |
| command -v openssl >/dev/null 2>&1 || { | |
| echo >&2 "The scripts requires OpenSSL but it is not available. Aborting." | |
| exit 1 | |
| } | |
| # Check that certificate already exists | |
| if [ -e webid.pem -o -e webid.p12 ]; then | |
| echo >&2 "webid.pem already exists." | |
| echo >&2 "Please delete it if you would like to create a new one." | |
| exit 1 | |
| fi | |
| # Ask for certificate details | |
| read -p "Please enter your name: " NAME | |
| [ -z "$NAME" ] && { echo "No name given, aborting."; exit 1; } | |
| read -p "Please enter your WebID [example https://www.example.com/foaf.rdf#me]: " WEBID | |
| [ -z "$WEBID" ] && { echo "No WebID given, aborting."; exit 1; } | |
| # Create an OpenSSL configuration file | |
| OPENSSL_CONFIG=`mktemp -q /tmp/webid-openssl-conf.XXXXXXXX` | |
| if [ ! $? -eq 0 ]; then | |
| echo >&2 "Could not create temporary OpenSSL config file. Aborting." | |
| exit 1 | |
| fi | |
| cat <<EOF > $OPENSSL_CONFIG | |
| [ req ] | |
| default_md = sha1 | |
| default_bits = 2048 | |
| distinguished_name = req_distinguished_name | |
| encrypt_key = no | |
| string_mask = nombstr | |
| x509_extensions = req_ext | |
| [ req_distinguished_name ] | |
| commonName = Common Name (eg, YOUR name) | |
| commonName_default = WebID for $NAME | |
| UID = A user ID | |
| UID_default="$WEBID" | |
| [ req_ext ] | |
| subjectKeyIdentifier = hash | |
| subjectAltName = critical,@subject_alt | |
| basicConstraints = CA:false | |
| extendedKeyUsage = clientAuth | |
| nsCertType = client | |
| [ subject_alt ] | |
| URI.1="$WEBID" | |
| EOF | |
| # Create the self-signed certificate as a PEM file | |
| openssl req -new -batch \ | |
| -days 3650 \ | |
| -config $OPENSSL_CONFIG \ | |
| -keyout webid.pem \ | |
| -out webid.pem \ | |
| -x509 | |
| RESULT=$? | |
| rm -f $OPENSSL_CONFIG | |
| if [ ! $RESULT -eq 0 ]; then | |
| echo >&2 "Failed to create certificate. Aborting." | |
| exit 1 | |
| fi | |
| # Display information about the certificate that was generated | |
| openssl x509 -in webid.pem -noout -text | |
| # Offer to convert to P12 format | |
| read -p "Would you like to create a P12 file (for import into Firefox)? [y/N]" DOP12 | |
| if [ "$DOP12" == 'y' -o "$DOP12" == 'Y' ]; then | |
| openssl pkcs12 -export -clcerts \ | |
| -name "WebID for $NAME" \ | |
| -in webid.pem \ | |
| -inkey webid.pem \ | |
| -out webid.p12 | |
| fi | |
| # Offer to load the certificate into Keychain on Mac OS X | |
| if [ -e ~/Library/Keychains/login.keychain ]; then | |
| read -p "Would you like to import the certificate into your Mac OS X keychain? [y/N]" DOIMPORT | |
| if [ "$DOIMPORT" == 'y' -o "$DOIMPORT" == 'Y' ]; then | |
| security import webid.pem -k ~/Library/Keychains/login.keychain | |
| fi | |
| fi | |
| # Display RDF/XML | |
| MODULUS=`openssl rsa -in webid.pem -modulus -noout | awk '{print substr($0,9)}'` | |
| EXPONENT=`openssl rsa -in webid.pem -text -noout | awk '/Exponent/ { print $2 }'` | |
| echo | |
| echo "Upload this RDF/XML to the location of your WebID:" | |
| echo | |
| echo "<?xml version=\"1.0\"?>" | |
| echo "<rdf:RDF" | |
| echo " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"" | |
| echo " xmlns:cert=\"http://www.w3.org/ns/auth/cert#\"" | |
| echo " xmlns:foaf=\"http://xmlns.com/foaf/0.1/\">" | |
| echo " <foaf:Person rdf:about=\"$WEBID\">" | |
| echo " <foaf:name>$NAME</foaf:name>" | |
| echo " <cert:key>" | |
| echo " <cert:RSAPublicKey>" | |
| echo " <cert:modulus rdf:datatype=\"http://www.w3.org/2001/XMLSchema#hexBinary\">$MODULUS</cert:modulus>" | |
| echo " <cert:exponent rdf:datatype=\"http://www.w3.org/2001/XMLSchema#integer\">$EXPONENT</cert:exponent>" | |
| echo " </cert:RSAPublicKey>" | |
| echo " </cert:key>" | |
| echo " </foaf:Person>" | |
| echo "</rdf:RDF>" | |
| echo | |
| echo "Your certificate has been written to webid.pem in the current directory." | |
| echo |