应用程序包开发者指南

创建带签名的软件包

创建带签名软件包的过程涉及若干步骤,您需要领会一些新概念和术语。本节提供有关带签名的软件包、其术语以及证书管理的信息。此外还提供了有关如何创建带签名的软件包的逐步骤过程。

带签名的软件包

带签名的软件包是一种具有数字签名(下面定义的 PEM 编码 PKCS7 数字签名)的标准流格式软件包,该签名用于验证:

除了签名,带签名的软件包与不带签名的软件包完全相同。带签名的软件包与不带签名的软件包二进制兼容。因此,带签名的软件包可用于打包工具的旧版本。但是,在这种情况下签名会被忽略。

带签名的打包技术引入了一些新的术语和缩写,下表中介绍了这些内容。

术语 

定义 

ASN.1 

抽象语法表示法 1-一种表示抽象对象的方法。例如,ASN.1 定义公钥证书、组成证书的所有对象以及对象的收集顺序。不过,ASN.1 不指定针对存储或传输序列化对象的方式。

X.509 

ITU-T 推荐标准 X.509-指定广泛采用的 X.509 公钥证书语法。

DER 

唯一编码规则-ASN.1 对象的一种二进制表示法,用于定义在计算环境中针对存储或传输序列化 ASN.1 对象的方式。 

PEM 

保密性增强消息-一种使用 base 64 编码和某些可选标头对文件进行编码(采用 DER 或其他二进制格式)的方式。PEM 最初用于对 MIME 类型的电子邮件进行编码。PEM 还广泛用于将证书和私钥编码到文件系统或电子邮件中存在的文件中。

PKCS7 

公钥密码学标准 #7-此标准描述可能应用了加密算法的数据的通用语法,例如数字签名和数字信封。带签名的软件包包含一个嵌入的 PKCS7 签名。此签名至少包含软件包的加密摘要,以及签名者的 X.509 公钥证书。带签名的软件包还可能包含链证书。当形成从签名者的证书到本地存储的受信任证书的信任链时可以使用链证书。 

PKCS12 

公钥密码学标准 #12-此标准描述将加密对象存储在磁盘上的语法。软件包密钥库会以这种格式进行维护。 

软件包密钥库 

可通过软件包工具查询的证书和密钥的系统信息库。 

证书管理

在创建带签名的软件包之前,您必须有软件包密钥库。此软件包密钥库以对象形式包含证书。软件包密钥库中存在两种类型的对象:

受信任证书

受信任证书包含属于其他实体的一个公钥证书。之所以这样命名受信任证书,是因为密钥库属主相信证书中的公钥确实属于由证书的“主题”(所有者)指定的身份。证书的颁发者通过对证书进行签名来确保证书的真实性。

验证签名以及启动与安全 (SSL) 服务器的连接时将使用受信任证书。

用户密钥

用户密钥用于存放敏感的加密密钥信息。加密密钥信息以受保护的格式存储,可防止进行未经授权的访问。用户密钥中既包含用户的私钥又包含与私钥相对应的公钥证书。

创建带签名的软件包时将使用用户密钥。

缺省情况下,软件包密钥库存储在 /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 命令还可用于查看软件包密钥库的内容。例如:


$ pkgadm listcert

此命令显示软件包密钥库中的受信任证书和私钥。

从软件包密钥库中删除受信任证书和私钥

pkgadm 命令可用于从软件包密钥库中删除受信任证书和私钥。

删除用户证书时,必须指定证书/密钥对的别名。例如:


$ pkgadm removecert -n myname

证书的别名是证书的通用名称,可使用 pkgadm listcert 命令标识。例如,以下命令删除一个名为 Trusted CA Cert 1 的受信任证书:


$ pkgadm removecert -n "Trusted CA Cert 1"

注 –

如果使用同一别名存储了受信任证书和用户证书,则指定 -n 选项时会将其同时删除。


创建带签名的软件包

创建带签名的软件包的过程涉及三个基本步骤:

  1. 创建不带签名的目录格式的软件包。

  2. 将签名证书、CA 证书和私钥导入到软件包密钥库。

  3. 使用步骤 2 的证书对步骤 1 中创建的软件包进行签名。


注 –

打包工具不会创建证书。必须从证书颁发机构(例如 Verisign 或 Thawte)获取这些证书。


以下过程介绍了创建带签名软件包的每个步骤。

Procedure如何创建不带签名的目录格式的软件包

创建不带签名的目录格式的软件包过程与创建常规软件包的过程相同,如本手册前面所述。以下过程介绍如何创建此不带签名的目录格式的软件包。如果您需要更多信息,请参阅前面关于生成软件包的各节。

  1. 创建 pkginfo 文件。

    pkginfo 文件应该包含以下基本内容:


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. 创建 prototype 文件。

    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
  3. 列出对象源目录的内容。

    例如:


    $ 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
  4. 创建不带签名的软件包。


    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.

    软件包现在会存在于当前目录中。

Procedure如何将证书导入到软件包密钥库

要导入的证书和私钥必须以 PEM 或 DER 编码的 X.509 证书和私钥形式存在。此外,必须先将任何将您的签名证书与证书颁发机构证书相关联的中间或“链”证书导入到软件包密钥库中,然后才能对软件包进行签名。


注 –

各证书颁发机构可能会颁发不同格式的证书。要将证书和私钥从 PKCS12 文件提取到 PEM 编码的 X.509 文件(适于导入到软件包密钥库),请使用免费软件转换实用程序,例如 OpenSSL。


如果您的私钥进行了加密(通常应该如此),系统将提示您输入口令短语。此外,还将提示您输入口令以保护生成的软件包密钥库。您可以选择不提供任何口令,但是这样做会导致软件包密钥库不会加密。

以下过程介绍了证书格式正确时,如何使用 pkgadm 命令导入证书。

  1. 导入在 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>
  2. 检验证书是否在软件包密钥库中。

    例如,要在密钥库中查看在上一步骤中创建的证书,应键入以下内容:


    $ pkgadm listcert -k ~/mykeystore
    

Procedure如何对软件包签名

一旦将证书导入到软件包密钥库,即可对软件包签名。实际的软件包签名工作是使用 pkgtrans 命令完成的。

  1. 使用 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 站点并进行安装。