blob: 636d6d56ce17ce6216f3b0698c367aafd83b3c46 [file] [log] [blame]
#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
MY_PATH="$(dirname "$(readlink -f "$0")")"
CRL_HTTP_PORT=8186
PASSWORD=password
ROOT_CA=MyRootCA
INTERMEDIATE_CA=intermediate_ca
OPENSSL_DIR="$MY_PATH/openssl"
OPENSSL_CONF="$OPENSSL_DIR/openssl.conf"
CERTIFICATES_DIR="$MY_PATH/certificates"
VALID_DAYS=1461
CLIENT_KEYSTORE="$CERTIFICATES_DIR/client_keystore.jks"
CLIENT_TRUSTSTORE="$CERTIFICATES_DIR/client_truststore.jks"
CLIENT_EXPIRED_KEYSTORE="$CERTIFICATES_DIR/client_expired_keystore.jks"
CLIENT_EXPIRED_CRT="$CERTIFICATES_DIR/client_expired.crt"
CLIENT_UNTRUSTED_KEYSTORE="$CERTIFICATES_DIR/client_untrusted_keystore.jks"
BROKER_KEYSTORE="$CERTIFICATES_DIR/broker_keystore.jks"
BROKER_TRUSTSTORE="$CERTIFICATES_DIR/broker_truststore.jks"
BROKER_PEERSTORE="$CERTIFICATES_DIR/broker_peerstore.jks"
BROKER_EXPIRED_TRUSTSTORE="$CERTIFICATES_DIR/broker_expired_truststore.jks"
BROKER_CRT="$CERTIFICATES_DIR/broker.crt"
BROKER_CSR="$CERTIFICATES_DIR/broker.csr"
BROKER_ALIAS="broker"
TEST_KEYSTORE="$CERTIFICATES_DIR/test_keystore.jks"
TEST_PK_ONLY_KEYSTORE="$CERTIFICATES_DIR/test_pk_only_keystore.jks"
TEST_CERT_ONLY_KEYSTORE="$CERTIFICATES_DIR/test_cert_only_keystore.jks"
TEST_SYMMETRIC_KEY_KEYSTORE="$CERTIFICATES_DIR/test_symmetric_key_keystore.jks"
TEST_EMPTY_KEYSTORE="$CERTIFICATES_DIR/test_empty_keystore.jks"
# set to true for debug
DEBUG=false
generate_selfsigned_ca()
{
echo "Generating selfsigned CA certificate"
openssl req -x509 -newkey rsa:2048 -keyout "$CERTIFICATES_DIR/$ROOT_CA.key" -out "$CERTIFICATES_DIR/$ROOT_CA.crt" -days 1461 -subj '/C=CA/ST=Ontario/O=ACME/CN=MyRootCA' -passout pass:$PASSWORD -sha512 && \
keytool -import -alias rootca -file "$CERTIFICATES_DIR/$ROOT_CA.crt" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -keystore "$CLIENT_KEYSTORE" && \
keytool -import -alias rootca -file "$CERTIFICATES_DIR/$ROOT_CA.crt" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -keystore "$CLIENT_TRUSTSTORE" && \
keytool -import -alias rootca -file "$CERTIFICATES_DIR/$ROOT_CA.crt" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -keystore "$BROKER_KEYSTORE" && \
keytool -import -alias rootca -file "$CERTIFICATES_DIR/$ROOT_CA.crt" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -keystore "$BROKER_TRUSTSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Selfsigned CA certificate successfully generated"
else
echo "Failed to generate selfsigned CA certificate" >&2
fi
return $_rc
}
prepare_openssl_environment()
{
echo "Preparing openssl environment"
rm -rf "$CERTIFICATES_DIR" && \
mkdir "$CERTIFICATES_DIR" && \
rm -rf "$OPENSSL_DIR" && \
mkdir "$OPENSSL_DIR" && \
cp "$MY_PATH/openssl.conf" "$OPENSSL_DIR" && \
sed -i "s|^dir = .|dir = $OPENSSL_DIR|" "$OPENSSL_CONF" && \
echo 1234 > "$OPENSSL_DIR"/serial && \
echo 1234 > "$OPENSSL_DIR"/crlnumber && \
touch "$OPENSSL_DIR"/index.txt && \
echo "unique_subject = no" > "$OPENSSL_DIR"/index.txt.attr && \
mkdir "$OPENSSL_DIR"/newcerts
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Openssl environment successfully prepared"
else
echo "Failed to prepare openssl environment" >&2
fi
return $_rc
}
# $1 - alias
generate_signed_certificate()
{
_alias=$1
_subject="/C=CA/ST=ON/L=Toronto/O=acme/OU=art/CN=$_alias@acme.org"
echo "Generating CA signed certificate '$_alias'"
openssl req -x509 -newkey rsa:2048 -keyout "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.self.crt" -subj "$_subject" -sha512 -passout pass:$PASSWORD && \
openssl req -config "$OPENSSL_CONF" -new -key "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.csr" -sha512 -subj "$_subject" -passin pass:$PASSWORD && \
openssl ca -config "$OPENSSL_CONF" -md sha512 -extensions v3_req -batch -passin pass:$PASSWORD -out "$CERTIFICATES_DIR/$_alias.crt" -keyfile "$CERTIFICATES_DIR/$ROOT_CA.key" -cert "$CERTIFICATES_DIR/$ROOT_CA.crt" -days $VALID_DAYS -infiles "$CERTIFICATES_DIR/$_alias.csr" && \
openssl pkcs12 -export -chain -CAfile "$CERTIFICATES_DIR/$ROOT_CA.crt" -in "$CERTIFICATES_DIR/$_alias.crt" -inkey "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.jks" -name $_alias -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" && \
keytool -importkeystore -srckeystore "$CERTIFICATES_DIR/$_alias.jks" -srcstoretype PKCS12 -storepass "$PASSWORD" -srcstorepass "$PASSWORD" -alias $_alias -deststoretype PKCS12 -destkeystore "$CLIENT_KEYSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CA signed certificate '$_alias' successfully generated"
else
echo "Failed to generate CA signed certificate '$_alias'" >&2
fi
return $_rc
}
# $1 - certificate alias
generate_signed_certificate_with_intermediate_signed_certificate()
{
_alias=$1
_intermediate_ca_subject="/C=CA/ST=ON/L=Toronto/O=acme/OU=art/CN=$INTERMEDIATE_CA@acme.org"
_subject="/C=CA/ST=ON/L=Toronto/O=acme/OU=art/CN=$_alias@acme.org"
echo "Generating CA signed certificate '$_alias' with intermediate CA certificate '$INTERMEDIATE_CA'"
openssl req -x509 -newkey rsa:2048 -keyout "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.key" -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.crt" -subj "$_intermediate_ca_subject" -sha512 -passout pass:$PASSWORD && \
openssl req -config "$OPENSSL_CONF" -verbose -new -key "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.key" -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.csr" -sha512 -subj "$_intermediate_ca_subject" -passin pass:$PASSWORD && \
openssl ca -config "$OPENSSL_CONF" -md sha512 -extensions v3_ca -batch -passin pass:$PASSWORD -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crt" -keyfile "$CERTIFICATES_DIR/$ROOT_CA.key" -cert "$CERTIFICATES_DIR/$ROOT_CA.crt" -days $VALID_DAYS -infiles "$CERTIFICATES_DIR/$INTERMEDIATE_CA.csr" && \
openssl pkcs12 -export -chain -CAfile "$CERTIFICATES_DIR/$ROOT_CA.crt" -in "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crt" -inkey "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.key" -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.jks" -name $INTERMEDIATE_CA -passin pass:"$PASSWORD" -passout pass:"$PASSWORD"
echo "Generating CA signed certificate for '$_alias'" && \
openssl req -x509 -newkey rsa:2048 -keyout "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.self.crt" -subj "$_subject" -sha512 -passout pass:$PASSWORD && \
openssl req -config "$OPENSSL_CONF" -verbose -new -key "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.csr" -sha512 -subj "$_subject" -passin pass:$PASSWORD && \
openssl ca -config "$OPENSSL_CONF" -md sha512 -extensions v3_req -batch -passin pass:$PASSWORD -out "$CERTIFICATES_DIR/$_alias.crt" -keyfile "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.key" -cert "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crt" -days $VALID_DAYS -infiles "$CERTIFICATES_DIR/$_alias.csr" && \
cat "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crt" "$CERTIFICATES_DIR/$ROOT_CA.crt" > "$CERTIFICATES_DIR/chain_with_intermediate.crt"
openssl pkcs12 -export -chain -CAfile "$CERTIFICATES_DIR/chain_with_intermediate.crt" -in "$CERTIFICATES_DIR/$_alias.crt" -inkey "$CERTIFICATES_DIR/$_alias.self.key" -out "$CERTIFICATES_DIR/$_alias.jks" -name $_alias -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" && \
keytool -importkeystore -srckeystore "$CERTIFICATES_DIR/$_alias.jks" -srcstoretype PKCS12 -storepass "$PASSWORD" -srcstorepass "$PASSWORD" -alias $_alias -deststoretype PKCS12 -destkeystore "$CLIENT_KEYSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CA signed certificate '$_alias' with intermediate CA certificate '$INTERMEDIATE_CA' successfully generated"
else
echo "Failed to generate CA signed certificate '$_alias' with intermediate CA certificate '$INTERMEDIATE_CA'" >&2
fi
return $_rc
}
generate_expired_certificate()
{
_alias=user1
echo "Generating expired certificate '$_alias'"
keytool -genkeypair -alias $_alias -dname CN=USER1 -startdate "2010/01/01 12:00:00" -validity $VALID_DAYS -keysize 2048 -keyalg RSA -sigalg SHA512withRSA -keypass "$PASSWORD" -storepass "$PASSWORD" -deststoretype PKCS12 -keystore "$CLIENT_EXPIRED_KEYSTORE" && \
keytool -exportcert -keystore "$CLIENT_EXPIRED_KEYSTORE" -storepass "$PASSWORD" -alias $_alias -rfc -file "$CLIENT_EXPIRED_CRT" && \
keytool -import -alias $_alias -file "$CLIENT_EXPIRED_CRT" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -sigalg SHA512withRSA -keystore "$BROKER_EXPIRED_TRUSTSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Expired certificate '$_alias' successfully generated"
else
echo "Failed to generate expired certificate '$_alias'" >&2
fi
return $_rc
}
generate_signed_broker_certificate()
{
_subject="/C=CA/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=localhost"
echo "Generating CA signed certificate '$BROKER_ALIAS'"
openssl req -x509 -newkey rsa:2048 -keyout "$CERTIFICATES_DIR/$BROKER_ALIAS.self.key" -out "$CERTIFICATES_DIR/$BROKER_ALIAS.self.crt" -subj "$_subject" -passout pass:$PASSWORD && \
openssl req -config "$OPENSSL_CONF" -verbose -new -key "$CERTIFICATES_DIR/$BROKER_ALIAS.self.key" -out "$BROKER_CSR" -sha512 -subj "$_subject" -passin pass:$PASSWORD && \
openssl ca -config "$OPENSSL_CONF" -md sha512 -extensions v3_req -batch -passin pass:$PASSWORD -out "$BROKER_CRT" -keyfile "$CERTIFICATES_DIR/$ROOT_CA.key" -cert "$CERTIFICATES_DIR/$ROOT_CA.crt" -days $VALID_DAYS -infiles "$BROKER_CSR" && \
openssl pkcs12 -export -chain -CAfile "$CERTIFICATES_DIR/$ROOT_CA.crt" -in "$BROKER_CRT" -inkey "$CERTIFICATES_DIR/$BROKER_ALIAS.self.key" -out "$CERTIFICATES_DIR/$BROKER_ALIAS.jks" -name $BROKER_ALIAS -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" && \
keytool -importkeystore -srckeystore "$CERTIFICATES_DIR/$BROKER_ALIAS.jks" -srcstoretype PKCS12 -storepass "$PASSWORD" -srcstorepass "$PASSWORD" -alias $BROKER_ALIAS -deststoretype PKCS12 -destkeystore "$BROKER_KEYSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CA signed certificate '$BROKER_ALIAS' successfully generated"
else
echo "Failed to generate CA signed certificate '$BROKER_ALIAS'" >&2
fi
return $_rc
}
# $1 - certificate alias
# $2 - keystore where certificate will be imported
import_to_keystore()
{
_alias=$1
_keystore="$2"
echo "Importing certificate '$_alias' to keystore '$_keystore'"
keytool -import -alias $_alias -file "$CERTIFICATES_DIR/$_alias.crt" -storepass "$PASSWORD" -noprompt -deststoretype PKCS12 -sigalg SHA512withRSA -keystore "$_keystore"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Certificate '$_alias' successfully imported to keystore '$_keystore'"
else
echo "Failed to import certificate '$_alias' to keystore '$_keystore'" >&2
fi
return $_rc
}
generate_untrusted_client_certificate()
{
_alias=untrusted_client
echo "Generating untrusted certificate '$_alias'"
keytool -genkeypair -alias $_alias -dname CN=$_alias -validity $VALID_DAYS -keysize 2048 -keyalg RSA -sigalg SHA512withRSA -keypass "$PASSWORD" -storepass "$PASSWORD" -deststoretype PKCS12 -keystore "$CLIENT_UNTRUSTED_KEYSTORE"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Untrusted certificate '$_alias' successfully generated"
else
echo "Failed to generate untrusted certificate '$_alias'" >&2
fi
return $_rc
}
add_certificate_crl_distribution_point()
{
echo "Add CRL distribution points to openssl configuration"
sed -i "/\[ v3_req \]/a crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$ROOT_CA.crl" "$OPENSSL_CONF" && \
sed -i "/\[ v3_ca \]/a crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$ROOT_CA.crl" "$OPENSSL_CONF"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CRL distribution points successfully addded"
else
echo "Failed to add CRL distribution points" >&2
fi
return $_rc
}
set_certificate_crl_distribution_point_to_intermediate_ca()
{
echo "Setting CRL distribution point for intermediate CA certificate '$INTERMEDIATE_CA'"
sed -i -z "s|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$ROOT_CA.crl|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$INTERMEDIATE_CA.crl|" "$OPENSSL_CONF"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CRL distribution point for intermediate CA certificate '$INTERMEDIATE_CA' successfully set"
else
echo "Failed to set CRL distribution point for intermediate CA certificate '$INTERMEDIATE_CA'" >&2
fi
return $_rc
}
set_certificate_crl_distribution_point_to_empty_crl()
{
echo "Setting CRL distribution point to empty CRL"
sed -i -z "s|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$INTERMEDIATE_CA.crl|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$ROOT_CA.empty.crl|" "$OPENSSL_CONF"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CRL distribution point to empty CRL successfully set"
else
echo "Failed to set CRL distribution to empty CRL" >&2
fi
return $_rc
}
set_certificate_crl_distribution_point_to_invalid_crl_path()
{
echo "Setting CRL distribution point to invalid CRL path"
sed -i "s|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/$ROOT_CA.empty.crl|crlDistributionPoints=URI:http://localhost:$CRL_HTTP_PORT/not/a/crl|" "$OPENSSL_CONF"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "CRL distribution point to invalid CRL path successfully set"
else
echo "Failed to set CRL distribution to invalid CRL path" >&2
fi
return $_rc
}
generate_intermediate_crl()
{
echo "Generating intermediate CA certificate '$INTERMEDIATE_CA' CRL"
openssl ca -config "$OPENSSL_CONF" -passin pass:$PASSWORD -gencrl -keyfile "$CERTIFICATES_DIR/$INTERMEDIATE_CA.self.key" -cert "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crt" -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crl.pem" && \
openssl crl -inform PEM -in "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crl.pem" -outform DER -out "$CERTIFICATES_DIR/$INTERMEDIATE_CA.crl"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Intermediate CA certificate '$INTERMEDIATE_CA' CRL successfully generated"
else
echo "Failed to generate intermediate CA certificate '$INTERMEDIATE_CA' CRL" >&2
fi
return $_rc
}
# $1 - part of CRL file name
generate_crl()
{
_crl_name_part=$1
_crl_path_prefix=
if [ -n "$_crl_name_part" ]; then
_crl_path_prefix="$CERTIFICATES_DIR/$ROOT_CA.$_crl_name_part"
else
_crl_path_prefix="$CERTIFICATES_DIR/$ROOT_CA"
fi
echo "Generating certificate '$ROOT_CA' CRL to '$_crl_path_prefix'"
openssl ca -config "$OPENSSL_CONF" -passin pass:$PASSWORD -gencrl -keyfile "$CERTIFICATES_DIR/$ROOT_CA.key" -cert "$CERTIFICATES_DIR/$ROOT_CA.crt" -out "$_crl_path_prefix.crl.pem" && \
openssl crl -inform PEM -in "$_crl_path_prefix.crl.pem" -outform DER -out "$_crl_path_prefix.crl"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Certificate '$ROOT_CA' CRL successfully generated to '$_crl_path_prefix'"
else
echo "Failed to generate certificate '$ROOT_CA' CRL to '$_crl_path_prefix'" >&2
fi
return $_rc
}
revoke_certificate()
{
_alias=$1
echo "Revoking certificate '$_alias'"
openssl ca -config "$OPENSSL_CONF" -passin pass:$PASSWORD -revoke "$CERTIFICATES_DIR/$_alias.crt" -keyfile "$CERTIFICATES_DIR/$ROOT_CA.key" -cert "$CERTIFICATES_DIR/$ROOT_CA.crt"
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Certificate '$_alias' successfully revoked"
else
echo "Failed to revoke certificate '$_alias'" >&2
fi
return $_rc
}
prepare_test_keystores()
{
echo "Preparing test keystores"
cp "$BROKER_KEYSTORE" "$TEST_KEYSTORE" && \
import_to_keystore "app1" "$TEST_KEYSTORE" && \
import_to_keystore "app2" "$TEST_KEYSTORE" && \
cp "$BROKER_KEYSTORE" "$TEST_PK_ONLY_KEYSTORE" && \
keytool -delete -v -alias rootca -storepass password -keystore "$TEST_PK_ONLY_KEYSTORE" && \
cp "$BROKER_KEYSTORE" "$TEST_CERT_ONLY_KEYSTORE" && \
keytool -delete -v -alias $BROKER_ALIAS -storepass password -keystore "$TEST_CERT_ONLY_KEYSTORE" && \
cp "$BROKER_KEYSTORE" "$TEST_SYMMETRIC_KEY_KEYSTORE" && \
keytool -genseckey -alias testalias -keyalg AES -keysize 256 -storetype PKCS12 -storepass "$PASSWORD" -keystore "$TEST_SYMMETRIC_KEY_KEYSTORE" && \
cp "$TEST_PK_ONLY_KEYSTORE" "$TEST_EMPTY_KEYSTORE"
keytool -delete -v -alias $BROKER_ALIAS -storepass password -keystore "$TEST_EMPTY_KEYSTORE" && \
_rc=$?
if [ $_rc -eq 0 ]; then
echo "Test keystores prepared"
else
echo "Failed to prepare keystores" >&2
fi
return $_rc
}
main()
{
prepare_openssl_environment && \
generate_selfsigned_ca && \
generate_signed_certificate "app1" && \
generate_signed_certificate "app2" && \
generate_expired_certificate && \
generate_signed_broker_certificate && \
import_to_keystore "app1" "$BROKER_PEERSTORE" && \
generate_untrusted_client_certificate && \
add_certificate_crl_distribution_point && \
generate_signed_certificate "allowed_by_ca" && \
generate_signed_certificate "revoked_by_ca" && \
set_certificate_crl_distribution_point_to_intermediate_ca && \
generate_signed_certificate_with_intermediate_signed_certificate "allowed_by_ca_with_intermediate" && \
generate_intermediate_crl && \
set_certificate_crl_distribution_point_to_empty_crl && \
generate_signed_certificate "revoked_by_ca_empty_crl" && \
set_certificate_crl_distribution_point_to_invalid_crl_path && \
generate_signed_certificate "revoked_by_ca_invalid_crl_path" && \
generate_crl "empty" && \
revoke_certificate "$INTERMEDIATE_CA" && \
revoke_certificate "revoked_by_ca" && \
revoke_certificate "revoked_by_ca_empty_crl" && \
revoke_certificate "revoked_by_ca_invalid_crl_path" && \
generate_crl && \
prepare_test_keystores
}
if [ "$DEBUG" = true ]; then
main
else
main 2>/dev/null 1>&2
fi