CGIs of random value
authorThorsten Glaser <tg@mirbsd.org>
Wed, 9 Mar 2011 14:03:06 +0000 (15:03 +0100)
committerThorsten Glaser <tg@mirbsd.org>
Wed, 9 Mar 2011 14:03:06 +0000 (15:03 +0100)
• how to generate an RSA secret key and X.509 CSR for CA submission
  (this runs on a MirBSD box with good entropy)
• how to parse LDAP into something visible

mksh/csrgen.cgi [new file with mode: 0644]
mksh/ldap_user_info.cgi [new file with mode: 0644]

diff --git a/mksh/csrgen.cgi b/mksh/csrgen.cgi
new file mode 100644 (file)
index 0000000..fc09417
--- /dev/null
@@ -0,0 +1,119 @@
+#!/bin/mksh
+# $Id: csrgen 1637 2011-01-17 15:00:59Z tglase $
+#-
+# Copyright © 2010, 2011
+#      Thorsten Glaser <t.glaser@tarent.de>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+
+feedback=
+nl='
+'
+saveIFS="      $nl"
+function trytodoit {
+       if [[ $REQUEST_METHOD != GET ]]; then
+               feedback="Not called via HTTP GET."
+               return
+       fi
+       if [[ $HTTPS != on ]]; then
+               feedback="Not called via HTTPS."
+               return
+       fi
+       IFS='&'
+       set -A flds -- $QUERY_STRING
+       IFS=$saveIFS
+       xfqdn=
+       xstrength=
+       xaction=0
+       for fld in "${flds[@]}"; do
+               case ${fld%%=*} {
+               (fqdn) xfqdn=${fld#*=} ;;
+               (strength) xstrength=${fld#*=} ;;
+               (doit) xaction=${fld#*=} ;;
+               (*) feedback="Invalid QUERY_STRING."; return ;;
+               }
+       done
+       [[ $xaction = 0 ]] && return
+       if [[ $xaction != Erstellen ]]; then
+               feedback="Submit button not pressed."
+               return
+       fi
+       if [[ $xstrength != @(2048|3072|4096) ]]; then
+               feedback="Invalid strength given."
+               return
+       fi
+       if [[ $xfqdn != ?('*.')[a-zA-Z0-9]?(*([a-zA-Z0-9-])[a-zA-Z0-9])+(.[a-zA-Z0-9]?(*([a-zA-Z0-9-])[a-zA-Z0-9])) ]]; then
+               feedback="Invalid hostname (FQDN) given."
+               return
+       fi
+       if ! K=$(openssl genrsa $xstrength 2>/dev/null); then
+               feedback="Could not generate $xstrength bit secret key."
+               return
+       fi
+       if ! R=$(print -r -- "$K" | openssl req -batch -new -sha1 \
+           -config /openssl.cnf -subj "/CN=${xfqdn}/" -key /dev/stdin \
+           2>/dev/null); then
+               feedback="Could not generate CSR for ${xfqdn}."
+               return
+       fi
+       cat <<-EOF
+       Content-type: text/plain
+
+       Congratulations, I generated a CSR for ${xfqdn} for you to
+       copy and paste into the CA web form:
+
+       $R
+
+
+       The secret key (for /etc/ssl/private/\$foo.key - chown root:ssl-cert
+       chmod 0640) of ${xstrength} bit length is:
+
+       $K
+
+       I will not save any copies of this, make sure to protect them!
+EOF
+       K=
+       R=
+       exit 0
+}
+trytodoit
+
+cat <<'EOF'
+Content-type: text/html; charset=UTF-8
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
+ <title>Generierung eines Certificate Signing Request</title>
+ <style type="text/css"><!--
+       strong { background-color:#FF0000; color:#000000; }
+ //--></style>
+</head><body>
+<h1>Generierung eines Certificate Signing Request</h1>
+EOF
+[[ -z $feedback ]] || print -r -- "<p><strong>$feedback</strong></p>"
+cat <<'EOF'
+<form action="https://spamfilter2.tarent.de/cgi-bin/csrgen" method="get">
+<p>Hostname: <input name="fqdn" type="text" size="32" maxlength="255" /></p>
+<p>Stärke:<br />
+ <input type="radio" name="strength" value="2048" checked="checked" />2048 Bit<br />
+ <input type="radio" name="strength" value="3072" />3072 Bit<br />
+ <input type="radio" name="strength" value="4096" />4096 Bit
+</p>
+<p><input type="submit" name="doit" value="Erstellen" /></p>
+</form>
+</body></html>
+EOF
diff --git a/mksh/ldap_user_info.cgi b/mksh/ldap_user_info.cgi
new file mode 100644 (file)
index 0000000..c105c9d
--- /dev/null
@@ -0,0 +1,116 @@
+#!/bin/mksh
+# $Id: ui.cgi 1104 2010-06-18 12:53:21Z tglase $
+# root@dev:/var/www/tarentpgp/ui.cgi
+
+# for debugging {{{
+#print Content-type: text/plain
+#print
+#exec 2>&1
+#set -x
+# end debugging }}}
+
+# basic input validation
+if [[ $AUTH_TYPE != Basic || $HTTPS != on || -z $REMOTE_USER || \
+    $REQUEST_METHOD != GET || -n $QUERY_STRING ]]; then
+       print Status: 400 Bad Request
+       print
+       print Sorry, use the script or leave it.
+       exit 1
+fi
+
+### BEGIN imported code {{{
+# $MirOS: src/bin/mksh/dot.mkshrc,v 1.43 2009/05/31 17:17:33 tg Rel $
+#-
+# Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+
+allu=QWERTYUIOPASDFGHJKLZXCVBNM
+alll=qwertyuiopasdfghjklzxcvbnm
+alln=0123456789
+
+function Lb64decode {
+       typeset u=$-
+       set +U
+       typeset c s="$*" t=
+       [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
+       typeset -i i=0 n=${#s} p=0 v x
+       typeset -i16 o
+
+       while (( i < n )); do
+               c=${s:(i++):1}
+               case $c {
+               (=)     break ;;
+               ([A-Z]) (( v = 1#$c - 65 )) ;;
+               ([a-z]) (( v = 1#$c - 71 )) ;;
+               ([0-9]) (( v = 1#$c + 4 )) ;;
+               (+)     v=62 ;;
+               (/)     v=63 ;;
+               (*)     continue ;;
+               }
+               (( x = (x << 6) | v ))
+               case $((p++)) {
+               (0)     continue ;;
+               (1)     (( o = (x >> 4) & 255 )) ;;
+               (2)     (( o = (x >> 2) & 255 )) ;;
+               (3)     (( o = x & 255 ))
+                       p=0
+                       ;;
+               }
+               t=$t\\x${o#16#}
+       done
+       print -n $t
+       [[ $u = *U* ]] && set -U
+       :
+}
+
+### END imported code }}}
+
+# get user information from LDAP
+v_givenName=
+v_mailPrimaryAddress=
+v_o=
+v_sn=
+env LDAPTLS_CACERT=/etc/ssl/certs/ucs.tarent.de.cer \
+    ldapsearch -x -LLL -ZZ -H ldap://ugs.tarent.de -b dc=tarent,dc=de \
+    uid="$REMOTE_USER" givenName mailPrimaryAddress o sn | \
+    tr '\n' '\ 1' | sed 's/\ 1 //g' | tr '\ 1' '\n' |&
+while read -p key value; do
+       # parse ldap "foo:: BARINBASE64" lines
+       [[ $key = *:: ]] && value=$(Lb64decode "$value")
+       # parse ldap "foo: barunencoded" lines
+       key=${key%%*(:)}
+       eval v_$key=\$value
+done
+
+# required fields
+if [[ -z $v_givenName || -z $v_mailPrimaryAddress || -z $v_sn ]]; then
+       print Status: 400 Bad Request
+       print
+       print You don\'t exist. Go away.
+       exit 1
+fi
+
+# output the response
+print Content-type: text/plain
+print Entropy: $RANDOM
+print
+print status ok
+print name $v_givenName $v_sn
+print mail $v_mailPrimaryAddress | tr $allu $alll
+print comm $v_o
+exit 0