XCA-中文文档

446 阅读36分钟

说明:该中文文档是将官方英文文档通过机器翻译+个人修改生成。如有不准确的地方欢迎指正。具体请以官方文档为准。

XCA - X 证书和密钥管理

抽象的

此应用程序旨在创建和管理 X.509 证书、证书请求、RSA、DSA 和 EC 私钥、智能卡和 CRL。CA 所需的一切都已实现。所有 CA 都可以递归地签署子 CA。这些证书链显示得很清楚。为了便于在公司范围内使用,有可用于证书或请求生成的可定制模板。所有加密数据都存储在 SQL 数据库中。支持 SQLite、MySQL (MariaDB)、PostgreSQL 和 MicrosoftSQL (ODBC) 数据库。

简介

此应用程序旨在用作证书和密钥存储以及作为签发证书的签名应用程序。

所有数据结构(密钥、证书签名请求、证书和模板)都可以以多种格式导入和导出,例如 DER 或 PEM。导入意味着从文件系统中读取一个文件并将数据结构存储到数据库文件中,而导出意味着将数据结构从数据库文件写入文件系统以导入其他应用程序。

第一次打开新数据库时,需要密码来加密数据库中的私钥。这是默认密码。每次打开此数据库时,应用程序都会要求输入密码。此输入对话框可能会被取消,并且数据库仍然可以成功打开。但是,每次使用密钥时,如果不提供正确的数据库密码,就无法访问密钥。

设置空密码时,XCA 在打开此数据库时将不再要求输入密码。这在使用测试证书或所有私钥都在安全令牌上时很有用。

数据库密码可以通过菜单项 其他工具 ->修改数据库密码 修改

  • 不同的加密部分分为 5 个选项卡:

    私钥、证书签名请求、证书、模板、吊销列表。

所有项目都可以通过右键单击项目可用的上下文菜单或使用右边框上的按钮来操作。每个项目都由一个内部名称标识,只要用户没有对这些列重新排序,该名称总是显示在第一列中。

文件格式

有几种默认文件格式可以与其他应用程序交换加密数据。

DER 可:分辨编码规则

​ 是数据的二进制 ASN.1 编码。

PEM :隐私增强邮件

​ 是 DER 格式数据的 base64 编码版本,带有额外的页眉和页脚行,可通过电子邮件等方式传输。

PKCS#X :公钥加密标准

​ 由www.rsa.com发布

版权

版权所有 (C) 2001 - 2021 Christian Hohnstaedt。

​ 版权所有。 ​ 如果满足以下条件,则允许以源代码和二进制形式重新分发和使用,无论是否经过修改:

  • 源代码的再分发必须保留上述版权声明、此条件列表和以下免责声明。
  • 二进制形式的再分发必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表和以下免责声明。
  • 未经事先书面许可,不得使用作者的姓名或其贡献者的姓名来认可或推广源自本软件的产品。

本软件由版权所有者和贡献者“按原样”提供,并且不提供任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、惩戒性或后果性损害(包括但不限于采购替代商品或服务;使用、数据或利润损失;或业务中断),无论是由何种责任理论引起的,无论是在合同、严格责任或侵权行为(包括疏忽或其他方式)中以任何方式使用本软件引起的,即使已被告知存在此类损害的可能性。

该程序链接到具有不同许可证的软件:

其他

更新

通常 XCA 知道以前版本中使用的数据库格式,并且在第一次打开时会根据需要自动升级数据库。

从早于 2.0.0 的版本更新

旧版本的 XCA 使用简单的串行专有数据库来存储加密项目。从版本 2.0.0 开始,这已更改为 SQL。

对于基于文件的数据库,使用 SQLite 数据库格式。由于 XCA 使用 SQL,它也可以连接到网络数据库。数据库mySQL PostgreSQLMicrosoft SqlServer已经过测试。请使用打开远程数据库菜单项连接到远程主机。

导致切换到 SQL 的旧格式的主要缺点是外部工具无法访问。多年来,用户要求对数据库进行命令行访问。

可以通过sqlite3或 sqlitebrowser等外部工具查询新数据库,以提取验证或修改内容。请参阅提取项目

笔记:

打开旧数据库时,备份原数据库后会转换为新格式。

危险:

请小心使用旧 XCA 版本。1.4.0 之前的 XCA 将在数据库打开期间覆盖新的 SQLite 数据库。

下载

XCA 的最新稳定版本可以从 hohnstaedt.de/xca/index.p… 下载。

当前(不稳定)的开发 HEAD 可以从 github.com/chris2511/x… 下载。

请不要犹豫与我联系以获取有关分支机构的信息。

DH 参数

XCA 可以创建 Diffie Hellman 参数。它既不需要也不使用参数。然而,像 OpenVPN 这样的应用程序需要它们,因此 XCA 提供了此功能以方便用户。

XCA 的熵源

熵是密钥生成的一个非常重要的主体。OpenSSL 带有一个很好的伪随机数生成器。XCA 非常彻底地播种它。

  1. 在启动期间
    • OpenSSL 播种机制RAND_poll()。它尽可能使用*/dev/urandom* 和 Windows 上的屏幕内容。
    • XCA 还尝试从*/dev/random*和 /dev/hwrng每个中提取最多 256 位。
    • XCA 应用程序目录中的*.rnd*状态文件在启动时被读取,然后被擦除以避免重播。
  2. 在任何密钥或参数生成之前,都会完成“重新播种”。有人说不需要重新播种,但都说没有害处。
    • XCA 通过鼠标和键盘事件及其时间来收集熵。 XcaApplication.cpp: bool XcaApplication::eventFilter() 毕竟 我们是在桌面主机上。
    • 256 位来自*/dev/urandom* (unix/Mac)
  3. 每当 XCA 完成时,都会写入 XCA 应用程序目录中的*.rnd*状态文件。
  4. 在管理令牌或在支持C_GenerateRandom和C_SeedRandom的令牌上生成密钥时 ,XCA 将:
    • 用自己的随机数据播种令牌。
    • 通过令牌中的随机字节播种 OpenSSL CSPRNG。

命令行

XCA 可以在没有 GUI 的情况下用于分析 PKI 项目并生成 CRL 和密钥。在这种情况下,不需要 X-Server 连接 (Linux)

