Fixação de chave pública HKPK - Script de adição automática

1

Recentemente, comecei a usar a pinagem de chave pública do HKPK.

Eu tenho um script automatizado que gera meu certificado csr e instala o apache2 no opensuse 42.3

Estou procurando uma maneira de adicionar impressões digitais spki ao cabeçalho Public Key Pin no meu arquivo VirtualHost.

Eu gero a impressão digital com:

openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

Eu preciso adicionar automaticamente:

pin-sha256=\"spki_fingerprint_here\";

Eu preciso fazer isso sem reescrever completamente toda a linha, então os valores pin-sha256 na frente ficam e a configuração:

max-age=345600; includeSubDomains"

... no final fica onde está ^^.

A linha inteira parece:

Header set Public-Key-Pins "pin-sha256=\"spki_fingerprint1\"; pin-sha256=\"spki_fingerprint2\"; pin-sha256=\"new_spki_fingerprint_added_here\"; max-age=2592000; includeSubDomains"

Eu não sou um programador ou especialista em linux

Qualquer conselho que possa me levar na direção correta seria muito útil. Obrigado antecipadamente.

    
por Bennett 19.05.2018 / 04:15

2 respostas

0

Um amigo meu escreveu um script para executar essa função.

#/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";
}
    
por 02.08.2018 / 01:04
0

Aqui eu procuro max-age , supondo que ele seja encontrado apenas uma vez no arquivo.

perl -i -lape "s/(.*)( max-age.*)/\ <substitute-string> \/" virtualhost.conf

Onde a string substituta pode ser escrita como:

pin-sha256=\\\"$(openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)\\\"\

Resposta:

Juntando a geração de impressões digitais ao comando de substituição, você obtém:

perl -i -lape "s/(.*)( max-age.*)/\ pin-sha256=\\\"$(openssl x509 -pubkey < certificate.crt | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64)\\\"\/" virtualhost.conf

Nota:

Aspas duplas em torno da instrução perl são necessárias para que o comando de geração de impressões digitais seja executado. Eles fazem muito escape \ necessário.

    
por 13.06.2018 / 17:56