summaryrefslogtreecommitdiff
path: root/localmksslcerts
blob: db6da7a4931e43a2dcc2005dd3b29202b19c9af2 (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/sbin/localmksslcerts
  4. # Copyright 2001-2004 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localmksslcerts,v 1.9 2004-05-04 19:43:36 jonas Exp $
  7. #
  8. # Generate certificates for mail (and other) servers
  9. # Based on uw-imapd-ssl post-install script
  10. #
  11. # TODO: Use getopts
  12. prg=$(basename $0)
  13. copyright="(C) 2001-2004 Jonas Smedegaard <dr@jones.dk>"
  14. usage() {
  15. echo "$prg, $copyright
  16. Usage: $prg [--fqdn <FQDN>] [...] --daemon <daemon> [...] [--force]
  17. or: $prg <daemon> [<daemon>...] [-f]
  18. Options:
  19. --fqdn Fully Qualified Domain Name for this host.
  20. --cn Country Name (2 letter code)
  21. --state State or Province Name (full name)
  22. --loc Locality Name (eg, city)
  23. --org Organisation/company
  24. --ou Organisational unit/department
  25. --daemon Daemon(s) in need for a certificate
  26. (separate certificate is generated for each daemon)
  27. --issuer Email address of the person responsible for the certificate
  28. --cert Use certified host certificate
  29. --cacert CAcert used for creating missing host certificate
  30. -f, --force Force overwriting existing certificate
  31. -h, --help This help text
  32. If issuer is not given, \"postmaster@<localdomain>\" is used."
  33. exit 1
  34. }
  35. # Set some defaults
  36. CWD=`pwd`
  37. PATH=$PATH:/usr/bin/ssl
  38. DAYS2EXPIRE=365
  39. fqdn=''
  40. cn=''
  41. state=''
  42. loc=''
  43. org=''
  44. ou=''
  45. daemon=''
  46. daemons=''
  47. issuer=''
  48. cert=''
  49. cacert=''
  50. force=''
  51. args=''
  52. while [ $# -gt 0 ]; do
  53. doubleshift=''
  54. case $1 in
  55. --fqdn) fqdn="$2"; doubleshift=1;;
  56. --cn) cn="$2"; doubleshift=1;;
  57. --state) state="$2"; doubleshift=1;;
  58. --loc) loc="$2"; doubleshift=1;;
  59. --org) org="$2"; doubleshift=1;;
  60. --ou) ou="$2"; doubleshift=1;;
  61. --daemon) daemons="$daemons$2 "; doubleshift=1;;
  62. --issuer) issuer="$2"; doubleshift=1;;
  63. --cert) cert=1;;
  64. --cacert) cacert="$2"; doubleshift=1;;
  65. --force|-f) force=1;;
  66. -*) usage;;
  67. *) args="$args$1 ";;
  68. esac
  69. if [ -n "$doubleshift" ];then
  70. if [ $# -gt 1 ]; then
  71. shift
  72. else
  73. echo "ERROR: Parameter for option \"$1\" missing!"
  74. usage
  75. fi
  76. fi
  77. shift
  78. done
  79. set -- $args
  80. if [ -z "$issuer" ]; then
  81. DOMAINNAME="`hostname -d`"
  82. ISSUER="postmaster@$DOMAINNAME"
  83. fi
  84. if [ -z "$fqdn" ]; then
  85. if [ $# -gt 0 ]; then
  86. fqdn="`hostname -f`"
  87. else
  88. echo "Too few parameters!"
  89. usage
  90. fi
  91. fi
  92. for val in org ou; do
  93. if eval [ -z "\$$val" ]; then
  94. eval "$val=\"$fqdn\""
  95. fi
  96. done
  97. for val in cn state loc; do
  98. if eval [ -z "\$$val" ]; then
  99. eval "$val=\".\""
  100. fi
  101. done
  102. if [ -n "$cert" ]; then
  103. if [ ! -f /etc/ssl/certs/$fqdn.pem -o ! -f /etc/ssl/private/$fqdn.pem ]; then
  104. if [ -z "$cacert" ]; then
  105. echo "ERROR: Host certificate for \"$fqdn\" missing!"
  106. exit 1
  107. fi
  108. if [ ! -r /etc/ssl/certs/$cacert.pem -o ! -r /etc/ssl/private/$cacert.pem ]; then
  109. #FIXME: Generate CAcert if --mkcacert is provided
  110. echo "ERROR: CAcert (certifying authority certificate) missing!"
  111. exit 1
  112. fi
  113. echo "Generating host certificate for \"$fqdn\"..."
  114. for file in /etc/ssl/private/$fqdn.pem /etc/ssl/certs/$fqdn.csr /etc/ssl/certs/$fqdn.pem; do
  115. if [ -e $file ]; then
  116. echo "ERROR: File $file already exists!"
  117. exit 1
  118. fi
  119. done
  120. # Generate host certificate (private key)
  121. cd /etc/ssl/private
  122. openssl genrsa -out $fqdn.pem
  123. ln -sf $fqdn.pem `openssl x509 -noout -hash -in $fqdn.pem`.0
  124. chown root:root $fqdn.pem
  125. chmod 0600 $fqdn.pem
  126. # Generate and fill-out certification request for host certificate
  127. cd /etc/ssl/certs
  128. openssl req -new \
  129. -key /etc/ssl/private/$daemon.pem \
  130. -out $daemon.csr > /dev/null 2>&1 <<+
  131. $cn
  132. $state
  133. $loc
  134. $org
  135. $ou
  136. $fqdn
  137. $issuer
  138. +
  139. # Authorize certification request (= public part of certificate)
  140. openssl x509 -req \
  141. -days $DAYS2EXPIRE \
  142. -CA /etc/ssl/certs/$cacert.pem \
  143. -CAkey /etc/ssl/private/$cacert.pem \
  144. -CAcreateserial -out $daemon.pem -in new.csr
  145. rm new.csr
  146. fi
  147. fi
  148. cd /etc/ssl/certs
  149. for daemon in $daemons $@; do
  150. if [ -f $daemon.pem ]; then
  151. if [ -n "$force" ]; then
  152. rm -f `openssl x509 -noout -hash < $daemon.pem`.0
  153. rm -f $daemon.pem
  154. else
  155. echo "Ignoring certificate (/etc/ssl/certs/$daemon.pem already exists...)"
  156. continue
  157. fi
  158. fi
  159. if [ -n "$cert" ]; then
  160. echo "Attaching $daemon to certified certificate for $fqdn."
  161. ln -sf $fqdn.pem $daemon.pem
  162. (
  163. cd /etc/ssl/private
  164. ln -sf $fqdn.pem $daemon.pem
  165. )
  166. else
  167. echo -n "Generating self-certifying $daemon certificate..."
  168. openssl req -new -x509 -nodes \
  169. -days $DAYS2EXPIRE \
  170. -keyout $daemon.pem \
  171. -out $daemon.pem > /dev/null 2>&1 <<+
  172. $cn
  173. $state
  174. $loc
  175. $org
  176. $ou
  177. $fqdn
  178. $issuer
  179. +
  180. ln -sf $daemon.pem `openssl x509 -noout -hash -in $daemon.pem`.0
  181. chown root:root $daemon.pem
  182. chmod 0640 $daemon.pem
  183. echo "Done!"
  184. fi
  185. done
  186. cd $CWD