我最近开始使用 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";
}