Объединить два пакета сертификатов в один файл без дубликатов - PullRequest
0 голосов
/ 07 октября 2019

У меня есть два пакета (несколько сотен сертификатов в каждом), закодированные в base64, поэтому:

-----BEGIN CERTIFICATE-----
hash
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash3
-----END CERTIFICATE-----
(...)

Несколько сертификатов (довольно много, я бы сказал) присутствуют в обоих пакетах, некоторые уникальны.

Мне нужно объединить их в один файл и избежать дубликатов. Я пытался сортировать - но так как каждый сертификат состоит из нескольких строк, это просто уничтожило файлы.

Я не женат на идее, состоящей из одной строки - всего, что выполняет работу, без необходимости вручную просматривать каждый файл.

РЕДАКТИРОВАТЬ: У меня есть идея, и начал некоторые действия по ней. В общем, мне удалось разделить пакеты на отдельные файлы:

Я сделал небольшой шаг ... Используя awk, я разделил файлы на отдельные сертификаты:

$ cat bundle-t.crt | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".t.extracted.crt" }'
$ cat bundle-a.crt | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".a.extracted.crt" }'

Теперь у меня естьболее 400 файлов с именами 1.t.exctracted.crt, 1.a.extracted.crt и так далее. Все они имеют разные имена, некоторые имеют одинаковое содержание. Следующим шагом будет поиск дубликатов контента, который кажется одинаково трудным.

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Что ж, довольно легко, когда вы поймете, что md5sum только хэширует содержимое и игнорирует имя файла. Таким образом, окончательное решение состоит из 3 строк:

$ cat bundle-t.crt | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".t.extracted.crt" }'
$ cat bundle-a.crt | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".a.extracted.crt" }'
$ ls *.*.extracted.crt | while read file; do md5sum $file; done > ../sumy.txt

, и это обеспечивает аккуратный список хешей и соответствующих им имен файлов, которые я могу вставить в Excel и отсортировать для поиска дубликатов:

81c3813ccb2e70195fff2d32981ee379  122.t.extracted.crt
81c3813ccb2e70195fff2d32981ee379  123.a.extracted.crt
4e1c95dabb928f48a1376405cdf47fa5  123.t.extracted.crt
4e1c95dabb928f48a1376405cdf47fa5  124.a.extracted.crt
5a378ac46ea08bfa63fd150f48deecf8  124.t.extracted.crt
5a378ac46ea08bfa63fd150f48deecf8  125.a.extracted.crt
fb4dc4aec9bc307fa7d4b8dbb9abe7d7  125.t.extracted.crt
fb4dc4aec9bc307fa7d4b8dbb9abe7d7  126.a.extracted.crt
d62005dd9d237147998f9dbfb37ce8f1  126.t.extracted.crt
d62005dd9d237147998f9dbfb37ce8f1  127.a.extracted.crt
97c19f5ba9e0859dd5d40beebfe67d39  127.t.extracted.crt
97c19f5ba9e0859dd5d40beebfe67d39  128.a.extracted.crt
9d5376bfef27a0b1518abc401b4e6085  128.t.extracted.crt
9d5376bfef27a0b1518abc401b4e6085  129.a.extracted.crt
4ac1beb1e80664d126e6fc4e5e33fcbd  129.t.extracted.crt
0 голосов
/ 08 октября 2019

Вот небольшой awk скрипт (стандартный Linux GNU awk), который выполняет эту работу. Для любого количества файлов сертификатов. Он объединяет все сертификаты в наборе (каждый член уникален) и выводит их.

script.awk

BEGIN {RS="-----END CERTIFICATE-----"}  # define record separator
{certArr[$0] = $0 RS;}   # capture each certificat in certArr array from input files
END {for(cert in certArr) print certArr[cert]} # print out the certificates array (not in order)

certs1.pem

-----BEGIN CERTIFICATE-----
hash1
hash1.1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash2
hash2.1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash3
hash3.1
-----END CERTIFICATE-----

certs2.pem

-----BEGIN CERTIFICATE-----
hash1
hash1.1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash4
hash4.1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash3
hash3.1
-----END CERTIFICATE-----

работает:

awk -f script.awk certs*

выход:

-----BEGIN CERTIFICATE-----
hash2
hash2.1
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
hash4
hash4.1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
hash1
hash1.1
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
hash3
hash3.1
-----END CERTIFICATE-----
0 голосов
/ 08 октября 2019

Так как вы уже использовали awk, вот решение, которое принимает любое количество комплектных файлов. Он работает просто, сохраняя сертификаты в качестве хеш-ключей, таким образом автоматически удаляя дубликаты.

#!/usr/bin/gawk -f
/-----BEGIN CERTIFICATE-----/   { hash = "" }
                                { hash = hash $0 RS }
/-----END CERTIFICATE-----/     { hashhash[hash] = 1 }
END     { for (hash in hashhash) printf "%s", hash }

...