Linux

HKPK 公鑰固定 - 自動添加 bash 腳本

  • August 1, 2018

我最近開始使用 HKPK Public Key Pinning。

我有一個自動腳本,可以生成我的 csr、證書,並在 opensuse jump 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 ‘專家’

任何可以引導我走向正確方向的建議都會非常有幫助。先感謝您。

我的一個朋友給我寫了一個腳本來執行這個功能。

#/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為了執行指紋生成命令,指令需要雙引號。他們使很多逃避成為\必要。

引用自:https://serverfault.com/questions/912898