Ubuntu 22.04 LTS DNS服务器DNSSEC签名失败问题求助
环境信息
- 系统:Ubuntu 22.04 LTS(单服务器部署DNS、SPF、邮件、防火墙等)
- 服务器IP:
192.168.122.189 - 测试域名:
jetj.ltd - 主机名:
mail
配置文件内容
db.jetj.ltd
; ; BIND data file for jetj.ltd ; $INCLUDE /etc/bind/keys/Kjetj.ltd.+008+12125.key $TTL 86400 @ IN SOA mail.jetj.ltd. karti.jetj.ltd. ( 2023082501 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ; Minimum TTL ) ; Name Server (NS) records @ IN NS mail.jetj.ltd. @ IN A 192.168.122.189 ; A record for the domain's nameserver mail IN A 192.168.122.189 ; Mail Exchanger (MX) record @ IN MX 10 mail.jetj.ltd.
named.conf.options
options { directory "/var/cache/bind"; recursion yes; listen-on { 192.168.122.189; }; allow-query { localhost; 192.168.122.0/24; }; // Allow queries from localhost and your local network forwarders { 8.8.8.8; 8.8.4.4; }; //======================================================================== // If BIND logs error messages about the root key being expired, // you will need to update your keys. //======================================================================== dnssec-validation auto; listen-on-v6 { any; }; }; trust-anchors { "." initial-key 256 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0="; };
named.conf.local
zone "jetj.ltd" { type master; file "/etc/bind/db.jetj.ltd"; dnssec-policy default; inline-signing yes; }; zone "122.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192"; dnssec-policy default; inline-signing yes; };
问题描述
我已经完成以下操作:
- 执行
named-checkconf未检测到任何错误 - 通过命令生成KSK密钥:
sudo dnssec-keygen -a RSASHA256 -b 2048 -f KSK -L 9000000 jetj.ltd - 将生成的密钥文件
Kjetj.ltd.+008+12125.key通过$INCLUDE引入到db.jetj.ltd中
但执行dnssec-signzone命令时总是报错:
karti@mail:/etc/bind$ dnssec-signzone -S -K keys/ db.jetj.ltd dnssec-signzone: fatal: No signing keys specified or found.
密钥文件内容如下:
; This is a key-signing key, keyid 12125, for jetj.ltd. ; Created: 20230905194204 (Tue Sep 5 19:42:04 2023) ; Publish: 20230905194204 (Tue Sep 5 19:42:04 2023) ; Activate: 20230905194204 (Tue Sep 5 19:42:04 2023) jetj.ltd. 9000000 IN DNSKEY 257 3 8 AwEAAbSbc3FDpa6u5FWnxza3wBzY+j6/zj6fs/5UWzzC5EmVugKloM9H 2j+2y6K8ShWDj744COlOFA+JfbFHzhFWDeg/MpXyKX8ah5K2rB3apdQc 48BytgoXgflyBHO9/tHJOlkNDNiL7Nk3VBLABl2MZr2+XM5bQV9Bx8bA tBI+8+yPHMcq9hJ8ZZW8Fc2NENWw1cS+4hJpiNEM3vBVanRBKAfczZR5 Odx4qGoDBatDR00dfNzlrpr3cvy66giNEbDv2APPMO8YD6rTeT0GyMXM gQ1SULHxAo3G8GmzEiAd6rplKA4tZ+TXIPHZqx8/5Nu6moizXntxGOCU 4egalBQoQKs=
我已经卡这个问题一周了,非常感谢任何帮助和建议!
解决方案
嘿,我来帮你梳理下问题所在,你遇到的这个“No signing keys specified or found”错误其实挺常见的,主要是几个小细节没处理好,咱们一步步来解决:
问题核心原因
你现在只生成了KSK(密钥签名密钥),但DNSSEC签名需要两种密钥配合:KSK负责签名DNSKEY记录,而**ZSK(区域签名密钥)**才是用来签名区域内其他所有记录的。另外还要确认密钥的路径、权限有没有问题,这些都是容易踩的坑。
分步解决步骤
1. 先检查密钥的路径和权限
你执行签名命令的时候用了-K keys/,先确认你的密钥文件是不是真的在/etc/bind/keys/目录里?跑个命令看看:
ls -l /etc/bind/keys/
要确保Kjetj.ltd.+008+12125.key和对应的.private密钥文件都在这儿,而且权限得是bind用户能访问的:
sudo chown bind:bind /etc/bind/keys/Kjetj.ltd.+008+12125.* sudo chmod 640 /etc/bind/keys/Kjetj.ltd.+008+12125.*
2. 生成缺失的ZSK密钥
现在你只有KSK,必须生成ZSK才能完成整个区域的签名,执行这条命令:
sudo dnssec-keygen -a RSASHA256 -b 2048 -L 9000000 jetj.ltd
这条命令会生成另一组密钥(文件名类似Kjetj.ltd.+008+xxxx.key和.private),把它们也移到/etc/bind/keys/目录,同样设置好权限。
3. 选择自动签名或手动签名
其实你在named.conf.local里已经开了dnssec-policy default和inline-signing yes,这时候BIND可以自动帮你完成签名,根本不用手动跑dnssec-signzone,试试这个更简单的方法:
sudo systemctl restart bind9
重启后,BIND会自动用你生成的KSK和ZSK对区域进行签名,之后可以用这条命令验证:
dig jetj.ltd DNSKEY @192.168.122.189
如果能看到DNSKEY记录,就说明签名成功了。
要是你非得手动签名的话,得在命令里明确指定KSK,让它自动找ZSK:
cd /etc/bind dnssec-signzone -S -K keys/ -k Kjetj.ltd.+008+12125 db.jetj.ltd
签名完成后会生成db.jetj.ltd.signed文件,记得把named.conf.local里的zone配置里的file改成这个签名后的文件,再重启BIND。
4. 最后验证一下
不管用哪种方式,签名完成后可以用dig命令查一下区域的DS记录或者DNSKEY记录,确认签名生效了。
备注:内容来源于stack exchange,提问作者Kartibok

