HKPK 公钥固定 - 自动添加 bash 脚本

HKPK 公钥固定 - 自动添加 bash 脚本

我最近开始使用 HKPK 公钥固定。

我有一个自动脚本,可以生成我的 csr、证书,并安装到 opensuse leap 42.3 上的 apache2 中

我正在寻找一种方法将 spki 指纹添加到我的 VirtualHost 文件中的公钥 Pin 标头中。

我使用以下方法生成指纹:

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“专家”

任何能指引我正确方向的建议都会非常有帮助。提前谢谢您。

答案1

在这里我搜索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。它们使得大量转义成为\必要。

答案2

我的一个朋友为我编写了一个脚本来执行此功能。

#/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";
}

相关内容