创建带签名软件包的过程涉及若干步骤,您需要领会一些新概念和术语。本节提供有关带签名的软件包、其术语以及证书管理的信息。此外还提供了有关如何创建带签名的软件包的逐步骤过程。
带签名的软件包是一种具有数字签名(下面定义的 PEM 编码 PKCS7 数字签名)的标准流格式软件包,该签名用于验证:
软件包是否来自对其进行签名的实体
软件包是否的确由该实体签名
软件包是否在该实体对其签名之后未进行修改
对软件包进行签名的实体是否为受信任实体
除了签名,带签名的软件包与不带签名的软件包完全相同。带签名的软件包与不带签名的软件包二进制兼容。因此,带签名的软件包可用于打包工具的旧版本。但是,在这种情况下签名会被忽略。
带签名的打包技术引入了一些新的术语和缩写,下表中介绍了这些内容。
在创建带签名的软件包之前,您必须有软件包密钥库。此软件包密钥库以对象形式包含证书。软件包密钥库中存在两种类型的对象:
受信任证书包含属于其他实体的一个公钥证书。之所以这样命名受信任证书,是因为密钥库属主相信证书中的公钥确实属于由证书的“主题”(所有者)指定的身份。证书的颁发者通过对证书进行签名来确保证书的真实性。
用户密钥用于存放敏感的加密密钥信息。加密密钥信息以受保护的格式存储,可防止进行未经授权的访问。用户密钥中既包含用户的私钥又包含与私钥相对应的公钥证书。
创建带签名的软件包时将使用用户密钥。
缺省情况下,软件包密钥库存储在 /var/sadm/security 目录中。缺省情况下各用户也可将自己的密钥库存储在 $HOME/.pkg/security 目录中。
在磁盘上,软件包密钥库可以采用两种格式: 多文件格式和单文件格式。多文件格式将其对象存储在多个文件中。每种类型的对象存储在单独的文件中。必须使用相同的口令短语对所有这些文件进行加密。单文件密钥库将其所有对象存储在文件系统上的单个文件中。
用于管理证书和软件包密钥库的主要实用程序是 pkgadm 命令。以下各小节介绍了用于管理软件包密钥库的更为常见的任务。
可以使用 pkgadm 命令将受信任证书添加到软件包密钥库。证书可以是 PEM 或 DER 格式。例如:
$ pkgadm addcert -t /tmp/mytrustedcert.pem |
在此示例中,名为 mytrustedcert.pem 的 PEM 格式证书会添加到软件包密钥库中。
pkgadm 命令不会生成用户证书或私钥。用户证书和私钥通常从证书颁发机构(例如 Verisign)获得。此外也可作为自行签名的证书在本地生成。一旦获取了私钥和证书,即可使用 pkgadm 命令将其导入到软件包密钥库中。例如:
pkgadm addcert -n myname -e /tmp/myprivkey.pem /tmp/mypubcert.pem |
在此示例中,使用了以下选项:
-n myname |
标识软件包密钥库中您希望处理的实体 (myname)。myname 实体成为对象存储时所用的别名。 |
-e /tmp/myprivkey.pem |
指定包含私钥的文件。在本例中,文件是 myprivkey.pem,位于 /tmp 目录。 |
/tmp/mypubcert.pem |
指定名为 mypubcert.pem 的 PEM 格式证书文件。 |
$ pkgadm listcert |
此命令显示软件包密钥库中的受信任证书和私钥。
pkgadm 命令可用于从软件包密钥库中删除受信任证书和私钥。
删除用户证书时,必须指定证书/密钥对的别名。例如:
$ pkgadm removecert -n myname |
证书的别名是证书的通用名称,可使用 pkgadm listcert 命令标识。例如,以下命令删除一个名为 Trusted CA Cert 1 的受信任证书:
$ pkgadm removecert -n "Trusted CA Cert 1" |
如果使用同一别名存储了受信任证书和用户证书,则指定 -n 选项时会将其同时删除。
创建带签名的软件包的过程涉及三个基本步骤:
创建不带签名的目录格式的软件包。
将签名证书、CA 证书和私钥导入到软件包密钥库。
使用步骤 2 的证书对步骤 1 中创建的软件包进行签名。
打包工具不会创建证书。必须从证书颁发机构(例如 Verisign 或 Thawte)获取这些证书。
以下过程介绍了创建带签名软件包的每个步骤。
创建不带签名的目录格式的软件包过程与创建常规软件包的过程相同,如本手册前面所述。以下过程介绍如何创建此不带签名的目录格式的软件包。如果您需要更多信息,请参阅前面关于生成软件包的各节。
pkginfo 文件应该包含以下基本内容:
PKG=SUNWfoo BASEDIR=/ NAME=My Test Package ARCH=sparc VERSION=1.0.0 CATEGORY=application |
prototye 文件应该包含以下基本内容:
$cat prototype i pkginfo d none usr 0755 root sys d none usr/bin 0755 root bin f none usr/bin/myapp=/tmp/myroot/usr/bin/myapp 0644 root bin |
列出对象源目录的内容。
例如:
$ ls -lR /tmp/myroot |
/tmp/myroot: total 16 drwxr-xr-x 3 abc other 177 Jun 2 16:19 usr /tmp/myroot/usr: total 16 drwxr-xr-x 2 abc other 179 Jun 2 16:19 bin /tmp/myroot/usr/bin: total 16 -rw------- 1 abc other 1024 Jun 2 16:19 myapp |
创建不带签名的软件包。
pkgmk -d `pwd` |
输出可能如下所示:
## Building pkgmap from package prototype file. ## Processing pkginfo file. WARNING: parameter <PSTAMP> set to "syrinx20030605115507" WARNING: parameter <CLASSES> set to "none" ## Attempting to volumize 3 entries in pkgmap. part 1 -- 84 blocks, 7 entries ## Packaging one part. /tmp/SUNWfoo/pkgmap /tmp/SUNWfoo/pkginfo /tmp/SUNWfoo/reloc/usr/bin/myapp ## Validating control scripts. ## Packaging complete. |
软件包现在会存在于当前目录中。
要导入的证书和私钥必须以 PEM 或 DER 编码的 X.509 证书和私钥形式存在。此外,必须先将任何将您的签名证书与证书颁发机构证书相关联的中间或“链”证书导入到软件包密钥库中,然后才能对软件包进行签名。
各证书颁发机构可能会颁发不同格式的证书。要将证书和私钥从 PKCS12 文件提取到 PEM 编码的 X.509 文件(适于导入到软件包密钥库),请使用免费软件转换实用程序,例如 OpenSSL。
如果您的私钥进行了加密(通常应该如此),系统将提示您输入口令短语。此外,还将提示您输入口令以保护生成的软件包密钥库。您可以选择不提供任何口令,但是这样做会导致软件包密钥库不会加密。
以下过程介绍了证书格式正确时,如何使用 pkgadm 命令导入证书。
导入在 PEM 或 DER 编码的 X.509 证书文件中找到的所有证书颁发机构证书。
例如,要导入在 ca.pem 文件中找到的所有证书颁发机构证书,应键入以下内容:
$ pkgadm addcert -k ~/mykeystore -ty ca.pem |
输出可能如下所示:
Trusting certificate <VeriSign Class 1 CA Individual \ Subscriber-Persona Not Validated> Trusting certificate </C=US/O=VeriSign, Inc./OU=Class 1 Public \ Primary Certification Authority Type a Keystore protection Password. Press ENTER for no protection password (not recommended): For Verification: Type a Keystore protection Password. Press ENTER for no protection password (not recommended): Certificate(s) from <ca.pem> are now trusted |
为了将您的签名密钥导入到软件包密钥库,必须提供别名,供以后签名软件包时使用。如果您要从软件包密钥库中删除密钥,也可能会使用该别名。
例如,要从 sign.pem 文件中导入您的签名密钥,应键入以下内容:
$ pkgadm addcert -k ~/mykeystore -n mycert sign.pem |
输出可能如下所示:
Enter PEM passphrase: Enter Keystore Password: Successfully added Certificate <sign.pem> with alias <mycert> |
检验证书是否在软件包密钥库中。
例如,要在密钥库中查看在上一步骤中创建的证书,应键入以下内容:
$ pkgadm listcert -k ~/mykeystore |
一旦将证书导入到软件包密钥库,即可对软件包签名。实际的软件包签名工作是使用 pkgtrans 命令完成的。
使用 pkgtrans 命令对软件包签名。提供不带签名的软件包的位置,并提供用于签名软件包的密钥别名。
例如,使用前面过程中的示例,您应键入以下内容创建名为 SUNWfoo.signed 的带签名软件包:
$ pkgtrans -g -k ~/mykeystore -n mycert . ./SUNWfoo.signed SUNWfoo |
此命令的输出可能如下所示:
Retrieving signing certificates from keystore </home/user/mykeystore> Enter keystore password: Generating digital signature for signer <Test User> Transferring <SUNWfoot> package instance |
带签名的软件包会在 SUNWfoo.signed 文件中创建且采用软件包流格式。此带签名的软件包适合于通过 pkgadd 命令和 URL 复制到 Web 站点并进行安装。