| name | inet-toolbox |
| description | Implementatiegidsen uit de internet.nl toolbox-wiki: DNSSEC, HTTPS/TLS, DMARC, DKIM, SPF, DANE, IPv6 op BIND, NSD, Nginx, Apache, Postfix. Let's Encrypt. |
| model | sonnet |
| allowed-tools | ["Bash(gh api *)","Bash(curl -s *)","Bash(dig *)","Bash(openssl *)","WebFetch(*)"] |
| metadata | {"created-with-ai":"true","created-with-model":"claude-opus-4-20250514","created-date":"2025-02-22","status":"concept"} |
CONCEPT — Let op: Deze skill is geen officieel product van internet.nl. De beschrijvingen zijn informatieve samenvattingen — niet de officiële standaarden zelf. De testcriteria op internet.nl en de definities op forumstandaardisatie.nl zijn altijd leidend. Overheidsorganisaties die generatieve AI inzetten dienen te voldoen aan het Overheidsbreed standpunt voor de inzet van generatieve AI. Zie onze verantwoording en DISCLAIMER.md.
Gebruik deze skill wanneer een gebruiker vraagt hoe een specifieke internetstandaard
stap-voor-stap geimplementeerd moet worden. Genereer werkende configuratie voor het
gevraagde platform. Raadpleeg de toolbox-wiki voor de meest actuele instructies.
Overzicht
De toolbox-wiki bevat
implementatiegidsen voor alle standaarden die internet.nl test.
De gidsen zijn geschreven voor veelgebruikte platformen en DNS-providers.
Toolbox-wiki verkennen
gh api repos/internetstandards/toolbox-wiki/git/trees/main?recursive=1 \
--jq '.tree[] | select(.type=="blob") | .path'
gh api repos/internetstandards/toolbox-wiki/contents/DNSSEC.md \
--jq '.content' | base64 -d
Implementatiegidsen
1. DNSSEC instellen
DNSSEC beveiligt DNS-antwoorden met cryptografische handtekeningen.
BIND 9
zone "example.nl" {
type master;
file "/var/lib/bind/example.nl.zone";
key-directory "/var/lib/bind/keys";
auto-dnssec maintain;
inline-signing yes;
};
cd /var/lib/bind/keys
dnssec-keygen -a ECDSAP256SHA256 -f KSK example.nl
dnssec-keygen -a ECDSAP256SHA256 example.nl
rndc reload example.nl
dig DNSKEY example.nl @localhost | dnssec-dsfromkey -f - example.nl
NSD
ldns-keygen -a ECDSAP256SHA256 -k example.nl
ldns-keygen -a ECDSAP256SHA256 example.nl
ldns-signzone -n example.nl.zone Kexample.nl.+013+*.private
zone:
name: "example.nl"
zonefile: "example.nl.zone.signed"
nsd-control reload
Verificatie
dig DNSKEY example.nl +short +multi
dig DS example.nl +short
dig example.nl +dnssec +short
dig @9.9.9.9 example.nl +dnssec
2. HTTPS/TLS configureren
Let's Encrypt certificaat verkrijgen
apt install certbot
certbot certonly --standalone -d example.nl -d www.example.nl
certbot --nginx -d example.nl -d www.example.nl
certbot --apache -d example.nl -d www.example.nl
certbot renew --dry-run
Nginx HTTPS-configuratie
# /etc/nginx/sites-available/example.nl
server {
listen 80;
listen [::]:80;
server_name example.nl www.example.nl;
return 301 https://example.nl$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.nl www.example.nl;
# Certificaten
ssl_certificate /etc/letsencrypt/live/example.nl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.nl/privkey.pem;
# TLS configuratie (NCSC-conform)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.nl/chain.pem;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Security headers
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
root /var/www/example.nl;
index index.html;
}
Apache HTTPS-configuratie
# /etc/apache2/sites-available/example.nl.conf
<VirtualHost *:80>
ServerName example.nl
ServerAlias www.example.nl
Redirect permanent / https://example.nl/
</VirtualHost>
<VirtualHost *:443>
ServerName example.nl
ServerAlias www.example.nl
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.nl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.nl/privkey.pem
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLUseStapling on
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy "default-src 'self'"
DocumentRoot /var/www/example.nl
</VirtualHost>
SSLStaplingCache shmcb:/var/run/ocsp(128000)
3. DMARC gefaseerd uitrollen
Controleren:
dig TXT _dmarc.example.nl +short
4. DKIM instellen
Sleutel genereren en publiceren
openssl genrsa -out /etc/dkim/example.nl.private 2048
openssl rsa -in /etc/dkim/example.nl.private -pubout -outform DER | base64 -w0
Postfix met OpenDKIM
apt install opendkim opendkim-tools
opendkim-genkey -b 2048 -d example.nl -D /etc/opendkim/keys/ -s selector202602
systemctl restart opendkim
systemctl restart postfix
Controleren:
dig TXT selector202602._domainkey.example.nl +short
5. SPF-record samenstellen
Vuistregels:
- Maximaal 10 DNS-lookups (elke
include, a, mx, redirect telt als 1)
- Gebruik
ip4/ip6 om lookups te besparen
- Eindig altijd met
-all (fail) of ~all (softfail)
- Gebruik
include voor externe mailproviders
DNS-lookups tellen:
dig TXT example.nl +short | grep "v=spf1"
dig TXT _spf.google.com +short
6. DANE instellen
Vereisten: DNSSEC moet actief zijn op het MX-domein.
dig MX example.nl +dnssec +short
openssl s_client -connect mx.example.nl:25 -starttls smtp </dev/null 2>/dev/null | \
openssl x509 -pubkey -noout | \
openssl pkey -pubin -outform DER | \
openssl dgst -sha256 -binary | xxd -p -c 32
dig TLSA _25._tcp.mx.example.nl +short
Bij certificaatvernieuwing:
- Als je dezelfde privesleutel hergebruikt: TLSA hoeft niet te veranderen
- Als je een nieuwe sleutel genereert: update het TLSA-record VOOR de vernieuwing
7. IPv6 inschakelen
DNS-records
; AAAA-records toevoegen naast bestaande A-records
example.nl. IN A 192.0.2.1
example.nl. IN AAAA 2001:db8::1
www.example.nl. IN A 192.0.2.1
www.example.nl. IN AAAA 2001:db8::1
; Nameservers
ns1.example.nl. IN A 192.0.2.10
ns1.example.nl. IN AAAA 2001:db8::10
; Mailservers
mx.example.nl. IN A 192.0.2.20
mx.example.nl. IN AAAA 2001:db8::20
Webserver
# Nginx luistert standaard op IPv4+IPv6 als je [::] toevoegt
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
}
Verificatie
dig AAAA example.nl +short
curl -6 -sI https://example.nl | head -5
ping6 example.nl
Repositories
Veelvoorkomende problemen
| Probleem | Oorzaak | Oplossing |
|---|
| Let's Encrypt verificatie faalt | Poort 80 niet bereikbaar of DNS niet correct | Controleer firewall en DNS-records |
| DNSSEC-validatie faalt na key rollover | DS bij registrar niet bijgewerkt | Publiceer nieuw DS-record bij registrar |
| DKIM-header niet aanwezig in mail | OpenDKIM draait niet of milter niet gekoppeld | Controleer systemctl status opendkim en Postfix milter-config |
| SPF permerror | Meer dan 10 DNS-lookups | Vervang include door ip4/ip6 waar mogelijk |
| DANE TLSA mismatch na certificaatvernieuwing | TLSA-record niet bijgewerkt | Gebruik SPKI (selector=1) en hergebruik privesleutel, of update TLSA vooraf |
| IPv6 niet bereikbaar | Firewall blokkeert IPv6 of geen IPv6-adres | Controleer ip -6 addr en firewall-regels (ip6tables/nftables) |
Achtergrondinfo
Zie reference.md voor links naar specifieke toolbox-wiki pagina's
en geavanceerde configuraties.