|
@@ -33,10 +33,49 @@ PROJECT_NAME='freedombone'
|
33
|
33
|
export TEXTDOMAIN=${PROJECT_NAME}-pin-cert
|
34
|
34
|
export TEXTDOMAINDIR="/usr/share/locale"
|
35
|
35
|
|
|
36
|
+WEBSITES_DIRECTORY=/etc/nginx/sites-available
|
|
37
|
+
|
|
38
|
+function pin_all_certs {
|
|
39
|
+ if [ ! -d $WEBSITES_DIRECTORY ]; then
|
|
40
|
+ return
|
|
41
|
+ fi
|
|
42
|
+
|
|
43
|
+ cd $WEBSITES_DIRECTORY
|
|
44
|
+ for file in `dir -d *` ; do
|
|
45
|
+ if grep -q "Public-Key-Pins" $file; then
|
|
46
|
+ DOMAIN_NAME=$file
|
|
47
|
+ KEY_FILENAME=/etc/ssl/private/${DOMAIN_NAME}.key
|
|
48
|
+ if [ -f $KEY_FILENAME ]; then
|
|
49
|
+ BACKUP_KEY_FILENAME=/etc/ssl/certs/${DOMAIN_NAME}.pem
|
|
50
|
+ if [ -f $BACKUP_KEY_FILENAME ]; then
|
|
51
|
+ KEY_HASH=$(openssl rsa -in $KEY_FILENAME -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64)
|
|
52
|
+ BACKUP_KEY_HASH=$(openssl rsa -in $BACKUP_KEY_FILENAME -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64)
|
|
53
|
+ if [ ${#BACKUP_KEY_HASH} -gt 5 ]; then
|
|
54
|
+
|
|
55
|
+ PIN_HEADER="Public-Key-Pins 'pin-sha256=\"${KEY_HASH}\"; pin-sha256=\"${BACKUP_KEY_HASH}\"; max-age=5184000; includeSubDomains';"
|
|
56
|
+ sed -i "s|Public-Key-Pins.*|${PIN_HEADER}|g" $file
|
|
57
|
+ echo "Pinned $DOMAIN_NAME"
|
|
58
|
+ fi
|
|
59
|
+ fi
|
|
60
|
+ fi
|
|
61
|
+ fi
|
|
62
|
+ done
|
|
63
|
+}
|
|
64
|
+
|
|
65
|
+if [[ $1 == "all" ]]; then
|
|
66
|
+ pin_all_certs
|
|
67
|
+ systemctl restart nginx
|
|
68
|
+ exit 0
|
|
69
|
+fi
|
|
70
|
+
|
36
|
71
|
DOMAIN_NAME=$1
|
37
|
72
|
KEY_FILENAME=/etc/ssl/private/${DOMAIN_NAME}.key
|
38
|
73
|
BACKUP_KEY_FILENAME=/etc/ssl/certs/${DOMAIN_NAME}.pem
|
39
|
|
-SITE_FILENAME=/etc/nginx/sites-available/${DOMAIN_NAME}
|
|
74
|
+SITE_FILENAME=$WEBSITES_DIRECTORY/${DOMAIN_NAME}
|
|
75
|
+
|
|
76
|
+if [ ! -f "$SITE_FILENAME" ]; then
|
|
77
|
+ exit 0
|
|
78
|
+fi
|
40
|
79
|
|
41
|
80
|
if [ ! -f "$KEY_FILENAME" ]; then
|
42
|
81
|
echo $"No private key certificate found for $DOMAIN_NAME"
|
|
@@ -45,16 +84,22 @@ fi
|
45
|
84
|
|
46
|
85
|
if [ ! -f "$BACKUP_KEY_FILENAME" ]; then
|
47
|
86
|
echo $"No fullchain certificate found for $DOMAIN_NAME"
|
48
|
|
- exit 1
|
49
|
|
-fi
|
50
|
|
-
|
51
|
|
-if [ ! -f "$SITE_FILENAME" ]; then
|
52
|
|
- exit 0
|
|
87
|
+ exit 2
|
53
|
88
|
fi
|
54
|
89
|
|
55
|
90
|
KEY_HASH=$(openssl rsa -in $KEY_FILENAME -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64)
|
56
|
91
|
BACKUP_KEY_HASH=$(openssl rsa -in $BACKUP_KEY_FILENAME -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64)
|
57
|
92
|
|
|
93
|
+if [ ${#KEY_HASH} -lt 5 ]; then
|
|
94
|
+ echo 'Pin hash unexpectedly short'
|
|
95
|
+ exit 3
|
|
96
|
+fi
|
|
97
|
+
|
|
98
|
+if [ ${#BACKUP_KEY_HASH} -lt 5 ]; then
|
|
99
|
+ echo 'Backup pin hash unexpectedly short'
|
|
100
|
+ exit 4
|
|
101
|
+fi
|
|
102
|
+
|
58
|
103
|
PIN_HEADER="Public-Key-Pins 'pin-sha256=\"${KEY_HASH}\"; pin-sha256=\"${BACKUP_KEY_HASH}\"; max-age=5184000; includeSubDomains';"
|
59
|
104
|
if ! grep -q "Public-Key-Pins" $SITE_FILENAME; then
|
60
|
105
|
sed -i "/ssl_ciphers.*/a add_header ${PIN_HEADER}" $SITE_FILENAME
|