Назад | Перейти на главную страницу

Привязка открытого ключа HKPK - автоматическое добавление сценария bash

Недавно я начал использовать закрепление открытого ключа 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 инструкции необходимы для выполнения команды создания отпечатка пальца. Они много убегают \ нужно.