summaryrefslogtreecommitdiff
path: root/localmksslcerts
blob: bf9b8b9c578f8eafe9ecfa30dcc9deddaf6ae0ad (plain)
  1. #!/bin/sh
  2. #
  3. # /usr/local/sbin/localmksslcerts
  4. # Copyright 2001-2002 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localmksslcerts,v 1.8 2003-01-04 02:24:43 jonas Exp $
  7. #
  8. # Generate certificates for mail (and other) servers
  9. # Based on uw-imapd-ssl post-install script
  10. #
  11. # TODO: Check if /etc/ssl/{certs,private}/cacert.pem exists and instead
  12. # create /etc/ssl/{certs,private}/<fqdn>.pem and symlink to hash of
  13. # certificate and each of /etc/ssl/{certs,private}/<service>.pem using
  14. # commands similar to these:
  15. #
  16. # openssl genrsa -out new.key
  17. # openssl req -new -key new.key -out new.csr
  18. # openssl x509 -req -days 365 -in new.csr -CA /etc/ssl/certs/cacert.pem -CAkey /etc/ssl/private/cacert.pem -CAcreateserial -out new.crt
  19. # ln -s new.crt `openssl x509 -hash -noout -in new.crt`.0
  20. # rm new.csr
  21. #
  22. # TODO: Use getopts
  23. prg=$(basename $0)
  24. copyright="(C) 2001-2002 Jonas Smedegaard <dr@jones.dk>"
  25. usage() {
  26. echo "$prg, $copyright
  27. Usage: $prg [--fqdn <FQDN>] [...] --daemon <daemon> [...] [--force]
  28. or: $prg <daemon> [<daemon>...] [-f]
  29. Options:
  30. --fqdn Fully Qualified Domain Name for this host.
  31. --cn Country Name (2 letter code)
  32. --state State or Province Name (full name)
  33. --loc Locality Name (eg, city)
  34. --org Organisation/company
  35. --ou Organisational unit/department
  36. --daemon Daemon(s) in need for a certificate
  37. (separate certificate is generated for each daemon)
  38. --issuer Email address of the person responsible for the certificate
  39. -f, --force Force overwriting existing certificate
  40. -h, --help This help text
  41. If issuer is not given, \"postmaster@<localdomain>\" is used."
  42. exit 1
  43. }
  44. # Set some defaults
  45. CWD=`pwd`
  46. PATH=$PATH:/usr/bin/ssl
  47. DAYS2EXPIRE=365
  48. fqdn=''
  49. cn=''
  50. state=''
  51. loc=''
  52. org=''
  53. ou=''
  54. daemon=''
  55. daemons=''
  56. issuer=''
  57. force=''
  58. args=''
  59. while [ $# -gt 0 ]; do
  60. doubleshift=''
  61. case $1 in
  62. --fqdn) fqdn="$2"; doubleshift=1;;
  63. --cn) cn="$2"; doubleshift=1;;
  64. --state) state="$2"; doubleshift=1;;
  65. --loc) loc="$2"; doubleshift=1;;
  66. --org) org="$2"; doubleshift=1;;
  67. --ou) ou="$2"; doubleshift=1;;
  68. --daemon) daemons="$daemons$2 "; doubleshift=1;;
  69. --issuer) issuer="$2"; doubleshift=1;;
  70. --force|-f) force=1;;
  71. -*) usage;;
  72. *) args="$args$1 ";;
  73. esac
  74. if [ -n "$doubleshift" ];then
  75. if [ $# -gt 1 ]; then
  76. shift
  77. else
  78. echo "Missing parameter for option \"$1\"!"
  79. usage
  80. fi
  81. fi
  82. shift
  83. done
  84. set -- $args
  85. if [ -z "$issuer" ]; then
  86. DOMAINNAME=`hostname -d`
  87. ISSUER="postmaster@$DOMAINNAME"
  88. fi
  89. if [ -z "$fqdn" ]; then
  90. if [ $# -gt 0 ]; then
  91. fqdn=`hostname -f`
  92. else
  93. echo "Too few parameters!"
  94. usage
  95. fi
  96. fi
  97. for val in org ou; do
  98. if eval [ -z "\$$val" ]; then
  99. eval $val=$fqdn
  100. fi
  101. done
  102. for val in cn state loc; do
  103. if eval [ -z "\$$val" ]; then
  104. eval $val="."
  105. fi
  106. done
  107. cd /etc/ssl/certs
  108. for daemon in $daemons $@; do
  109. if [ -f $daemon.pem ]; then
  110. if [ -n $force ]; then
  111. rm -f `openssl x509 -noout -hash < $daemon.pem`.0
  112. rm -f $daemon.pem
  113. else
  114. echo "You already have /etc/ssl/certs/$daemon.pem - exiting...!"
  115. exit 1
  116. fi
  117. fi
  118. echo -n "Generating $daemon certificate..."
  119. openssl req -new -x509 -nodes -out $daemon.pem -keyout $daemon.pem -days $DAYS2EXPIRE > /dev/null 2>&1 <<+
  120. $cn
  121. $state
  122. $loc
  123. $org
  124. $ou
  125. $fqdn
  126. $issuer
  127. +
  128. ln -sf $daemon.pem `openssl x509 -noout -hash < $daemon.pem`.0
  129. echo "Done!"
  130. chown root.root /etc/ssl/certs/$daemon.pem
  131. chmod 0640 /etc/ssl/certs/$daemon.pem
  132. done
  133. cd $CWD