freedombone-dhparam 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Creates or re-calculates Diffie-Hellman parameters
  12. # License
  13. # =======
  14. #
  15. # Copyright (C) 2015-2016 Bob Mottram <bob@robotics.uk.to>
  16. #
  17. # This program is free software: you can redistribute it and/or modify
  18. # it under the terms of the GNU Affero General Public License as published by
  19. # the Free Software Foundation, either version 3 of the License, or
  20. # (at your option) any later version.
  21. #
  22. # This program is distributed in the hope that it will be useful,
  23. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  25. # GNU Affero General Public License for more details.
  26. #
  27. # You should have received a copy of the GNU Affero General Public License
  28. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  29. PROJECT_NAME='freedombone'
  30. export TEXTDOMAIN=${PROJECT_NAME}-dhparam
  31. export TEXTDOMAINDIR="/usr/share/locale"
  32. HOSTNAME=
  33. KEYLENGTH=2048
  34. RECALCULATE="no"
  35. FAST=''
  36. # From BetterCrypto:
  37. #
  38. # "Where configurable, we recommend using the Diffie Hellman groups
  39. # defined for IKE, specifically groups 14-18 (2048–8192bit MODP).
  40. # These groups have been checked by many eyes and can be assumed
  41. # to be secure."
  42. BETTERCRYPTO_GROUP14='-----BEGIN DH PARAMETERS-----
  43. MIIBCAKCAQEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
  44. IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
  45. awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
  46. mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
  47. fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
  48. 5RXSJhiY+gUQFXKOWoqsqmj//////////wIBAg==
  49. -----END DH PARAMETERS-----
  50. '
  51. BETTERCRYPTO_GROUP15='-----BEGIN DH PARAMETERS-----
  52. MIIBiAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
  53. IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
  54. awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
  55. mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
  56. fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
  57. 5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM
  58. fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq
  59. ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS
  60. yv//////////AgEC
  61. -----END DH PARAMETERS-----
  62. '
  63. BETTERCRYPTO_GROUP16='-----BEGIN DH PARAMETERS-----
  64. MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
  65. IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
  66. awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
  67. mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
  68. fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
  69. 5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM
  70. fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq
  71. ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI
  72. ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O
  73. +S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI
  74. HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQI=
  75. -----END DH PARAMETERS-----
  76. '
  77. BETTERCRYPTO_GROUP17='-----BEGIN DH PARAMETERS-----
  78. MIIDCAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
  79. IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
  80. awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
  81. mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
  82. fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
  83. 5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM
  84. fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq
  85. ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI
  86. ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O
  87. +S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI
  88. HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG
  89. 3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU
  90. 7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId
  91. A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha
  92. xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/
  93. 8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA
  94. JP//////////AgEC
  95. -----END DH PARAMETERS-----
  96. '
  97. BETTERCRYPTO_GROUP18='-----BEGIN DH PARAMETERS-----
  98. MIIECAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb
  99. IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft
  100. awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT
  101. mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh
  102. fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq
  103. 5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM
  104. fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq
  105. ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI
  106. ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O
  107. +S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI
  108. HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG
  109. 3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU
  110. 7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId
  111. A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha
  112. xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/
  113. 8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R
  114. WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk
  115. ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw
  116. xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4
  117. Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i
  118. aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU
  119. 38gfVuiAuW5xYMmA3Zjt09///////////wIBAg==
  120. -----END DH PARAMETERS-----
  121. '
  122. function show_help {
  123. echo ''
  124. echo $"${PROJECT_NAME}-dhparam -h [hostname] -l [length in bits] --recalc [yes|no] --fast [yes|no]"
  125. echo ''
  126. exit 0
  127. }
  128. function calc_dh {
  129. if [[ $FAST == 'yes' ]]; then
  130. DHGROUP=$(( ( RANDOM % 4 ) + 14 ))
  131. if [[ ${DHGROUP} == 14 ]]; then
  132. echo "$BETTERCRYPTO_GROUP14" > ${1}
  133. else
  134. if [[ ${DHGROUP} == 15 ]]; then
  135. echo "$BETTERCRYPTO_GROUP15" > ${1}
  136. else
  137. if [[ ${DHGROUP} == 16 ]]; then
  138. echo "$BETTERCRYPTO_GROUP16" > ${1}
  139. else
  140. if [[ ${DHGROUP} == 17 ]]; then
  141. echo "$BETTERCRYPTO_GROUP17" > ${1}
  142. else
  143. echo "$BETTERCRYPTO_GROUP18" > ${1}
  144. fi
  145. fi
  146. fi
  147. fi
  148. else
  149. openssl dhparam -check -text $KEYLENGTH -out ${1}
  150. if [ ! "$?" = "0" ]; then
  151. exit 3674
  152. fi
  153. fi
  154. chmod 640 ${1}
  155. }
  156. function regenerate_dh_keys {
  157. for file in /etc/ssl/mycerts/*
  158. do
  159. if [[ -f $file ]]; then
  160. filename=/etc/ssl/certs/$(echo $file | awk -F '/etc/ssl/mycerts/' '{print $2}' | awk -F '.crt' '{print $1}').dhparam
  161. if [ -f $filename ]; then
  162. calc_dh $filename
  163. echo $"Recalculated DH params for $filename"
  164. fi
  165. fi
  166. done
  167. }
  168. while [[ $# > 1 ]]
  169. do
  170. key="$1"
  171. case $key in
  172. --help)
  173. show_help
  174. ;;
  175. -h|--hostname)
  176. shift
  177. HOSTNAME="$1"
  178. ;;
  179. -l|--dhkey)
  180. shift
  181. KEYLENGTH=${1}
  182. ;;
  183. --recalc)
  184. shift
  185. RECALCULATE=${1}
  186. ;;
  187. --fast)
  188. shift
  189. if [[ ${1} == $"yes" || ${1} == $"y" ]]; then
  190. FAST='yes'
  191. fi
  192. ;;
  193. *)
  194. # unknown option
  195. ;;
  196. esac
  197. shift
  198. done
  199. if [[ $RECALCULATE == "yes" || $RECALCULATE == "y" ]]; then
  200. regenerate_dh_keys
  201. exit 0
  202. fi
  203. if [ ! $HOSTNAME ]; then
  204. echo $'No hostname specified'
  205. exit 5728
  206. fi
  207. if ! which openssl > /dev/null ;then
  208. echo $"$0: openssl is not installed, exiting" 1>&2
  209. exit 5689
  210. fi
  211. if [ ! -d /etc/ssl/mycerts ]; then
  212. mkdir -p /etc/ssl/mycerts
  213. fi
  214. calc_dh /etc/ssl/certs/$HOSTNAME.dhparam
  215. systemctl reload nginx
  216. exit 0