如何正确解析LDIF导出的pKIOverlapPeriod为对应天数
问题原因
你的解析逻辑存在两个核心错误:
- 字节序配置错误:Windows FILETIME结构采用**小端(little-endian)**格式存储64位整数,你代码中指定
byteorder = 'big'按大端读取,完全颠倒了字节顺序。 - 属性语义理解错误:
pKIOverlapPeriod和pKIExpirationPeriod这两个AD证书模板属性,存储的不是从1601年起算的绝对时间点FILETIME值,而是带符号的负时间偏移量——值为0减去对应周期的100纳秒间隔总数,用来表示从证书过期时间往前回溯的时长,直接按无符号正数读取会得到远大于实际值的错误结果。
验证计算
以你提供的pKIOverlapPeriod值为例:
- Base64字符串
AICmCv/e//8=解码后得到8字节:00 80 a6 0a ff de ff ff - 按小端、有符号64位整数读取,得到值:
-36288000000000 - 取绝对值得到总100纳秒间隔数:
36288000000000 - 换算天数:1天对应
86400 * 10^7 = 864000000000个100纳秒间隔,总间隔数除以单日间隔数得到36288000000000 / 864000000000 = 42,正好匹配你配置的6周(6*7=42天)预期值。
你导出文件里的pKIExpirationPeriod值AEA5hy7h/v8=用同样逻辑计算,得到的结果是2年,符合常规证书模板的有效期配置。
修正后的代码
只需要修改filetime_to_dict函数的解析逻辑即可:
# Converts AD PKI period FILETIME offset to a dictionary. def filetime_to_dict(filetime): # 按小端、有符号64位读取负偏移量,取绝对值得到实际100纳秒间隔数 intervals = abs(int.from_bytes(filetime, byteorder='little', signed=True)) return { "unit": "days", "value": int(intervals // (10**7 * 60 * 60 * 24)) }
如果需要支持更多单位(周、年)的自动识别,可以在换算后对天数做二次转换,比如天数能被7整除且数值较大时显示为周,能被365整除时显示为年。
内容的提问来源于stack exchange,提问作者user1938742
相关产品推荐
相关产品推荐

