I På jagt efter danske domænenavne skrev jeg om en smart metode, jeg har fundet til at finde de .dk-domænenavne, som autoriteterne ikke ville dele med mig.
Måske er der andre end mig, der er interesseret i at holde lidt øje med nye steder på internettet?
Her er i hvert fald en lille opskrift på, hvordan man gør:
Axeman er et program, der hjælper med at automatisere og parallellisere downloads af certifikatlogs. Jeg måtte rette det en lille smule for at få det til at køre, da det vist ikke vedligeholdes aktivt. “Min” udgave finder du her:
https://github.com/helmstedt/Axeman
Axeman gemmer certifikatlogs som csv-filer. Skriv fx…
axeman -u 'ct.googleapis.com/logs/argon2022'
…for at hente Googles 2022-logs. Det gik ikke specielt hurtigt hos mig, men det virkede.
Jeg skrev et lille program, der søger logfiler igennem for .dk-domæner (der kommer også nogle andre domæner med engang imellem, hvis der er “.dk” et sted i domænet). Det ser sådan her ud:
import os
from pathlib import Path
import csv
csv_dir = 'PATH_TO_LOG_FILES'
paths = Path(csv_dir).iterdir()
for file_path in paths:
# Open and process csv file
with open(file_path, 'rt') as csv_input:
print('Processing: ', file_path)
reader = csv.reader(csv_input)
for row in reader:
host = row[4]
if '.dk' in host:
print('Found: ', host)
with open('PATH_TO_OUTPUT_FILE.CSV', 'a') as dotdk_output:
dotdk_output.write(host + '\n')
# Delete csv file after processing
os.remove(file_path)
Det eneste lidt obskure i programmet er måske hvad der gemmer sig i row[4]? Den indeholder en liste over de domæner og subdomæner, det enkelte certifikat er udstedt til. Elementerne i listen er adskilt med mellemrum.
Efter grovsorteringen, skrev jeg endnu et lille program, der finsorterer. Det ser sådan her ud:
domains_in_file = set()
with open('PATH_TO_INPUT_FILE.CSV', 'rt') as file_input:
for index, row in enumerate(file_input):
items = row.split(' ')
for item in items:
item = item.replace('*.','').replace('\n','')
matches = re.findall(r'([^.]*$)', item)
dk_domain = ''
if matches[0] == 'dk':
dk_domain = item.split('.')
dk_domain = dk_domain[-2] + '.' + dk_domain[-1]
dk_domain = dk_domain.lower()
with open('PATH_TO_OUTPUT_FILE.BIN', 'wb') as unique_domains_file:
pickle.dump(domains_in_file, unique_domains_file)
Her er koden nok lidt mere obskur. Jeg tager hvert element i hver række fra CSV-filen i sidste trin og:
- Fjerner evt. wildcard (*.) og linjeskift (\n) fra værtsnavnet
- Finder domænesuffixet med et regulær udtryk
- Hvis domænesuffixet er .dk, splitter jeg hvert enkelt element i værstnavnet op i en liste
- Konstruerer selve domænenavnet ved at sætte det næstsidste (fx helmstedt) og sidste element (.dk) sammen
- Sørger for en sikkerheds skyld for, at konvertere domænenavnet til små bogstaver