summaryrefslogtreecommitdiff
path: root/localmksslcerts
blob: 40de3d451fdbc4f18641470e738673ee317c4253 (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.11 2004-05-04 20:55:21 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. --makeca Create CA certificate if missing
  32. -f, --force Force overwriting existing certificate(s)
  33. -h, --help This help text
  34. If issuer is not given, \"postmaster@<localdomain>\" is used."
  35. exit 1
  36. }
  37. # Set some defaults
  38. CWD=`pwd`
  39. PATH=$PATH:/usr/bin/ssl
  40. DAYS2EXPIRE=365
  41. fqdn=''
  42. cn=''
  43. state=''
  44. loc=''
  45. org=''
  46. ou=''
  47. daemon=''
  48. daemons=''
  49. issuer=''
  50. cert=''
  51. cacert=''
  52. makeca=''
  53. force=''
  54. args=''
  55. while [ $# -gt 0 ]; do
  56. doubleshift=''
  57. case $1 in
  58. --fqdn) fqdn="$2"; doubleshift=1;;
  59. --cn) cn="$2"; doubleshift=1;;
  60. --state) state="$2"; doubleshift=1;;
  61. --loc) loc="$2"; doubleshift=1;;
  62. --org) org="$2"; doubleshift=1;;
  63. --ou) ou="$2"; doubleshift=1;;
  64. --daemon) daemons="$daemons$2 "; doubleshift=1;;
  65. --issuer) issuer="$2"; doubleshift=1;;
  66. --cert) cert=1;;
  67. --cacert) cacert="$2"; doubleshift=1;;
  68. --makeca) makeca=1;;
  69. --force|-f) force=1;;
  70. -*) usage;;
  71. *) args="$args$1 ";;
  72. esac
  73. if [ -n "$doubleshift" ];then
  74. if [ $# -gt 1 ]; then
  75. shift
  76. else
  77. echo "ERROR: Parameter for option \"$1\" missing!"
  78. usage
  79. fi
  80. fi
  81. shift
  82. done
  83. set -- $args
  84. if [ -z "$issuer" ]; then
  85. DOMAINNAME="`hostname -d`"
  86. ISSUER="postmaster@$DOMAINNAME"
  87. fi
  88. if [ -z "$fqdn" ]; then
  89. if [ $# -gt 0 ]; then
  90. fqdn="`hostname -f`"
  91. else
  92. echo "Too few parameters!"
  93. usage
  94. fi
  95. fi
  96. for val in org ou; do
  97. if eval [ -z "\$$val" ]; then
  98. eval "$val=\"$fqdn\""
  99. fi
  100. done
  101. for val in cn state loc; do
  102. if eval [ -z "\$$val" ]; then
  103. eval "$val=\".\""
  104. fi
  105. done
  106. if [ -n "$cert" ]; then
  107. if [ ! -f /etc/ssl/certs/$fqdn.pem -o ! -f /etc/ssl/private/$fqdn.pem ]; then
  108. if [ -z "$cacert" ]; then
  109. echo "ERROR: Host certificate for \"$fqdn\" missing!"
  110. exit 1
  111. fi
  112. if [ ! -r /etc/ssl/certs/$cacert.pem -o ! -r /etc/ssl/private/$cacert.pem ]; then
  113. if [ -n "$makeca" ]; then
  114. # Generate private key for CA certificate
  115. cd /etc/ssl/private
  116. #FIXME: Make strength configurable
  117. openssl genrsa -des3 -out $cacert.pem 1024
  118. chown root:root $cacert.pem
  119. chmod 0400 $cacert.pem
  120. # Generate and pre-filled certification request
  121. cd /etc/ssl/certs
  122. #FIXME: Make validity configurable
  123. openssl req -new \
  124. -key /etc/ssl/private/$cacert.pem \
  125. -x509 -days 1095 \
  126. -out $cacert.pem
  127. # Add hash to certified public certificate and cleanup
  128. ln -sf $cacert.pem `openssl x509 -noout -hash -in $cacert.pem`.0
  129. else
  130. echo "ERROR: CAcert (certifying authority certificate) missing!"
  131. exit 1
  132. fi
  133. fi
  134. echo "Generating host certificate for \"$fqdn\"..."
  135. for file in /etc/ssl/private/$fqdn.pem /etc/ssl/certs/$fqdn.csr /etc/ssl/certs/$fqdn.pem; do
  136. if [ -e $file ]; then
  137. if [ -n "$force" ]; then
  138. rm -f $file
  139. else
  140. echo "ERROR: File $file already exists!"
  141. exit 1
  142. fi
  143. fi
  144. done
  145. # Generate private key for host certificate
  146. cd /etc/ssl/private
  147. openssl genrsa -out $fqdn.pem
  148. chown root:root $fqdn.pem
  149. chmod 0600 $fqdn.pem
  150. # Generate and pre-filled certification request
  151. cd /etc/ssl/certs
  152. openssl req -new \
  153. -key /etc/ssl/private/$fqdn.pem \
  154. -out $fqdn.csr > /dev/null 2>&1 <<+
  155. $cn
  156. $state
  157. $loc
  158. $org
  159. $ou
  160. $fqdn
  161. $issuer
  162. .
  163. .
  164. +
  165. # Generate public ccertificate from certification request
  166. openssl x509 -req \
  167. -days $DAYS2EXPIRE \
  168. -CA /etc/ssl/certs/$cacert.pem \
  169. -CAkey /etc/ssl/private/$cacert.pem \
  170. -CAcreateserial -out $fqdn.pem -in $fqdn.csr
  171. # Add hash to certified public certificate and cleanup
  172. ln -sf $fqdn.pem `openssl x509 -noout -hash -in $fqdn.pem`.0
  173. rm $fqdn.csr
  174. fi
  175. fi
  176. cd /etc/ssl/certs
  177. for daemon in $daemons $@; do
  178. if [ -f $daemon.pem ]; then
  179. if [ -n "$force" ]; then
  180. rm -f `openssl x509 -noout -hash < $daemon.pem`.0
  181. rm -f $daemon.pem
  182. else
  183. echo "Ignoring certificate (/etc/ssl/certs/$daemon.pem already exists...)"
  184. continue
  185. fi
  186. fi
  187. if [ -n "$cert" ]; then
  188. echo "Attaching $daemon to certified certificate for $fqdn."
  189. ln -sf $fqdn.pem $daemon.pem
  190. (
  191. cd /etc/ssl/private
  192. ln -sf $fqdn.pem $daemon.pem
  193. )
  194. else
  195. echo -n "Generating self-certifying $daemon certificate..."
  196. openssl req -new -x509 -nodes \
  197. -days $DAYS2EXPIRE \
  198. -keyout $daemon.pem \
  199. -out $daemon.pem > /dev/null 2>&1 <<+
  200. $cn
  201. $state
  202. $loc
  203. $org
  204. $ou
  205. $fqdn
  206. $issuer
  207. +
  208. ln -sf $daemon.pem `openssl x509 -noout -hash -in $daemon.pem`.0
  209. chown root:root $daemon.pem
  210. chmod 0640 $daemon.pem
  211. echo "Done!"
  212. fi
  213. done
  214. cd $CWD