certutil:函数失败:SEC_ERROR_LEGACY_DATABASE:证书/密钥数据库采用旧的、不受支持的格式

问题描述 投票:0回答:5

我已经使用iceweasel(firefox)下载了经过验证(非自签名)的S/MIME证书,该证书存储在cert8.db中

然后我用:

certutil -L -d <path_to_folder_that_cert8.db_resides>

为了列出证书,然后我使用 certutil 给我的证书名称提取了 .p12 文件:

pk12util -o mycertfile.p12 -n "<name_found_from_certutil>" -d <path_to_folder_that_cert8.db_resides>

问题是我失去了对存储 p12 的 PC 的访问权限,现在我只有 cert8.db 副本到另一台 PC。因此,我重复了

certutil && pk12util
命令,但 certutil 失败并显示:

certutil: function failed: SEC_ERROR_LEGACY_DATABASE: The certificate/key database is in an old, unsupported format.

我拼命尝试了 3 台不同的计算机,其中一台具有相同的内核和

libnss3-tools
版本(就像我成功提取 p12 的初始桌面),即:

$ uname -a 
Linux commander 3.16.0-4-amd64 #1 SMP Debian 3.16.7-2 (2014-11-06) x86_64 GNU/Linux 

libnss3-tools
版本:2:3.17.2-1

有什么想法吗?

谢谢

certificate smime nss certificate-store certutil
5个回答
26
投票

多年来,数据库已从平面文件迁移到 Berkeley DB,再到现在 3.12 中的 SQLite。 在目录名称前加上

sql
前缀并用引号括起来以避开空格:

certutil -L -d sql:${HOME}/.pki/nssdb 

作为参考,这里是 Mozilla NSS 路线图


10
投票

错误消息非常神秘。我在使用

certutil -L
获取
cert8.db
文件中的证书列表时遇到类似的错误。

现在我找到了为什么该命令不起作用了。

–L
无法仅与文件夹中的
cert8.db
配合使用。它还依赖于另外两个文件,
key3.db and secmod.db
。 因此,在存在上述所有 3 个文件的文件夹中,
-L
仅适用于该文件夹。 这就是为什么
–d
参数采用文件夹路径。不是
cert8.db
文件。

我通过将

cert8.db
从 Firefox 配置文件文件夹复制到临时目录来尝试 certutil。

当 certuitl -A 成功但 -L 失败并且成功的 -A 命令在该临时文件夹中创建了另外两个文件时,我注意到了这一点。

还要检查目录路径是否有空格。如果有空格,它会给出相同的错误或“错误的文件格式错误 - 旧数据库格式”等。特别是在 Mac OS 中,该文件夹位于

"Application Support"
文件夹中,该文件夹名称中包含空格。所以它需要完全引用的路径:

"/Users/myuser/Library/Application Support/Firefox/Profiles/jii912uh.default"

或添加 \ 转义字符。

 /Users/myuser/Library/Application\ Support/Firefox/Profiles/jii912uh.default

9
投票

奇怪且令人困惑的是,如果您尝试在您无权访问的位置查询证书数据库并且您没有使用

sudo
,也会出现此错误。


1
投票

我需要恢复整个 .mozilla 目录才能成功运行 certutil。文件 cert8.db 需要位于原始目录中。


0
投票

我有同样的错误,基本上删除路径末尾的cert9.db,运行

certutil -A -n carootCert -t "TCu,Cu,Tu" -i /tmp/caCert.pem -d sql:/home/test/.pki/nssdb/

© www.soinside.com 2019 - 2024. All rights reserved.