Недавно я начал использовать закрепление открытого ключа HKPK.
У меня есть автоматический скрипт, который генерирует мой csr, сертификат и устанавливается в apache2 при opensuse leap 42.3
Я ищу способ добавить отпечатки пальцев spki в заголовок Public Key Pin в моем файле VirtualHost.
Я генерирую отпечаток пальца с помощью:
openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
Мне нужно автоматически добавить:
pin-sha256=\"spki_fingerprint_here\";
Мне нужно сделать это, не переписывая полностью всю строку, чтобы значения pin-sha256 остались впереди, а конфигурация:
max-age=345600; includeSubDomains"
... в конце остается на месте ^^.
Вся строка выглядит так:
Header set Public-Key-Pins "pin-sha256=\"spki_fingerprint1\"; pin-sha256=\"spki_fingerprint2\"; pin-sha256=\"new_spki_fingerprint_added_here\"; max-age=2592000; includeSubDomains"
Я не программист и не эксперт по Linux
Любой совет, который может привести меня в правильное русло, был бы очень полезен. Заранее спасибо.
Мой друг написал мне сценарий для выполнения этой функции.
#/usr/bin/perl
use strict;
use warnings;
my $inputFile = "sample.conf";
my $outputFile = "sample.conf.modified";
my $searchString = "Header set Public-Key-Pins";
my $updateString = " Header set Public-Key-Pins ";
my $numberOfPins = $#ARGV + 1;
if ($numberOfPins < 1) {
die "Error: Minimum 1 command line argument required";
}
my $pinCounter = 1;
my $onePin;
foreach my $argNum (0 .. $#ARGV) {
$onePin = $ARGV[$argNum];
if ($pinCounter == "1") {
$updateString = $updateString . "\"";
}
$updateString = $updateString . "pin-sha256=\\\"$onePin\\\"";
if ($pinCounter < $numberOfPins) {
$updateString = $updateString . "; ";
}
else {
$updateString = $updateString . "; max-age=000000; includeSubDomains\"";
}
++$pinCounter;
}
open INFILE, $inputFile or die "Can't read from $inputFile!\n";
my $numberOfMatches = 0;
my @lines;
while (my $line = <INFILE>) {
if (index($line, $searchString) != -1) {
push @lines, "$updateString\n";
++$numberOfMatches;
} else {
push @lines, $line;
}
}
close INFILE;
open OUTFILE, '>', $outputFile or die "Can't write to $outputFile!\n";
print OUTFILE @lines;
close OUTFILE;
if ($numberOfMatches != "1") {
die "Error: expected 1 match but found: $numberOfMatches matches\n";
}
Здесь я ищу max-age
при условии, что он найден в файле только один раз.
perl -i -lape "s/(.*)( max-age.*)/\$1 <substitute-string> \$2/" virtualhost.conf
Где заменяющая строка может быть записана как:
pin-sha256=\\\\\"$(openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)\\\\\"\$2
Ответ:
Собирая генерацию отпечатка пальца с помощью команды подстановки, вы получаете:
perl -i -lape "s/(.*)( max-age.*)/\$1 pin-sha256=\\\\\"$(openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)\\\\\"\$2/" virtualhost.conf
Примечание:
Двойные кавычки вокруг perl
инструкции необходимы для выполнения команды создания отпечатка пальца. Они много убегают \
нужно.