freedombone-dhparam 8.3KB

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