forge.sh 3 KB
#!/bin/sh

#
# Commands
#

openssl_req () {
    echo openssl req -config openssl.cnf $@
    openssl req -config openssl.cnf $@
}

openssl_ca () {
    echo openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 $@
    openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 $@
}


#
# CA directory structure
#

ca_dir () {
    test -d "$1" && return
    mkdir $1 $1/certs $1/private $1/crl $1/newcerts $1/req
    touch $1/index.txt
    echo 00 > $1/serial
    echo 00 > $1/crlnumber
}

ca_dir ca-master

#
# The CA
#

test -f ca-master/ca-master.crt || {

	# Make key and request
	openssl_req -extensions v3_ca -new -newkey rsa:2048 -nodes \
		-keyout ca-master/private/ca-master.key -out ca-master/req/ca-master.csr \
		-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=CA"

	# Make self signed CA
	openssl ca -config openssl.cnf -batch -startdate 700101000000Z -days 21900 \
		-selfsign -in ca-master/req/ca-master.csr -out ca-master/ca-master.crt \
		-keyfile ca-master/private/ca-master.key || exit 1

	# Make CA bundle keystore
	rm -f cacerts.jks
	openssl x509 -outform der -in ca-master/ca-master.crt -out ca-master/ca-master.der
	keytool -import -keystore cacerts.jks -storepass changeit -file ca-master/ca-master.der -noprompt -trustcacerts -alias bortalca
}

#
# Certificates signed by CA
#

master_signed_cert () {
    _base=$1 ; shift
    test -f ca-master/certs/$_base.crt && return

    # Create
    openssl_req -new -newkey rsa:2048 -nodes \
	-keyout ca-master/private/$_base.key \
	-out ca-master/req/$_base.csr \
	-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=$_base"

    # Sign
    openssl_ca -name CA_master $@ \
	-in ca-master/req/$_base.csr \
	-out ca-master/certs/$_base.crt 

    # Convert to PKCS#12 for import to keystore/browser
    openssl pkcs12 -export -passout pass:changeit \
        -in ca-master/certs/$_base.crt \
        -inkey ca-master/private/$_base.key \
        -out ca-master/certs/$_base.p12
}

#Certificates signed by master CA - with custom common name
#also create a .pem file for both private key and cert
master_signed_cert_cn () {
    _base=$1 ; shift
    _cn=$1 ; shift

    test -f ca-master/private/$_base.pem && return

    # Generate key and certificate request
    openssl_req -new -newkey rsa:2048 -nodes \
	-keyout ca-master/private/$_base.key \
	-out ca-master/req/$_base.csr \
	-subj "/C=FI/ST=Tampere/L=Tampere/O=Bortal/CN=$_cn"

    # Sign with CA
    openssl_ca -name CA_master $@ \
	-in ca-master/req/$_base.csr \
	-out ca-master/certs/$_base.crt 

    # Convert to PKCS#12 for import to keystore/browser
    openssl pkcs12 -export -passout pass:changeit -in ca-master/certs/$_base.crt -inkey ca-master/private/$_base.key -out ca-master/certs/$_base.p12
}

master_signed_cert_cn s1as bortal-server -extensions srv_cert
rm -f keystore.jks
keytool -importkeystore -srckeystore ca-master/certs/s1as.p12 -destkeystore keystore.jks -srcstorepass changeit -deststorepass changeit -srcstoretype pkcs12 -alias 1 -destalias s1as

master_signed_cert terminal -extensions client_cert