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