Explorar el Código

Cerificate pinning

Bob Mottram hace 9 años
padre
commit
2a04c73d82
Se han modificado 5 ficheros con 96 adiciones y 18 borrados
  1. BIN
      man/freedombone-pin-cert.1.gz
  2. 19
    18
      src/freedombone
  3. 13
    0
      src/freedombone-addcert
  4. 60
    0
      src/freedombone-pin-cert
  5. 4
    0
      src/freedombone-renew-cert

BIN
man/freedombone-pin-cert.1.gz Ver fichero


+ 19
- 18
src/freedombone Ver fichero

@@ -4325,7 +4325,7 @@ function configure_imap_client_certs {
4325 4325
       if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
4326 4326
           ${PROJECT_NAME}-addcert -h $DEFAULT_DOMAIN_NAME --ca "" --dhkey $DH_KEYLENGTH
4327 4327
       else
4328
-          ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
4328
+          ${PROJECT_NAME}-addcert -e $DEFAULT_DOMAIN_NAME -s $LETSENCRYPT_SERVER --ca "" --dhkey $DH_KEYLENGTH
4329 4329
       fi
4330 4330
   fi
4331 4331
   # CA configuration
@@ -6767,14 +6767,6 @@ function install_wiki {
6767 6767
   if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
6768 6768
       rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
6769 6769
   fi
6770
-  if [ ! -f /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam ]; then
6771
-      if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
6772
-          ${PROJECT_NAME}-addcert -h $WIKI_DOMAIN_NAME --dhkey $DH_KEYLENGTH
6773
-      else
6774
-          ${PROJECT_NAME}-addcert -e $WIKI_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
6775
-      fi
6776
-      check_certificates $WIKI_DOMAIN_NAME
6777
-  fi
6778 6770
 
6779 6771
   ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
6780 6772
 
@@ -7002,6 +6994,15 @@ function install_wiki {
7002 6994
   echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
7003 6995
   echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
7004 6996
 
6997
+  if [ ! -f /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam ]; then
6998
+      if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
6999
+          ${PROJECT_NAME}-addcert -h $WIKI_DOMAIN_NAME --dhkey $DH_KEYLENGTH
7000
+      else
7001
+          ${PROJECT_NAME}-addcert -e $WIKI_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
7002
+      fi
7003
+      check_certificates $WIKI_DOMAIN_NAME
7004
+  fi
7005
+
7005 7006
   configure_php
7006 7007
 
7007 7008
   nginx_ensite $WIKI_DOMAIN_NAME
@@ -7090,15 +7091,6 @@ function install_blog {
7090 7091
 
7091 7092
   chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
7092 7093
 
7093
-  if [ ! -f /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam ]; then
7094
-      if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
7095
-          ${PROJECT_NAME}-addcert -h $FULLBLOG_DOMAIN_NAME --dhkey $DH_KEYLENGTH
7096
-      else
7097
-          ${PROJECT_NAME}-addcert -e $FULLBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
7098
-      fi
7099
-      check_certificates $FULLBLOG_DOMAIN_NAME
7100
-  fi
7101
-
7102 7094
   echo 'server {' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
7103 7095
   echo '    listen 80;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
7104 7096
   echo "    root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
@@ -7272,6 +7264,15 @@ function install_blog {
7272 7264
   echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
7273 7265
   echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
7274 7266
 
7267
+  if [ ! -f /etc/ssl/certs/$FULLBLOG_DOMAIN_NAME.dhparam ]; then
7268
+      if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
7269
+          ${PROJECT_NAME}-addcert -h $FULLBLOG_DOMAIN_NAME --dhkey $DH_KEYLENGTH
7270
+      else
7271
+          ${PROJECT_NAME}-addcert -e $FULLBLOG_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH
7272
+      fi
7273
+      check_certificates $FULLBLOG_DOMAIN_NAME
7274
+  fi
7275
+
7275 7276
   configure_php
7276 7277
 
7277 7278
   # blog settings

+ 13
- 0
src/freedombone-addcert Ver fichero

@@ -205,7 +205,14 @@ if [ $LETSENCRYPT_HOSTNAME ]; then
205 205
     ln -s /etc/letsencrypt/live/${LETSENCRYPT_HOSTNAME}/fullchain.pem /etc/ssl/certs/${LETSENCRYPT_HOSTNAME}.pem
206 206
 
207 207
     cp /etc/letsencrypt/live/${LETSENCRYPT_HOSTNAME}/fullchain.pem /etc/ssl/mycerts/${LETSENCRYPT_HOSTNAME}.pem
208
+
208 209
     systemctl start nginx
210
+
211
+    ${PROJECT_NAME}-pin-cert $LETSENCRYPT_HOSTNAME
212
+    if [ ! "$?" = "0" ]; then
213
+        echo $"Certificate for $LETSENCRYPT_HOSTNAME could not be pinned"
214
+        exit 62878
215
+    fi
209 216
 else
210 217
     CERTFILE=$HOSTNAME
211 218
     if [[ $ORGANISATION == "Freedombone-CA" ]]; then
@@ -219,6 +226,12 @@ else
219 226
     chmod 400 /etc/ssl/private/${CERTFILE}.key
220 227
     chmod 640 /etc/ssl/certs/${CERTFILE}.crt
221 228
     cp /etc/ssl/certs/${CERTFILE}.crt /etc/ssl/mycerts
229
+
230
+    ${PROJECT_NAME}-pin-cert $CERTFILE
231
+    if [ ! "$?" = "0" ]; then
232
+        echo $"Certificate for $CERTFILE could not be pinned"
233
+        exit 62879
234
+    fi
222 235
 fi
223 236
 
224 237
 # generate DH params

+ 60
- 0
src/freedombone-pin-cert Ver fichero

@@ -0,0 +1,60 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Performs certificate pinning (HPKP) on a given domain name
12
+
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26
+# GNU General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU General Public License
29
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
30
+
31
+PROJECT_NAME='freedombone'
32
+
33
+export TEXTDOMAIN=${PROJECT_NAME}-pin-cert
34
+export TEXTDOMAINDIR="/usr/share/locale"
35
+
36
+DOMAIN_NAME=$1
37
+KEY_FILENAME=/etc/ssl/private/${DOMAIN_NAME}.key
38
+SITE_FILENAME=/etc/nginx/sites-available/${DOMAIN_NAME}
39
+
40
+if [ ! -f "$KEY_FILENAME" ]; then
41
+    echo $"No certificate found for $DOMAIN_NAME"
42
+    exit 1
43
+fi
44
+
45
+if [ ! -f "$SITE_FILENAME" ]; then
46
+    exit 0
47
+fi
48
+
49
+KEY_HASH=$(openssl rsa -in $KEY_FILENAME -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64)
50
+
51
+PIN_HEADER="add_header Public-Key-Pins 'pin-sha256=\"${KEY_HASH}\"; max-age=5184000; includeSubDomains';"
52
+if ! grep -q "add_header Public-Key-Pins" $SITE_FILENAME; then
53
+    sed -i "/add_header Access-Control-Allow-Origin.*/a $PIN_HEADER" $SITE_FILENAME
54
+else
55
+    sed -i "s/add_header Public-Key-Pins.*/$PIN_HEADER/g" $SITE_FILENAME
56
+fi
57
+
58
+systemctl restart nginx
59
+
60
+exit 0

+ 4
- 0
src/freedombone-renew-cert Ver fichero

@@ -73,6 +73,8 @@ function renew_letsencrypt {
73 73
     # Ensure that links are in place
74 74
     ln -s /etc/letsencrypt/live/${HOSTNAME}/privkey.pem /etc/ssl/private/${HOSTNAME}.key
75 75
     ln -s /etc/letsencrypt/live/${HOSTNAME}/fullchain.pem /etc/ssl/certs/${HOSTNAME}.pem
76
+
77
+    ${PROJECT_NAME}-pin-cert $HOSTNAME
76 78
 }
77 79
 
78 80
 function renew_startssl {
@@ -171,6 +173,8 @@ function renew_startssl {
171 173
     echo $'Once you have retrieved the new public certificate paste it to:'
172 174
     echo $"/etc/ssl/certs/$HOSTNAME.new.crt then run this command again."
173 175
     echo ''
176
+
177
+    ${PROJECT_NAME}-pin-cert $HOSTNAME
174 178
 }
175 179
 
176 180
 while [[ $# > 1 ]]