我想更好地了解Resolv :: DNS如何处理不直接支持的记录。这些记录由Resolv :: DNS :: Resource :: Generic类表示,但我找不到有关如何从该记录中获取数据的文档。
具体来说,我的区域将包含SSHFP和TLSA记录,我需要一种方法来获取该数据。
答案 0 :(得分:3)
通过逆向工程,我找到了答案 - 在这里记录下来供其他人查看。
请注意,这涉及Resolv :: DNS模块的未记录功能,实施可能会随着时间而改变。
Resolv :: DNS模块不理解的资源记录不是通过Generic类表示,而是通过一个子类表示,其名称表示DNS响应的类型和类 - 例如,SSHFP记录(类型44)将表示为Resolv :: DNS :: Resource :: Generic :: Type44_Class1
该对象将包含一个方法" data"这使您可以以纯二进制格式访问记录的RDATA。
因此,要访问SSHFP记录,以下是如何获取它:
def handle_sshfp(rr) do
# the RDATA is a string but contains binary data
data = rr.data.bytes
algo = data[0].to_s
fptype = data[1].to_s
fp = data[2..-1].to_s
hex = fp.map{|b| b.to_s(16).rr.rjust(2,'0') }.join(':')
puts "The SSHFP record is: #{fptype} #{algo} #{hex}"
end
Resolv::DNS.open do |dns|
all_records = dns.getresources('myfqdn.example.com', Resolv::DNS::Resource::IN::ANY ) rescue nil
all_records.each do |rr|
if rr.is_a? Resolv::DNS::Resource::Generic then
classname = rr.class.name.split('::').last
handle_sshfp(rr) if classname == "Type44_Class1"
end
end
end