参数

  • --crlgen=ca-identifier

    为 生成 CRL。使用“名称”选项设置新 CRL 的内部名称。[1]

  • --database=database

    SQLite 数据库或远程数据库描述符的文件名 (*.xdb):[user@host/TYPE:dbname#prefix]。

  • --exit

    导入项目后退出。

  • --help

    打印此帮助并退出。

  • --hierarchy=directory

    将 OpenSSL 索引层次结构保存在 <dir>中。[2]

  • --index=file

    将 OpenSSL 索引保存在 <file> 中。[3]

  • --import

    将所有提供的项目导入数据库。[4]

  • --issuers

    打印所有具有关联私钥且 CA 基本约束设置为“真”的已知颁发者证书。[5]

  • --keygen=type

    生成一个新密钥并将其导入数据库。使用“名称”选项设置新密钥的内部名称。<type> 参数的格式为:'[RSA|DSA|EC]:[<size>|<curve>]。[6]

  • --list-curves

    打印所有已知的椭圆曲线。

  • --name=internal-name

    提供新生成的项目的名称。如果省略,将生成一个自动名称。[7]

  • --no-gui

    不要启动 GUI。或者设置环境变量 XCA_NO_GUI=1 或调用 xca 作为 'xca-console' 符号链接。

  • --password=password

    用于解锁数据库的数据库密码。

  • --pem

    打印所提供文件的 PEM 表示。仅打印私钥的公共部分。

  • --print

    打印所提供文件的概要。

  • --sqlpass=password

    访问远程 SQL 服务器的密码。

  • --text

    像 OpenSSL 一样打印提供的文件的内容。

  • --verbose

    在 stderr 上打印调试日志。或者设置环境变量 XCA_DEBUG=1。

  • --version

    打印版本信息并退出。

( 1 , 2 , 3 , 4 , 5 , 6 , 7 )需要数据库。从命令行或作为默认数据库。

密码参数

密码选项接受与 openssl 相同的语法:

  • 环境:变量

    从环境变量 var 中获取密码。由于其他进程的环境在某些平台上是可见的(例如某些 Unix 操作系统下的 ps),因此应谨慎使用此选项。

  • fd:号码

    从文件描述符编号中读取密码。例如,这可用于通过管道发送数据。

  • 文件:路径名

    路径名的第一行是密码。如果将相同的路径名参数提供给密码和 sqlpassword 参数,则第一行将用于两个密码。路径名不必引用常规文件:例如,它可以引用设备或命名管道。

  • 通行证:密码

    实际密码是密码。由于密码对实用程序可见(如 Unix 下的 'ps'),因此这种形式只应在安全性不重要的情况下使用。

  • 标准输入

    从标准输入读取密码。

常用动作

许多操作对所有加密部分都是通用的,这里只提到一次。此应用程序的目标是为所有选定的 PKI 项目(如请求或证书)提供一个易于使用的签名工具以及一个通用位置。

列处理

可以通过表头的上下文菜单或表上下文菜单的“列”子菜单更改列的可见性。它显示所有可用的列,并带有复选框以显示或隐藏它们。

  • 列操作
    • 重置 将列顺序和可见性重置为默认值。
    • 隐藏列 隐藏当前列。仅显示在列标题的上下文菜单中。
  • 常用列
    • 内部名称 数据库中项目的名称。
    • No. 一个简单的计数器,可以轻松计算项目。
    • 主键 唯一编号,用于标识数据库中的项目。请参阅数据库主键
    • 日期 在此 XCA 数据库中出现的日期。请参阅日期和来源
    • 来源 此项目的来源,见日期和来源
    • 备注 多行自由文本输入,请参阅备注
  • 证书和请求列
    • 主体 完整的主体名称。
    • 主体哈希 OpenSSL 用于查找证书的主体哈希。见 www.openssl.org/docs/man1.0…
    • 主体条目 显示主体的单个条目。该列表表示对象 ID文件的内容。
    • X509v3 Extensions 显示所选扩展的文本表示。
    • 密钥名称 私钥选项卡中密钥的内部名称。
    • 签名算法 用于签署证书或请求的签名算法。
  • 请求列
    • 已签名 请求是否已签名。
    • 非结构化名称 CSR 特定属性。
    • 质询密码 CSR 特定属性。
    • 证书数量 数据库中具有相同公钥的证书数量。
  • 证书栏目
    • CA CA 基本约束标志
    • 序列号
    • MD5/SHA1/SHA256指纹 证书指纹

列可以调整大小和重新排列。此配置存储在数据库中,并将在下次打开此数据库时重新分配。

导入项目

可以通过单击右侧的导入按钮或通过右键单击列表中可用的上下文菜单来完成项目的导入。导入功能足够智能,可以探测所有已知格式,与文件扩展名无关:

  • 秘钥

    PEM 私钥、PEM 公钥、DER 私钥、DER 公钥、PKCS#8 私钥、SSH 公钥。

  • 请求

    DER 请求,PEM 请求

  • 证书

    DER 证书、PEM 证书(PKCS#12 和 PKCS#7 证书必须使用额外的按钮导入,因为它们可能包含多个证书和密钥)

选择文件名后,XCA 将探测该项目的已知格式,并在出现错误时提示最后一条OpenSSL 错误消息。可以通过单击 SHIFT 来选择多个文件。

导入菜单也可用于加载项目。除了上面的文件类型,它还支持PEM导入。PEM 描述的是编码而不是文件类型。因此,PEM 文件可以是任何类型的私钥、CRL 证书或 CSR。这个导入工具会发现类型并加载它。

导入多个密钥、CRL、证书或请求时,所有项目都显示在多重导入对话框中。导入 PKCS#7 或 PKCS#12 项目时,包含的密钥和证书显示在“多重导入”对话框中。通过使用多重导入对话框,可以检查、导入或删除项目。

读取该项目后,它会在数据库中搜索该项目,如果它是唯一的,则将该项目存储在数据库中。否则,它会显示一条消息,其中包含该项目在数据库中的内部名称。

项目的详细信息

可以通过双击项目、上下文菜单或右侧的按钮访问详细信息对话框。颁发者证书的名称和相应的密钥是可点击的,其内容将在“双击”时显示

重命名项目

通过右键单击项目,可以通过上下文菜单重命名项目,方法是按 <F2> 或通过右边框上的 重命名 按钮。

删除项目

可以通过右侧的按钮或上下文菜单删除项目。证书签名请求可以在签名后删除,因为不再需要它们。通过将证书转换为请求,可以从生成的证书中恢复请求。但是,这只有在您拥有证书的私钥时才有可能。可以选择多个项目以一次全部删除。

搜索项目

显示的项目列表可以通过右下角的搜索输入来减少。它影响所有选项卡。它不仅在显示的列内搜索,而且搜索项目的全部内容。它搜索内部名称、颁发者、主体、扩展、PKCS#10 属性和令牌提供者。

内部名称

内部名称仅在数据库内部使用,旨在唯一标识项目。在早期版本的 XCA 中,此名称必须是唯一的。这不再是要求。

日期和来源

XCA跟踪任何新出现的项目的时间和来源。在项目的上下文菜单中选择属性时,或通过启用“来源”或“日期”列,都可以看到这两种情况。

来源可能是以下之一

  • 导入: 从文件或通过粘贴 PEM 数据

  • 生成:

    ​ 由 XCA 创建

  • 转换:

    ​ 通过“转换”上下文菜单从其他项目转换

  • 令牌:

    ​ 该设备最初是从硬件令牌中读取的

  • 旧版数据库

    ​ 该项目已存在于未跟踪来源信息的旧 XCA 数据库中。

日期和来源字段的内容永远不会成为导出项目的一部分。

备注

XCA 允许为所有项目插入多行备注。它们可以通过属性对话框进行编辑。显示评论 栏时,会显示评论栏的第一行。

XCA 本身使用证书的备注字段,并要求在重要操作时留下备注:

  • 在证书或请求生成期间应用模板
  • 在证书或请求生成期间生成的密钥
  • 签署请求时签发 CA 的签署日期、时间和内部名称。
  • 从文件导入项目时的文件名。

备注字段的内容永远不会是导出项目的一部分。

数据库主键

将项目插入数据库时,将生成一个新的唯一 ID,并将其用作数据库中的主键。如果要通过外部工具在数据库中找到该项目,则可以使用*items.id来唯一标识该项目。*不能使用内部名称,因为它不再一定是唯一的。

此 ID 永远不会在数据库之外使用。

项目属性

可以显示和编辑所有项目的通用属性:

证书输入对话框

此输入对话框是收集有关证书、请求和模板的所有数据的中心部分。每当要创建这样的项目或更改模板时,都会调用它。

来源

创建或更改模板时不会显示此页面。

签名请求

如果希望从本地 CA 的 PKCS#10 请求中注册证书,或者通过自签名从请求中创建证书,可以在此处选择请求。在后一种情况下,请求的私钥必须可用。

签名

此处可以选择自签名或用于签名的 CA 证书。此外,可以调整所需的签名算法。下拉列表包含所有具有可用私钥的CA 证书。

签名算法

通常应使用 SHA256 或更高版本,但由于包括 XP 在内的旧 Windows 版本无法处理它们,您可以选择使用 SHA1。可以通过选项菜单选择默认签名算法。

模板

可以通过选择模板并单击全部应用来根据模板的值预设证书的字段。可以通过应用一个模板的主体,然后使用按钮应用主体应用扩展来应用另一个模板的扩展来混合模板

个人设置

主体

在本页上,所有个人数据,如国家、姓名和电子邮件地址都可以填写。“国家/地区代码”字段必须为空,或者正好包含两个代表国家/地区代码的字母;例如,德国的DE。如果要创建SSL服务器证书,通用名称必须包含服务器的DNS名称。主体替代名称扩展名必须用于定义其他DNS名称,甚至通配符。在这种情况下,必须在此处重复通用名称,因为TLS客户端在存在主体替代名称扩展名的情况下忽略通用名称。如果内部名称为空,则通用名称将用作内部名称。如果在此处创建了新密钥,它也将用作默认内部名称。

可以在下面的对话框中选择其他很少使用的名称条目。通过使用此表而不是上面的显式条目,可以调整条目的顺序。可以通过添加按钮添加新行。可以通过删除按钮删除当前行。可以通过移动行标题(包含行号)来交换和重新排序现有行。所有项目都可以多次添加,即使是上面的项目。这不是很常见,但允许。

7 个显式可分辨名称条目的列表可以在选项的选项对话框中进行调整

私钥

可以通过按下“生成新密钥”按钮在此处“即时”生成密钥。新密钥的名称将由证书的通用名称预设。新生成的密钥将存储在数据库中并保留在那里,即使输入对话框被取消。密钥的下拉列表仅包含任何其他证书或请求未使用的密钥。密钥列表不可用于创建或更改模板。通过选中“包含已使用的密钥“,列表包含所有可用的密钥。小心使用这个。使用此选项时,您可能做错了什么。

签署请求时不会出现此选项卡,因为请求包含此选项卡中所有需要的数据。如果您仍然想修改它,请选择“修改请求的主体”。然后主体选项卡的内容将与请求的内容一起预设。

X509v3 扩展

接下来的三个选项卡包含用于调整证书扩展的所有字段。详细解释它们不是本文档的重点。最重要的是基本约束有效性范围。

更多细节可以在 RFC5280中找到。

基本约束

如果类型设置为CA,则证书被 XCA 和其他实例识别为其他证书的颁发者。服务器证书或电子邮件证书应将此扩展设置为 最终实体(强烈推荐)或通过将其设置为未定义*来完全禁用它

有效范围

不早于字段设置为操作系统的当前日期和时间, 不晚于字段设置为当前日期和时间加上指定的时间范围。应用时间范围时,通过采用当前配置的开始日期(不早于)并添加时间范围来计算到期日期(不晚于)。

对于模板,不保存指定的时间,因为它没有多大意义。而是在选择此模板时存储并自动应用时间范围。应用时间范围意味着将 不早于 设置为“现在”,将 不晚于设置为“现在 + 时间跨度”。如果设置了UTC午夜时间按钮,则两个日期都将向下舍入到午夜。

高级

任何未包含在其他选项卡中的扩展都可以按照 OpenSSL nconf 中的定义添加到此处。可以通过单击 Validate来检查有效性。所有选项卡中的所有扩展都将显示在此处,以便以最终形式查看它们。单击编辑以继续在此处编辑扩展名。

有关详细信息,请参阅 OpenSSL X509v3 配置:

www.openssl.org/docs/manmas…

证书策略

以下openssl.txt示例也适用于高级选项卡以定义证书策略

certificatePolicies=ia5org,1.2.3.4,1.5.6.7.8,@polsect

[polsect]

policyIdentifier = 1.3.5.8
CPS.1="http://my.host.name/"
CPS.2="http://my.your.name/"
userNotice.1=@notice

[notice]

explicitText="Explicit Text Here"
organization="Organisation Name"
noticeNumbers=1,2,3,4

在这里也可以添加多个 AuthorityInfoAccess 条目:

authorityInfoAccess=@aia_sect

[aia_sect]

OCSP;URI.1=http://www.some.responder.org/
OCSP;URI.2=http://www.some.other-responder.org/
caIssuers;URI.3=http://server.whatever.org/cert-path
caIssuers;URI.4=ldap://server.whatever.org/xxx,yyy

将现有证书导出到模板时,扩展将被转换为 OpenSSL 配置文件格式。

智能卡

自 XCA 0.8.0 起,支持使用智能卡(安全令牌)。它基于 PKCS#11 标准。选项对话框包含添加一个或多个 PKCS#11 提供程序(库)的列表。这不仅限于智能卡,还包括所有类型的安全令牌,如 USB 令牌。

直到 1.0.0 版,仅支持安全令牌上的 RSA 密钥。从 1.1.0 版开始,XCA 还支持安全令牌上的 EC 和 DSA 私钥。

再说一次:这个软件根本没有保修!如果 XCA 将您的安全令牌变成了冰箱,请不要怪我。对我来说一切都很好,我对它进行了彻底的测试。

在 Linux 上,应该安装软件包opensc 。请阅读 opensc 文档以获取更多详细信息。通常:如果 opensc 命令行工具pkcs11-tool -L 显示合理的输出,则 XCA 将起作用。否则修复 opensc 设置。

我有一个带有“Reiner SCT”的功能设置和一个带有集成读卡器和 TCOS Netkey E4 卡的 DELL 键盘。

我也非常成功地使用了 Aladdin Etoken(感谢支持!)。Aladdin PKCS#11 库很好地支持所有需要的功能。

ECC 令牌支持使用www.cardcontact.de ECC 令牌进行了测试。OpenDNSSEC SoftHSMv2 被用作 PKCS#11 参考实现来测试所有令牌算法以及证书和密钥下载到令牌的功能。

在使用令牌的密钥之前,必须将它们导入 XCA。这意味着 XCA 读取令牌并显示令牌上的密钥和证书。然后可以通过 XCA 使用的 Multi-import 对话框部分或完全导入它们。令牌包含多个密钥或证书并不罕见。当然可以在令牌上创建自己的密钥。选择用于签名的令牌密钥时,XCA 会验证相应的令牌是否可用。

如果读卡器支持内置键盘的安全 PIN 输入,XCA 将使用它,它不会询问 PIN,而是等待 Pin-pad 输入。

支持以下智能卡操作:

  • 从令牌中导入密钥和证书。(令牌->管理安全令牌)
  • 您可以使用其他密钥执行的所有操作也可以使用令牌完成。
  • 导出时,仅导出公钥。
  • 更改令牌的 PIN 和 SO PIN。
  • 在令牌上创建一个密钥。(按钮新键)
  • 在令牌上存储现有密钥或证书。(项目的上下文菜单)
  • 从令牌中删除证书和密钥。(项目的上下文菜单)
  • 通过 SO PIN 初始化卡和用户 PIN

可以忽略现有的、不可删除的、内置的智能卡证书。可以通过智能卡密钥创建和自签名新的 CA 证书。然后它可用于颁发包含其他 RSA、DSA 或 EC 密钥的最终实体证书,签署导入的证书请求或生成 CRL。

Token密钥管理

XCA 为卡上的每个私钥假定一个对应的公钥。管理卡时,XCA 只搜索公钥。因此无需输入 PIN。当使用密钥签署卡上的相应私钥时,必须输入 PIN。

因此,每次在卡上生成密钥时,都会生成公钥/私钥对。每次将密钥存储在卡上时,XCA 都会创建一个公钥和一个私钥对象。

Firefox 总是只在卡上寻找私钥。如果 XCA 未显示密钥,但 Firefox 可以识别该密钥,则原因是缺少公钥对象。

令牌菜单

菜单项:如果 PKCS#11 库已加载并初始化,则可以访问令牌。

管理智能卡

安全令牌具体操作收集在菜单项Token下面

管理安全令牌

这是多导入对话框,允许查看和选择要导入的项目。启动时,它会读取所选令牌的内容。此外,它在右下角显示令牌信息,并允许直接在令牌上删除和重命名项目。

初始化令牌

初始化令牌是通过菜单项Initialize token完成的。在此过程中,必须提供新的 SO PIN 或必须提供旧的 SO PIN。此外,XCA 要求提供此令牌的标签。

此操作成功后,User PIN 未初始化,必须通过Init PIN初始化

从令牌中删除项目

像往常一样删除该项目。然后 XCA 将询问该项目是否也应从令牌中删除。令牌上尚未导入的项目可以通过“管理安全令牌”菜单删除。

更改 PIN

用户 PIN 和 SO PIN 可以通过令牌菜单和键上下文菜单进行更改。在这种情况下,将强制执行包含密钥的正确令牌。

测试提供者

以下提供程序用于测试:

  1. OpenSC:许多不同卡和读卡器的默认提供程序。当前不支持删除密钥或证书。
    • 目前对 Netkey 4E 卡的支持受到限制。只能导入和使用密钥和证书。
    • 飞天 PKI 卡有以下限制:
      • 卡必须在 XCA 外部使用pkcs15-init 初始化
      • 由于opensc-0.11.13 中 card-entersafe.c 中的*assert(0)*导致将密钥存储到卡上崩溃
      • 删除项目不起作用,因为在 opensc-0.11.13/card-entersafe.c 中没有实现。
  2. 阿拉丁 eToken PKIclient-5.1:完美运行。从令牌中读取公钥,将私钥写入令牌,在令牌上生成密钥,将证书写入令牌并将其从令牌中删除。
    • 仅限 Linux:OpenCryptoki (IBM):可用作纯软件令牌,但也支持 TPM 和其他 IBM 加密处理器
    • www.cardcontact.de OpenSC 分支支持 RSA 和 EC 密钥。不支持将密钥下载到令牌。
    • OpenDNSSEC SoftHSMv2 支持软件中的所有机制。测试 PKCS#11 库接口的一个很好的参考。

测试与其他应用程序的兼容性

对于互操作性测试,我将 Aladdin eToken 与 Aladdin PKIclient 5.1 软件和 OpenSC 与飞天 PKI 卡一起使用。

  • 阿拉丁:/usr/lib/libeTPkcs11.so
  • 飞天:/usr/lib/opensc-pkcs11.so(默认)

我初始化令牌如下:

  • 使用软件密钥生成 CA 证书
  • 使用软件密钥生成服务器证书
  • 使用在令牌上生成的密钥生成客户端证书
  • 使用软件密钥生成第二个客户端证书
  • 将第二个客户端证书的软件密钥复制到令牌上
  • 将 2 个客户端证书复制到令牌上
  • 将 CA 证书导出为 PEM (ca.crt)
  • 将服务器证书导出为没有密码的 PKCS12 (server.p12)
  • 将服务器证书导出为“PEM Cert + key”,无需密码 (server.pem) 用于 Apache2

Firefox / Mozilla -> Apache

  • 在 Firefox 中启用 PKCS#11 令牌:

    • 编辑->首选项->高级:( 安全设备):(加载)加载 PKCS#11 设备:/usr/lib/libeTPkcs11.so
    • 导入 CA 证书:编辑->首选项->高级:( 查看证书)(权限):(导入)
  • 准备 apache 配置:

    SSLEngine on
    SSLCertificateFile      /etc/apache2/ssl/server.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/server.pem
    SSLCertificateChainFile /etc/apache2/ssl/ca.crt
    SSLCACertificateFile    /etc/apache2/ssl/ca.crt
    SSLVerifyClient         require
    SSLVerifyDepth          10
    
  • 使用 Firefox 连接到服务器。Firefox 将提示您选择 2 个客户端证书之一。两者都有效。

VPN

相关服务器配置如下:

pkcs12 server.p12

客户端配置为:

ca ca.crt
pkcs11-providers /usr/lib/libeTPkcs11.so
pkcs11-id 'Aladdin\x20Knowledge\x20Systems\x20Ltd\x2E/eToken/002882d2/F\xC3\xBCr\x20den\x20Firefox/D1A7BFF94B86C061'

pkcs11-id 可以通过以下命令获取:

$ openvpn --show-pkcs11-ids /usr/lib/libeTPkcs11.so

RSA、DSA 和 EC 密钥

要创建证书,需要密钥。所有密钥都使用 PKCS#8 AES 算法加密存储在数据库中。可以更改每个密钥的密码。

密码类型意味着:

  • 常见的:

    在数据库加载期间提供的数据库密码。

  • 私人的:

    密钥使用单独的密码进行加密,XCA 不存储该密码。这可以通过键的上下文菜单进行设置和重置。

  • PIN:

    安全令牌通常受 PIN 保护。

  • 无密码:

    公钥不需要密码。

所有密钥都带有一个使用计数器,该计数器计算它在请求或证书中的使用次数。创建新请求或证书时,可用密钥列表减少为使用计数器为 0 的密钥。这可以被密钥列表旁边的复选框覆盖。密钥不应该多次使用。

当导入带有显式曲线参数的 EC 密钥时,会搜索并设置相应的曲线 OID(如果找到)。

  • 私钥列
    • 类型 RSADSAEC、ED25519 中的一种
    • 大小 密钥大小(以位为单位)。
    • EC 组 EC键的曲线名称。。
    • 使用 使用此密钥的数据库中的证书和请求数。对于新证书和请求,仅应使用未使用或新生成的密钥。
    • 密钥的密码 保护。请参阅RSA、DSA 和 EC 密钥

生成密钥

该对话框询问密钥的内部名称和密钥长度(以位为单位)。对于 EC 密钥,将显示曲线列表。它包含所有 X9.62 曲线和许多其他曲线。对于 ED25519 密钥,不需要更多信息。

即使密钥长度下拉列表仅显示最常用的密钥长度,也可以通过编辑此框在此处设置任何其他大小。在搜索随机素数时,基本应用程序底部会显示一个进度条。密钥生成完成后,密钥将存储在数据库中。

在选中“设置为默认框”时,将记住设置(密钥类型,密钥长度或EC曲线),并预设下一个密钥生成对话框。在 'ref' token上生成密钥时,此选项不可用。

对于每个提供密钥生成工具的连接令牌,将在密钥类型的下拉菜单中显示一个条目。它包含令牌的名称和有效的密钥长度。

在令牌上生成 EC 密钥的情况下,可能的曲线列表根据令牌提供的信息(密钥长度和 FP/F2M)受到限制。令牌可能支持更少的 ECParameters / OID。选择不支持的 EC 曲线时会出现错误。请查阅 PKCS#11 库提供者的文档。

密钥导出

可以通过选择键并按 Export 或使用上下文菜单来导出键。可以选择将密钥以 PEM 公开、SSH2 公开或未加密的 PEM 私有格式导出到剪贴板。如果是文件导出,则会打开一个对话框,在文件名旁边可以选择以下格式之一:

  • PEM public: PEM格式的密钥的公共部分
  • DER public: DER 格式的密钥的公共部分
  • SSH2 public: SSH2格式密钥的公共部分
  • PEM private: PEM格式的私钥解密
  • PKCS#8 encrypted: PKCS#8 格式的加密私钥
  • **DER private:**二进制DER格式的私钥
  • PEM 加密: PEM 格式的私钥,带有用于加密的 OpenSSL 特定扩展
  • PKCS#8 unencrypted: PKCS#8 格式未加密的私钥
  • SSH2 private: SSH2格式未加密的私钥

文件名是内部名称加上pemderpk8pubpriv 后缀。更改文件格式时,文件名的后缀会相应更改。只有 PKCS#8 或 PEM 文件可以加密,因为 DER 格式(尽管可以加密)不支持提供加密算法的方式,例如DES。当然,如果不导出私有部分,加密就没有意义。

通过 SQL 从数据库中导出密钥时,请参阅提取项目 openssl 要求输入密码,如果密码类型为private ,则该密码是数据库密码或它自己的密码。

证书签名请求

PKCS#10 标准中描述了证书签名请求。它们用于在不知道私钥的情况下向证书颁发机构提供颁发有效证书所需的信息。这包括个人信息、公钥和其他扩展。

在您的 CA 签名之前或在自签名之前生成请求是不必要的。只需直接开始生成证书。使用 OpenSSL 命令行工具的人习惯于使用“openssl req -new ...”生成请求,然后对其进行签名。对于 XCA,这不是必需的。

使用 XCA 跟踪签名的 CSR 可以通过证书签名请求选项卡的签名证书计数列来完成。签名列是每当使用 CSR 颁发证书时存储在数据库中的信息。在这种情况下,CSR 的备注中也会留下一条自动备注。它不依赖于 XCA 数据库中剩余的证书。另一方面,证书计数列显示数据库中具有相同公钥的当前可用证书的数量*。*

生成新请求

单击“*创建请求”*按钮后,将启动“证书”对话框,询问生成新请求所需的所有信息。请参阅:证书输入对话框

请求生成也可以通过证书转换->请求的上下文菜单调用。仅当证书的私钥可用时,此菜单点才可用。

在这种情况下,从证书中复制所有需要的数据,并且不会调用证书对话框。

请求导出

可以通过上下文菜单或右侧的按钮导出请求。

  • 剪贴板以 PEM 格式将所有选定的请求写入剪贴板。
  • 文件将请求写入 PEM 或 DER 格式的文件中。
  • OpenSSL 配置创建并存储一个 OpenSSL 配置文件,该文件可用于通过 openssl openssl req -new -config <file>生成类似的请求

请求转换

请求转换根据所选请求创建新的数据库条目

  • 模板使用请求的值创建一个 XCA 模板。
  • 公钥从请求中提取公钥并将其存储在“私钥”选项卡中。
  • 类似请求使用当前请求中的所有值启动证书输入对话框预设,以创建新请求。

请求详情

显示请求中包含的所有信息。如果密钥库包含与请求对应的私钥,则密钥内部名称显示在Key字段中,可以单击以显示它。

证书

数据库中的所有证书都显示在反映链依赖关系的树视图中。如果有一个 CA 证书和多个由该 CA 签名的客户端证书,则可以通过单击 CA 证书的加号来显示客户端证书。

CA 证书

如果基本约束中的 CA 标志 设置为 true,XCA 将识别 CA 证书。如果有对应的私钥,则上下文菜单中的CA 子菜单将被启用。

为了构建链,CA 标志被忽略,因为有些 CA 没有这个标志。相反,它会考虑颁发者名称和签名来决定哪个证书是颁发者。

如果存在多个具有相同主体和私钥的 CA 证书,则无法确定在签名过程中选择了哪一个。这不是问题。如果更新 CA 证书,通常会发生这种情况。在这种情况下,XCA 选择具有较晚到期日期的证书作为已颁发证书的锚。

CA 属性

可以为每个 CA 配置一个默认模板,该模板将在创建新证书时自动应用。CRL 天数定义了在发布新 CRL 时到下一个 CRL 版本的预设到期时间。

生成证书

单击创建证书按钮后,将启动证书输入对话框,询问生成新证书所需的所有信息。请参阅:证书输入对话框。证书创建也可以通过证书列表背景的上下文菜单或请求的上下文菜单调用。在这种情况下,证书输入对话框预设有要签名的请求。

如果在证书列表中选择了一个CA 证书,该证书将被预选为颁发证书。

证书详情

签名者是颁发者证书的内部名称, 如果它是自签名的,则为SELF SIGNED ,如果颁发者的证书不可用,则为 SIGNER UNKNOWN 。与操作系统的内部时间和日期相比,如果证书的日期有效,则将其有效性设置为有效,否则将其设置为无效。

如果证书被吊销,则将显示吊销日期。

主体颁发者选项卡上,专有名称也以 RFC2253 中定义的格式显示,用于复制和粘贴。

证书导出

  • **剪贴板:**将所有选定的证书作为 PEM 文件复制到剪贴板
  • **文件:**导出到外部文件。可以在导出对话框和导出格式中选择文件名:
    • PEM: PEM编码
    • 带有证书链的 PEM: PEM 编码证书和所有颁发者直至根证书都在一个文件中
    • **PEM 所有受信任的证书:**在一个文件中标记为始终受信任的所有 PEM 编码证书 (通常是所有自签名证书)的列表,例如 apache 作为受信任的证书存储。
    • **PEM 所有证书:**一个文件中的所有 PEM 编码证书。
    • DER: DER 编码证书。
    • PKCS#7: DER 编码的包含证书的 PKCS#7 结构。
    • 带有证书链的 PKCS#7: DER 编码的 PKCS#7 结构,包含证书和直到根证书的所有颁发者。
    • PKCS#7 所有受信任的证书: DER 编码的 PKCS#7 结构,包含标记为始终受信任的所有证书
    • PKCS#7 所有证书: DER 编码的 PKCS#7 结构包含所有证书。
    • **PKCS#12:**包含证书和相应私钥的 PKCS#12 结构
    • PKCS#12: PKCS#12 结构,包含证书、相应的私钥和所有颁发者证书的链。
    • **PEM 证书 + 密钥:**以 apache 或 OpenSSH 的 X509 补丁使用的格式连接私钥和证书。
    • PEM 证书 + PKCS8 密钥: PKCS#8 格式的私钥和证书的串联。
  • **令牌:**将证书存储在包含私钥的安全令牌上。
  • **其他令牌:**将证书存储在任何安全令牌上。
  • **OpenSSL config:**根据该证书的内容创建一个 OpenSSL 配置文件,该文件可用于生成与 openssl 类似的证书:openssl req -new -x509 -config <file>

导出 PKCS#12 结构时,XCA 稍后会要求输入加密密码。

证书转换

证书转换会根据所选证书创建一个新的数据库条目。

  • **公钥:**从证书中提取公钥并将其存储在“私钥”选项卡中。
  • **请求:**使用证书中的数据创建 PKCS#10 请求。证书的私钥必须可用于此选项。
  • **类似证书:**使用当前证书中的所有值启动证书输入对话框预设以创建新证书。
  • **模板:**使用请求的值创建一个 XCA 模板。

证书吊销

只有在颁发者证书的私钥可用的情况下,才能撤销证书。证书将被标记为已吊销,吊销日期和原因将与 CA 证书一起存储。

如果选择了多张同一颁发者的未吊销证书,它们将被一次性吊销,吊销日期和理由相同。上下文菜单通过在方括号中添加所选证书的数量来显示这一点。

要生成 CRL,请撤销相应的证书并在签名证书的上下文菜单中选择 CA->生成CRL

证书更新

仅当发行者证书的私钥可用时,才能更新证书。更新是通过创建一个新证书作为原始证书的副本并调整有效期来完成的。

使用吊销旧证书复选框自动吊销旧证书。

如果选择了同一发行者的多于一张证书,它们将一次更新,有效期相同。上下文菜单通过在方括号中添加所选证书的数量来显示这一点。

CA 特殊功能

CA 证书的上下文菜单包含CA子菜单,它提供以下功能:

  • 特性:
    • **CRL 天数:**距下一次 CRL 发布的天数。
    • **签名模板:**颁发证书的默认模板。
  • **生成 CRL:**通过收集所有已吊销的证书及其吊销日期来生成 CRL。
  • **管理吊销:**显示所有吊销并允许对其进行操作。不存在的证书可以通过添加证书的序列号来撤销。不再需要在数据库中保留已撤销的证书,因为撤销信息与 CA 证书一起存储。

模板

模板是 XCA 特有的,不能与其他应用程序互换。它们存储所有信息以创建证书或请求。

要使用模板,只需创建一个新证书或请求并在“来源”选项卡中应用模板之一(或其中的一部分) 。通常,您具有可分辨的名称部分,这些部分永远不会更改,并且具有定义证书使用的属性(扩展名)。您可以应用整个模板或仅应用主体或仅应用扩展。

在 CA、TLS 服务器和客户端证书的 3 个默认模板旁边,可以创建自定义模板。模板没有签名,它们只是不同证书的公共值的集合。因此,XCA 不关心模板列表中是否存在任何重复项。

创建模板的一种简单方法是将现有证书或 PKCS#10 请求导出到模板。只需 在项目的上下文菜单中选择转换->模板。此操作不需要证书或请求的私钥。

证书吊销列表

所有证书均在有限的时间内颁发。但是,在达到证书中的不晚于时间之前,可能会出现不应该使用证书或证书失效的情况。在这种情况下,颁发 CA 应通过将其放在已撤销证书列表中、签署该列表并发布它来撤销此证书。

生成 CRL

在 XCA 中,这可以通过 CA 的上下文菜单和已颁发证书的上下文菜单中的*撤销条目来完成。*首先必须将所有无效证书标记为已撤销,然后应创建证书撤销列表并将其存储在数据库中。

有效时间定义了 CRL 的开始和到期日期。可以在CA 属性对话框中配置默认间隔。

选项部分允许选择是否应将颁发 CA 的主体备用名称和授权密钥标识符放入 CRL。CRL 编号 ( tools.ietf.org/html/rfc528… ) 将由 XCA 跟踪并在每次使用时更新。

还有一个命令行选项可以发出 CRL:

xca --crlgen="My Ca" --pem --print

管理撤销

撤销的证书可以在数据库中没有撤销的证书的情况下进行管理。撤销存储在每个 CA 的数据库中,带有撤销日期、撤销原因和失效日期。当导入此 CA 的 CRL 或手动撤销已颁发的证书时,它们会自动更新。管理撤销对话框可通过 CA 的文本菜单的 CA 子菜单访问。可以添加、删除和修改条目。

撤销属性

证书吊销由 CA 在吊销日期发生,即执行吊销的时间。可以在此对话框中将无效日期设置为更早的时间。吊销原因解释了证书被吊销的 原因。tools.ietf.org/html/rfc528…

选项

选项对话框可以在文件菜单中找到。所有选项都保存在数据库中,不依赖于操作系统注册表或配置文件。

  • 字符串设置

    此选项适用于所有转换为 ASN1 字符串的字符串。选定的字符串类型会自动设置为最小可能和允许的类型,涵盖所有包含的字符。

    可以选择允许的字符串类型列表:

    • 可打印字符串或UTF8(默认)
    • **RFC2459中的PKIX建议:**所有字符串类型都按照 RFC2459 中的描述进行设置
    • 无BMP字符串,仅可打印字符串和T61: 所有包含不可打印字符的字符串都被视为错误。
    • 仅限UTF8字符串: 根据 RFC2459 为 2004 年之后发布的实体选择所有字符串类型,这意味着几乎所有可分辨名称条目类型都设置为 UTF8。
    • **所有字符串:**允许所有字符串类型。
  • 默认哈希算法

    较旧的 Windows 版本和 OpenSSL 版本无法处理 SHA256 和 SHA512。例如,此选项允许将哈希算法设置为 SHA1。

  • 不显示成功消息

    导入并生成新项目后,将显示成功消息。此开关禁用消息。

  • 不使用彩色显示过期证书

    从 0.9.2 版开始,证书的到期日期将被着色。红色表示已过期或尚未生效。黄色表示证书在到期前只有 4/5 的生命周期。CRL 到期日期将在到期前 2 天标记为红色。使用此选项,可以禁用着色。

  • 将x509术语翻译后显示(common -> 通用名称)

    阅读“commonName”通常更清楚,而不是例如(德语)“Allgemeine Bezeichnung”。“扩展密钥使用”或“基本约束”也是如此。使用此设置显示翻译的术语,并且条目的工具提示显示已建立的术语。如果未设置,将显示已建立的术语,并且工具提示包含翻译。

  • 当使用安全令牌密钥签名时仅使用令牌支持的哈希算法

    PKCS#11 令牌可能不支持签名操作的所有可能散列。即 EC 和 DSA 签名算法目前仅在 PKCS#11 规范中使用 SHA1 定义。

    XCA 在令牌之外的软件中对数字签名的哈希部分进行哈希处理,并使用令牌对哈希进行签名。这就是 XCA 可能使用额外的散列算法(如 ecdsaWithSha256)的原因。

    如果可能使用令牌散列算法的其他应用程序将使用令牌,则应设置此选项。

  • 禁用旧版 Netscape 扩展信息

    设置此选项后,传统 Netscape 扩展的输入和使用将被禁止。证书输入对话框没有 Netscape 选项卡,请求和证书列不显示 Netscape 扩展,并且在应用模板或转换证书时,Netscape 扩展被删除。但是,证书和请求的详细信息仍会显示 Netscape 扩展(如果存在)。

  • 必填的主体信息条目

    每当颁发缺少一个或多个所列条目的证书时,可以指定强制性专有名称条目列表以获得警告。编辑模板时不会检查此要求,因为模板可能包含将在证书推出期间填充的空条目。

  • 明确的主体信息条目

    此列表可用于更改证书/请求/模板生成对话框的主体选项卡中显示的通常 7 个可分辨名称条目的列表,以更好地满足需求。

    激活动态排列显式主体条目选项时,显式条目将按要编辑的名称重新排列。

    如果名称为空,则条目不变。否则,将首先显示要编辑的名称的条目,然后显示上述列表中未在要编辑的名称中提及的条目。

  • PKCS#11 提供者

    您可以在此处选择系统上一个或多个 PKCS#11 库的路径。如果列表为空,令牌菜单将不可用。

对象 ID

可以在下面列出的文件中添加专有对象 ID 和 OID 列表,以用于可分辨名称或扩展密钥用法。这些文件是:

  • **oids.txt:**附加对象 ID
  • **eku.txt:**ExtendedKeyUsage的内容
  • **dn.txt:**DistinguishedName的内容

下面列出了所有文件的搜索路径。除oids.txt之外的所有文件都按下面列出的顺序进行搜索,并在找到的第一个文件处停止搜索。oids.txt文件以相反的顺序搜索,所有 找到的oids.txt文件都被加载。

  • Unix

    • $HOME/.xca/
    • /etc/xca/
    • PREFIX/share/xca/ <newline>PREFIX 通常是 /usr 或 /usr/local
  • 视窗

    • CSIDL_APPDATAxca,类似于

      C:Documents and SettingsusernameApplication Dataxca 或 C:UsersusernameAppDataRoamingxca

    • 安装目录如:C:Programsxca

  • macOS

    • $HOME/库/应用程序支持/data/xca
    • /Applications/xca.app/资源

用户设置目录的路径取决于操作系统和版本。XCA 查找此文件的路径在 XCA 的 About对话框中显示为User settings path

新的 OID

所有非官方但属于您的公司或组织的对象 ID 都可以添加到文件oids.txt中。搜索此文件的所有可能位置并加载找到的所有oids.txt文件。这样,应用程序安装程序在*/usr/share/xca中添加了一些,在**/etc/xca中添加了管理员,在$HOME/.xca*中添加了用户 。此文件的格式为:<newline> OID : shortname : longname 冒号和文本之间的前导和尾随空格被忽略。*以#*开头的行将被忽略。

OID 列表

包含 OID 列表 ( eku.txt, dn.txt ) 的文件以不同的方式处理,仅使用找到的第一个。该文件的格式是每行一个条目。该条目可以是数字 OID(如1.3.6.1.5.5.8.2.2)、短名称(如 iKEIntermediate)或长名称IP 安全终端实体以#开头的行将被忽略。如果此文件应包含新的非官方 OID,则还必须在oids.txt文件之一中提及它们。

配置主体条目

如果您想/需要将您自己公司的特定主体条目添加到您的证书中,则无需重新编译 XCA 即可完成。

  1. 将其具有短名称和长名称的 OID 添加到新 OID中列出的oids.txt文件之一,例如: 1.3.6.1.4.1.12345.1: zodiacSign: Zodiac Sign
  2. 将 OID、短名称或长名称添加到第一个读取的dn.txt 在 Linux 上:cp /usr/share/xca/dn.txt ~/.xca/dn.txt && echo “zodiacSign” >> ~/.xca/ dn.txt
  3. 启动 XCA,打开数据库并转到Options->Distinguished name。在显式主体条目中选择Zodiac Sign,单击Add,通过在列表中拖动它来移动它,并在满意时单击 OK。
  4. 创建一个新证书并查看。

分步指南

初学者可以按照这些步骤轻松创建他们的第一个证书。本指南显示了各种任务的最低要求。为了更高级地使用 XCA,我们鼓励用户熟悉适用的标准。

设置根 CA 证书

  1. 单击证书选项卡。
  2. 单击创建证书按钮。
  3. 确保显示“来源”选项卡,必要时单击它。
    • 在面板底部,确保显示默认 CA模板,然后单击全部应用按钮。这将在扩展密钥算法Netscape扩展 选项卡下填写适当的值。
  4. 单击主体选项卡。
    • 输入内部名称;这仅用于工具中的显示目的。
    • 在上面的专有名称部分填写必填字段(国家名称、州/省、地区、组织、通用名称、电子邮件地址)。通用名称可以是“ACME 证书颁发机构”之类的名称。
    • 如果您想在可分辨名称中添加任何其他部分,请使用“添加”按钮。
    • 选择所需的私钥或生成一个新的。
  5. 单击扩展选项卡。
    • 时间范围可能很好(10 年)。如果要更改持续时间,请更改它并单击应用
  6. CRL 分发点将是已颁发证书的一部分。然而,应该考虑一个通用的 URL,例如 www.example.com/crl/crl.der
  7. 单击底部的确定按钮。

您现在可能希望发布一个(最初)空的 CRL。请按照下面给出的颁发 CRL 的说明进行操作,但您实际上并未撤销任何证书。

创建 CA 签名的主机证书

  1. 单击证书选项卡。

  2. 单击创建证书按钮。

  3. 确保显示“来源”选项卡,必要时单击它。

    • 在面板底部,选择模板“(默认)TLS_server”(或其他合适的模板,如果您已创建自己的模板),然后单击应用按钮。这将在扩展密钥算法Netscape扩展 选项卡下填写适当的值。
    • 在签名部分中,选择将用于签署新证书的证书。
  4. 单击主体选项卡。

    • 输入内部名称;这仅用于工具中的显示目的。对于主机证书,主机 FQDN(完全限定域名)是不错的选择。
    • 填写上方“专有名称”部分的必填字段(国家代码、州/省、地区、组织、通用名称、电子邮件地址)。对于主机证书,通用名称必须是您希望用户连接的 FQDN。这不必是主机的规范名称,也可以是别名。例如,如果 pluto.example.com是您的 Web 服务器,并且它的 DNS CNAME 条目为 www.example.com*,那么您可能希望证书中的 Common Name 值为www.example.com*。
    • 如果您想在可分辨名称中添加任何其他部分,请使用下拉框和添加按钮。
    • 选择所需的私钥或生成一个新的。
  5. 单击扩展选项卡。

    • 如果需要,更改时间范围并单击应用

    • 如果您将来需要吊销任何证书,您应该指定一个证书吊销列表位置。此根证书的位置必须是唯一的。XCA 以带有适当后缀的 PEM 或 DER 格式导出 CRL,因此在选择 URL 时应考虑这一点。选择类似 *www.example.com/crl/crl.der… URI可能是合适的。

      在“CRL 分发点”行上,单击“编辑”按钮。输入所需的 URI,然后单击Add。以相同的方式添加任何其他所需的 URI。单击验证应用。(OCSP 等替代机制超出了本指南的范围。)

    • 点击底部的确定按钮

创建自签名主机证书

此过程几乎与创建 CA 签名证书的过程相同,但有以下例外:

  1. 创建证书时,在“来源”选项卡下选择“创建自签名证书”。
  2. 自签名证书无法撤销,因此 CRL URI 应为空白。

设置模板

如果您在一个域下拥有或期望拥有多个主机并由同一个根证书签名,那么为您的主机设置模板可以简化主机证书的创建并提高一致性。

可以在证书生成对话框的第一个选项卡上应用模板的值。可以选择是否应用主体、扩展名或模板的两个部分。这样,可以定义仅主体模板,然后与 TLS_client 或 TLS_server 模板一起应用。

  1. 单击模板选项卡。
  2. 点击创建模板按钮
  3. 为预设模板值选择适当的值,然后单击确定
  4. 主体选项卡下,指定模板的内部名称。
  5. 填写(或修改)您希望在使用模板时填充的任何值。将其余部分留空(特别是“通用名称”字段)。
  6. 填写完所有所需字段后,单击窗口底部的“确定”按钮。

您的模板现在可以在创建新证书时使用。

或者,您可以通过项目的导出上下文菜单将现有证书或证书签名请求导出到模板。

撤销 CA 颁发的证书

  1. 单击证书选项卡。
  2. 右键单击要吊销的证书,然后选择吊销
  3. 右键单击用于签署被吊销证书的 CA 证书。选择CA –>生成 CRL
  4. 单击“创建 CRL ”对话框中的“确定”按钮。
  5. 单击主窗口中的吊销列表选项卡。
  6. 右键单击您刚刚生成的 CRL,然后选择Export。选择所需的格式(可能是 DER)并单击确定
  7. 将导出的 CRL 复制到已颁发证书的 CRL 分发点中发布的位置。
  8. (可选)删除同一 CA 证书的旧 CRL。

数据库

提取项目

sqlitebrowser 可用于检查数据库的元素。

数据库模式记录在案Schema 所有加密项目都存储为 base64 DER 格式,并且必须在将它们提供给 OpenSSL 之前对其进行解码:

| base64 -d | openssl <x509|req|crl|pkcs8> -inform DER ...

从数据库中提取内部名称为“pk8key”的私钥:

sqlite3 ~/xca.xdb "SELECT private FROM view_private WHERE name='pk8key'" | base64 -d | openssl pkcs8 -inform DER

提取 CRL:

sqlite3 ~/xca.xdb "SELECT crl FROM view_crls WHERE name='ca'" | base64 -d | openssl crl -inform DER

修改 id 为 3 的项目的评论:

sqlite3 ~/xca.xdb "UPDATE items SET comment='My notes' WHERE id=3"

项目名称不再要求是唯一的。XCA 中的每个表视图都有一个可选列“主键”,可以显示该列以获取数据库中项目的 ID。

架构

/* The  32bit hash  in public_keys, x509super, requests, certs and crls
 * is used to quickly find items in the DB by reference.
 * It consists of the first 4 bytes of a SHA1 hash.
 * Collisions are of course possible.
 *
 * All binaries are stored Base64 encoded in a column of type
 * ' B64_BLOB ' It is defined here as 'VARCHAR(8000)'
 */

#define B64_BLOB  VARCHAR(8000) 

/*
 * The B64(DER(something)) function means DER encode something
 * and then Base64 encode that.
 * So finally this is PEM without newlines, header and footer
 *
 * Dates are alway stored as 'CHAR(15)' in the
 * ASN.1 Generalized time 'yyyyMMddHHmmssZ' format
 */

#define DB_DATE  CHAR(15) 

/*
 * Configuration settings from
 *  the Options dialog, window size, last export directory,
 *  default key type and size,
 *  table column (position, sort order, visibility)
 */

  -- Schema Version 0
  CREATE TABLE settings ( 
	 key_ CHAR(20) UNIQUE,          -- mySql does not like 'key' or 'option 
	 value   B64_BLOB  ) 
  INSERT INTO settings (key_, value) VALUES ('schema', '  SCHEMA_VERSION  ') 

/*
 * All items (keys, tokens, requests, certs, crls, templates)
 * are stored here with the primary key and some common data
 * The other tables containing the details reference the 'id'
 * as FOREIGN KEY.
 */
  CREATE TABLE items( 
	 id INTEGER PRIMARY KEY,  
	 name VARCHAR(128),                  -- Internal name of the item
	 type INTEGER,                  -- enum pki_type
	 source INTEGER,                  -- enum pki_source
	 date   DB_DATE  ,                  -- Time of insertion (creation/import)
	 comment VARCHAR(2048),  
	 stamp INTEGER NOT NULL DEFAULT 0,   -- indicate concurrent access
	 del SMALLINT NOT NULL DEFAULT 0) 

/*
 * Storage of public keys. Private keys and tokens also store
 * their public part here.
 */
  CREATE TABLE public_keys ( 
	 item INTEGER,                  -- reference to items(id)
	 type CHAR(4),                  -- RSA DSA EC (as text)
	 hash INTEGER,                  -- 32 bit hash
	 len INTEGER,                          -- key size in bits
	 'public'   B64_BLOB  ,          -- B64(DER(public key))
	 FOREIGN KEY (item) REFERENCES items (id)) 

/*
 * The private part of RSA, DSA, EC keys.
 * references to 'items' and 'public_keys'
 */
  CREATE TABLE private_keys ( 
	 item INTEGER,                  -- reference to items(id)
	 ownPass INTEGER,                  -- Encrypted by DB pwd or own pwd
	 private   B64_BLOB  ,          -- B64(Encrypt(DER(private key)))
	 FOREIGN KEY (item) REFERENCES items (id)) 

/*
 * Smart cards or other PKCS#11 tokens
 * references to 'items' and 'public_keys'
 */
  CREATE TABLE tokens ( 
	 item INTEGER,                    -- reference to items(id)
	 card_manufacturer VARCHAR(64),   -- Card location data
	 card_serial VARCHAR(64),            -- as text
	 card_model VARCHAR(64),  
	 card_label VARCHAR(64),  
	 slot_label VARCHAR(64),  
	 object_id VARCHAR(64),            -- Unique ID on the token
	 FOREIGN KEY (item) REFERENCES items (id)) 

/*
 * Encryption and hash mechanisms supported by a token
 */
  CREATE TABLE token_mechanism ( 
	 item INTEGER,                  -- reference to items(id)
	 mechanism INTEGER,                  -- PKCS#11: CK_MECHANISM_TYPE
	 FOREIGN KEY (item) REFERENCES items (id)) 

/*
 * An X509 Super class, consisting of a
 *  - Distinguishd name hash
 *  - Referenced key in the database
 *  - hash of the public key, used for lookups if there
 *    is no key to reference
 * used by Requests and certificates and the use-counter of keys:
 * 'SELECT from x509super WHERE pkey=?'
 */
  CREATE TABLE x509super ( 
	 item INTEGER,                  -- reference to items(id)
	 subj_hash INTEGER,             -- 32 bit hash of the Distinguished name
	 pkey INTEGER,                  -- reference to the key items(id)
	 key_hash INTEGER,              -- 32 bit hash of the public key
	 FOREIGN KEY (item) REFERENCES items (id),  
	 FOREIGN KEY (pkey) REFERENCES items (id))  

/*
 * PKCS#10 Certificate request details
 * also takes information from the 'x509super' table.
 */
  CREATE TABLE requests ( 
	 item INTEGER,                  -- reference to items(id)
	 hash INTEGER,                  -- 32 bit hash of the request
	 signed INTEGER,                -- Whether it was once signed.
	 request   B64_BLOB  ,          -- B64(DER(PKCS#10 request))
	 FOREIGN KEY (item) REFERENCES items (id))  

/*
 * X509 certificate details
 * also takes information from the 'x509super' table.
 * The content of the columns: hash, iss_hash, serial, ca
 * can also be retrieved directly from the certificate, but are good
 * to lurk around for faster lookup
 */
  CREATE TABLE certs ( 
	 item INTEGER,                  -- reference to items(id)
	 hash INTEGER,                  -- 32 bit hash of the cert
	 iss_hash INTEGER,              -- 32 bit hash of the issuer DN
	 serial VARCHAR(64),            -- Serial number of the certificate
	 issuer INTEGER,                -- The items(id) of the issuer or NULL
	 ca INTEGER,                    -- CA: yes / no from BasicConstraints
	 cert   B64_BLOB  ,             -- B64(DER(certificate))
	 FOREIGN KEY (item) REFERENCES items (id),  
	 FOREIGN KEY (issuer) REFERENCES items (id))  

/*
 * X509 cartificate Authority data
 */
  CREATE TABLE authority ( 
	 item INTEGER,                  -- reference to items(id)
	 template INTEGER,              -- items(id) of the default template
	 crlExpire   DB_DATE  ,         -- CRL expiry date
	 crlNo INTEGER,                 -- Last CRL Number
	 crlDays INTEGER,               -- CRL days until renewal
	 dnPolicy VARCHAR(1024),        -- DistinguishedName policy (UNUSED)
	 FOREIGN KEY (item) REFERENCES items (id),  
	 FOREIGN KEY (template) REFERENCES items (id))  

/*
 * Storage of CRLs
 */
  CREATE TABLE crls ( 
	 item INTEGER,                  -- reference to items(id)
	 hash INTEGER,                  -- 32 bit hash of the CRL
	 num INTEGER,                   -- Number of revoked certificates
	 iss_hash INTEGER,              -- 32 bit hash of the issuer DN
	 issuer INTEGER,                -- The items(id) of the issuer or NULL
	 crl   B64_BLOB  ,              -- B64(DER(revocation list))
	 FOREIGN KEY (item) REFERENCES items (id),  
	 FOREIGN KEY (issuer) REFERENCES items (id))  

/*
 * Revocations (serial, date, reason, issuer) used to create new
 * CRLs. 'Manage revocations'
 */
  CREATE TABLE revocations ( 
	 caId INTEGER,                  -- reference to certs(item)
	 serial VARCHAR(64),            -- Serial of the revoked certificate
	 date   DB_DATE  ,              -- Time of creating the revocation
	 invaldate   DB_DATE  ,         -- Time of invalidation
	 crlNo INTEGER,                 -- Crl Number of CRL of first appearance
	 reasonBit INTEGER,             -- Bit number of the revocation reason
	 FOREIGN KEY (caId) REFERENCES items (id)) 

/*
 * Templates
 */
  CREATE TABLE templates ( 
	 item INTEGER,                  -- reference to items(id)
	 version INTEGER,               -- Version of the template format
	 template   B64_BLOB  ,         -- The base64 encoded template
	 FOREIGN KEY (item) REFERENCES items (id)) 

/* Views */
  CREATE VIEW view_public_keys AS SELECT  
	 items.id, items.name, items.type AS item_type, items.date,  
	 items.source, items.comment,  
	 public_keys.type as key_type, public_keys.len, public_keys.'public',  
	 private_keys.ownPass,  
	 tokens.card_manufacturer, tokens.card_serial, tokens.card_model,  
	 tokens.card_label, tokens.slot_label, tokens.object_id  
	 FROM public_keys LEFT JOIN items ON public_keys.item = items.id  
	 LEFT JOIN private_keys ON private_keys.item = public_keys.item  
	 LEFT JOIN tokens ON public_keys.item = tokens.item 

  CREATE VIEW view_certs AS SELECT  
	 items.id, items.name, items.type, items.date AS item_date,  
	 items.source, items.comment,  
	 x509super.pkey,  
	 certs.serial AS certs_serial, certs.issuer, certs.ca, certs.cert,  
	 authority.template, authority.crlExpire,  
	 authority.crlNo AS auth_crlno, authority.crlDays, authority.dnPolicy,  
	 revocations.serial, revocations.date, revocations.invaldate,  
	 revocations.crlNo, revocations.reasonBit  
	 FROM certs LEFT JOIN items ON certs.item = items.id  
	 LEFT JOIN x509super ON x509super.item = certs.item  
	 LEFT JOIN authority ON authority.item = certs.item  
	 LEFT JOIN revocations ON revocations.caId = certs.issuer  
	                         AND revocations.serial = certs.serial 

  CREATE VIEW view_requests AS SELECT  
	 items.id, items.name, items.type, items.date,  
	 items.source, items.comment,  
	 x509super.pkey,  
	 requests.request, requests.signed  
	 FROM requests LEFT JOIN items ON requests.item = items.id  
	 LEFT JOIN x509super ON x509super.item = requests.item 

  CREATE VIEW view_crls AS SELECT  
	 items.id, items.name, items.type, items.date,  
	 items.source, items.comment,  
	 crls.num, crls.issuer, crls.crl  
	 FROM crls LEFT JOIN items ON crls.item = items.id  

  CREATE VIEW view_templates AS SELECT  
	 items.id, items.name, items.type, items.date,  
	 items.source, items.comment,  
	 templates.version, templates.template  
	 FROM templates LEFT JOIN items ON templates.item = items.id 

  CREATE VIEW view_private AS SELECT  
	 name, private FROM private_keys JOIN items ON  
	 items.id = private_keys.item 


  CREATE INDEX i_settings_key_ ON settings (key_) 
  CREATE INDEX i_items_id ON items (id) 
  CREATE INDEX i_public_keys_item ON public_keys (item) 
  CREATE INDEX i_public_keys_hash ON public_keys (hash) 
  CREATE INDEX i_private_keys_item ON private_keys (item) 
  CREATE INDEX i_tokens_item ON tokens (item) 
  CREATE INDEX i_token_mechanism_item ON token_mechanism (item) 
  CREATE INDEX i_x509super_item ON x509super (item) 
  CREATE INDEX i_x509super_subj_hash ON x509super (subj_hash) 
  CREATE INDEX i_x509super_key_hash ON x509super (key_hash) 
  CREATE INDEX i_x509super_pkey ON x509super (pkey) 
  CREATE INDEX i_requests_item ON requests (item) 
  CREATE INDEX i_requests_hash ON requests (hash) 
  CREATE INDEX i_certs_item ON certs (item) 
  CREATE INDEX i_certs_hash ON certs (hash) 
  CREATE INDEX i_certs_iss_hash ON certs (iss_hash) 
  CREATE INDEX i_certs_serial ON certs (serial) 
  CREATE INDEX i_certs_issuer ON certs (issuer) 
  CREATE INDEX i_certs_ca ON certs (ca) 
  CREATE INDEX i_authority_item ON authority (item) 
  CREATE INDEX i_crls_item ON crls (item) 
  CREATE INDEX i_crls_hash ON crls (hash) 
  CREATE INDEX i_crls_iss_hash ON crls (iss_hash) 
  CREATE INDEX i_crls_issuer ON crls (issuer) 
  CREATE INDEX i_revocations_caId_serial ON revocations (caId, serial) 
  CREATE INDEX i_templates_item ON templates (item) 
  CREATE INDEX i_items_stamp ON items (stamp) 

	;
/* Schema Version 2: Views added to quickly load the data */

/* Schema Version 3: Add indexes over hashes and primary, foreign keys */

/* Schema Version 4: Add private key view to extract a private key with:
	mysql:      mysql -sNp -u xca xca_msq -e
	or sqlite:  sqlite3 ~/sqlxdb.xdb
	or psql:    psql -t -h 192.168.140.7 -U xca -d xca_pg -c
	        'SELECT private FROM view_private WHERE name='pk8key';' |\
	        base64 -d | openssl pkcs8 -inform DER
 * First mysql/psql will ask for a password and then OpenSSL will ask for
 * the database password.
 */

/* Schema Version 5: Extend settings value size from 1024 to B64_BLOB
 * SQLite does not support 'ALTER TABLE settings MODIFY ...'
 */

  -- Schema Version 5
  ALTER TABLE settings RENAME TO __settings 
  CREATE TABLE settings ( 
	 key_ CHAR(20) UNIQUE,          -- mySql does not like 'key' or 'option'
	 value   B64_BLOB  ) 
  INSERT INTO settings(key_, value)  
	 SELECT key_, value  
	 FROM __settings 
  DROP TABLE __settings 
  UPDATE settings SET value='6' WHERE key_='schema' 
	;

  -- Schema Version 6
  ALTER TABLE items ADD del SMALLINT NOT NULL DEFAULT 0 
  CREATE INDEX i_items_del ON items (del) 
  UPDATE settings SET value='7' WHERE key_='schema' 
	;

/* When adding new tables or views, also add them to the list
 * in XSqlQuery::rewriteQuery(QString) in lib/sql.cpp
 */

变更日志

​ 略。详见 变更日志