Linux
HKPK 公鑰固定 - 自動添加 bash 腳本
我最近開始使用 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
為了執行指紋生成命令,指令需要雙引號。他們使很多逃避成為\
必要。