#!/bin/bash
SECURE=""
SERVER="labdc.lab.lan"
USERNAME="cert"
PASSWORD="cert"
CERTNAME="cert.pem"
CANAME="ca.pem"
CERTREQFILENAME=""

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done

  #echo "${encoded}"    # You can either set a return variable (FASTER)
  REPLY="${encoded}"   #+or echo the result (EASIER)... or both... :p
}

rawurldecode() {

  # This is perhaps a risky gambit, but since all escape characters must be
  # encoded, we can replace %NN with \xNN and pass the lot to printf -b, which
  # will decode hex for us

  printf -v REPLY '%b' "${1//%/\\x}" # You can either set a return variable (FASTER)
  #echo "${REPLY}"  #+or echo the result (EASIER)... or both... :p
}

#
#read -r -d "" CERTREQ <<-"EOT"
#-----BEGIN CERTIFICATE REQUEST-----
#MIICrTCCAZUCAQAwGTEXMBUGA1UEAxMObGFidmdhdGUxLjM2NTAwggEiMA0GCSqG
#SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtFIn0obut1wTqYmmrCF47h30mRExgrpgy
#5PibdWDxOSorSXgijdLqM5WPxxrRhjhkRO6HulaDAi2bdivZm0pOcLlSWUn/abK2
#q1rUzLR6UArLiA8jbFcveVhoBBow005UbNoayVhtD9Fj2zp2uOES1Ind1+sESA51
#iXohMlkFC1tFEuzL+X6a4rNZIUebHNQDQMSFVlNOcUS2yLyzY8GSX4dAWxADlwi0
#g9Uk8Q38sm+fngptiJ5UfXT9CSAVcTC4LFNpPMGz4M/jVpxCIn/FCzCLLmWeQMGG
#UDkDRG4A+hPQYzMjoSqaquAVUbEVK1VnBmdbX68wbOgkipc65v1LAgMBAAGgTzBN
#BgkqhkiG9w0BCQ4xQDA+MDwGA1UdEQQ1MDOCDmxhYnZnYXRlMS4zNjUwgglsYWJ2
#Z2F0ZTGHBAoCAleHECoAAAARAAABABAAAgACAIcwDQYJKoZIhvcNAQEFBQADggEB
#AKkixFMi26QPF//pwN2mB/uC/IePevRzYe7uljiAeAi3lFv4ysC9L5TUMxLtHd1W
#giGoiQVI45fZjPVlMJxiwTXxLPEIYE6Lq4nBKXHmFKVW6pbEKyaQu8Y8Ty92GQlu
#0yExK102Qki7p+/AOx42ECy2m46F7KfmGex1meYphgJMcNjCOVb+xTZZOq8VwBRA
#OXjbYSg9OHvDTeA5OsBKaaFxxol4qONfbDAIkVqBh4nf+IC/gd5WEFseJI2OiG16
#V2vJZgiTghonwrPKS8s1AlVxra0hoJsXeh+VBdxZDO6irwhvEcV90GHwI+mTC7gg
#H4pmtYNn7oJVl0vbYtTcVV0=
#-----END CERTIFICATE REQUEST-----
#EOT
#

usage() {
    echo "Usage: ${0##*/} [-c | --cert] [--certname] [--caname] [-h | --hostname] [-p | --password] [-s | --https] [-u | --username] [-v | --verbose] [-?|--help]"
}


ARGS=$(getopt -o c:h:p:su:v --long cert,certname,caname,help,hostname,password,https,username,verbose -n "${0##*/}" -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$ARGS"
while true ; do
    case "$1" in
        -c|--cert) CERTREQFILENAME=$2
            shift 2
            ;;
        --certname) CERTNAME=$2
            shift 2
            ;;
        --caname) CANAME=$2
            shift 2
            ;;
        -h | --hostname) SERVER=$2
            shift 2
            ;;
        -p|--password) PASSWORD=$2
            shift 2
            ;;
        -s|--https) SECURE="s"
            shift 1
            ;;
        -u|--username) USERNAME=$2
            shift 2
            ;;
        -v|--verbose) VERBOSE=1
            shift 1
            ;;
        --help)
            usage
            exit
            ;;
        --) shift
            break
            ;;
        *)
            echo "Internal error!"
            exit 1
            ;;
    esac
done

if [ -z "${CERTREQFILENAME}" ]; then
  echo "no domain given"
  usage
  exit 3
fi

read -r -d "" CERTREQ <${CERTREQFILENAME}
rawurlencode "${CERTREQ}"
CERTREQ=${REPLY}

TMPFILE=$(mktemp)
if [ -z "${TMPFILE}" ]; then
    echo "can't create tmp file"
fi
trap "rm -f ${TMPFILE}" 0 2 3 15

curl -s -S ${SECURE/s/-k} -u "${USERNAME}:${PASSWORD}" --ntlm "http${SECURE}://${SERVER}/certsrv/certfnsh.asp" \
    -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
    -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: en-US,en;q=0.5" \
    -H "Connection: keep-alive" \
    -H "Host: ${SERVER}" \
    -H "Referer: http${SECURE}://${SERVER}/certsrv/certrqxt.asp" \
    -H "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data "Mode=newreq&CertRequest=${CERTREQ}&CertAttrib=CertificateTemplate%3AWebServer%0D%0AUserAgent%3AMozilla%2F5.0+%28Windows+NT+10.0%3B+WOW64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F45.0.2454.93+Safari%2F537.36%0D%0A&FriendlyType=Saved-Request+Certificate&ThumbPrint=&TargetStoreFlags=0&SaveCert=yes" > ${TMPFILE} 2>/dev/null

for i in $(grep "location=" ${TMPFILE} | cut -d '"' -f 2); do
    if [[ "${i}" =~ "certnew.cer" ]];then 
        OUTFILENAME=${CERTNAME}
    else 
        OUTFILENAME=${CANAME}
    fi
    #echo "curl -s-S ${SECURE/s/-k} -u \"${USERNAME}:${PASSWORD}\" --ntlm \"http${SECURE}://${SERVER}/certsrv/${i}Enc=b64\" > ${OUTFILENAME}"
    curl -s -S ${SECURE/s/-k} -u "${USERNAME}:${PASSWORD}" --ntlm "http${SECURE}://${SERVER}/certsrv/${i}Enc=b64"  > ${OUTFILENAME}
done

