跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:安全服务 Oracle Solaris 11 Information Library (简体中文) |
本节介绍如何使用 pktool 命令管理公钥对象,例如口令、口令短语、文件、密钥库、证书和 CRL。
通过密钥管理框架 (Key Management Framework, KMF) 可以集中管理公钥技术。
|
此过程可创建自签名证书,并将该证书存储在 PKCS #11 密钥库中。在此操作过程中,还将创建一个 RSA 公钥/私钥对。私钥与该证书一起存储在密钥库中。
% pktool gencert [keystore=keystore] label=label-name \ subject=subject-DN serial=hex-serial-number
按公钥对象类型指定密钥库。该值可以是 nss、pkcs11 或 ssl。此关键字是可选的。
指定颁发者为证书提供的唯一名称。
指定证书的标识名。
指定十六进制格式序列号。证书的颁发者可以选择该序列号,例如 0x0102030405。
% pktool list Found number certificates. 1. (X.509 certificate) Label: label-name ID: Fingerprint that binds certificate to private key Subject: subject-DN Issuer: distinguished-name Serial: hex-serial-number n. ...
此命令可列出密钥库中的所有证书。在下面的示例中,密钥库只包含一个证书。
示例 13-1 使用 pktool 创建自签名证书
在下面的示例中,My Company 的用户创建了一个自签名证书,并将该证书存储在 PKCS #11 对象的密钥库中。该密钥库最初是空的。如果尚未初始化此密钥库,则软令牌的 PIN 为 changeme。
% pktool gencert keystore=pkcs11 label="My Cert" \ subject="C=US, O=My Company, OU=Security Engineering Group, CN=MyCA" \ serial=0x000000001 Enter pin for Sun Software PKCS#11 softtoken:Type PIN for token
% pktool list Found 1 certificates. 1. (X.509 certificate) Label: My Cert ID: 12:82:17:5f:80:78:eb:44:8b:98:e3:3c:11:c0:32:5e:b6:4c:ea:eb Subject: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Issuer: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Serial: 0x01
此过程介绍如何将包含以 PEM 或原始 DER 编码的 PKI 信息的文件导入密钥库。有关导出过程的信息,请参见示例 13-4。
% pktool import keystore=keystore infile=infile-name label=label-name
如果要导入的是私有 PKI 信息(例如 PKCS #12 格式的导出文件),则需要为该文件提供口令。您要导入的文件的创建者会向您提供 PKCS #12 口令。
Enter password to use for accessing the PKCS12 file:Type PKCS #12 password
Enter pin for Sun Software PKCS#11 softtoken: Type PIN for token
% pktool list Found number certificates. 1. (X.509 certificate) Label: label-name ID: Fingerprint that binds certificate to private key Subject: subject-DN Issuer: distinguished-name Serial: hex-serial-number 2. ...
示例 13-2 将 PKCS #12 文件导入密钥库
在下面的示例中,用户从第三方导入了一个 PKCS #12 文件。pktool import 命令可从 gracedata.p12 文件提取私钥和证书,并将它们存储在用户的首选密钥库中。
% pktool import keystore=pkcs11 infile=gracedata.p12 label=GraceCert Enter password to use for accessing the PKCS12 file:Type PKCS #12 password Enter pin for Sun Software PKCS#11 softtoken: Type PIN for token Found 1 certificate(s) and 1 key(s) in gracedata.p12 % pktool list Found 1 certificates. 1. (X.509 certificate) Label: GraceCert ID: 12:82:17:5f:80:78:eb:44:8b:98:e3:3c:11:c0:32:5e:b6:4c:ea:eb Subject: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Issuer: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Serial: 0x01
示例 13-3 将 X.509 证书导入密钥库
在下面的示例中,用户将 PEM 格式的 X.509 证书导入用户的首选密钥库。此公共证书不受口令保护。用户的公共密钥库也不受口令保护。
% pktool import keystore=pkcs11 infile=somecert.pem label="TheirCompany Root Cert" % pktool list Found 1 certificates. 1. (X.509 certificate) Label: TheirCompany Root Cert ID: 21:ae:83:98:24:d1:1f:cb:65:5b:48:75:7d:02:47:cf:98:1f:ec:a0 Subject: C=US, O=TheirCompany, OU=Security, CN=TheirCompany Root CA Issuer: C=US, O=TheirCompany, OU=Security, CN=TheirCompany Root CA Serial: 0x01
可以创建一个 PKCS #12 格式的文件,用于将私钥及其关联的 X.509 证书导出到其他系统。对该文件的访问受口令保护。
% pktool list Found number certificates. 1. (X.509 certificate) Label: label-name ID: Fingerprint that binds certificate to private key Subject: subject-DN Issuer: distinguished-name Serial: hex-serial-number 2. ...
使用 pktool list 命令生成的密钥库和标签。为导出文件提供文件名。如果文件名包含空格,需要用双引号将其括起来。
% pktool export keystore=keystore outfile=outfile-name label=label-name
在提示符下键入密钥库的当前口令。此时,即会为导出文件创建口令。接收者在导入该文件时必须提供此口令。
Enter pin for Sun Software PKCS#11 softtoken: Type PIN for token Enter password to use for accessing the PKCS12 file:Create PKCS #12 password
提示 - 将口令与导出文件分开发送。建议的最佳做法是不通过发送数据来提供口令,例如通过打电话。
示例 13-4 以 PKCS #12 格式导出证书和私钥
在下面的示例中,用户将私钥及其关联的 X.509 证书导出到一个标准的 PKCS #12 文件中。可将此文件导入到其他密钥库中。PKCS #11 口令可保护源密钥库。PKCS #12 口令用于保护 PKCS #12 文件中的私有数据。导入该文件时需要提供此口令。
% pktool list Found 1 certificates. 1. (X.509 certificate) Label: My Cert ID: 12:82:17:5f:80:78:eb:44:8b:98:e3:3c:11:c0:32:5e:b6:4c:ea:eb Subject: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Issuer: C=US, O=My Company, OU=Security Engineering Group, CN=MyCA Serial: 0x01
% pktool export keystore=pkcs11 outfile=mydata.p12 label="My Cert" Enter pin for Sun Software PKCS#11 softtoken: Type PIN for token Enter password to use for accessing the PKCS12 file:Create PKCS #12 password
然后,用户打电话给接收者,提供 PKCS #12 口令。
可以为密钥库中的对象以及密钥库本身生成口令短语。访问该对象或密钥库时需要提供此口令短语。有关为密钥库中的对象生成口令短语的示例,请参见示例 13-4。
% pktool setpin keystore=nss|pkcs11 dir=directory
如果尚未为密钥库设置口令,请按回车键创建口令。
Enter current token passphrase:Press the Return key Create new passphrase:Type the passphrase that you want to use Re-enter new passphrase:Retype the passphrase Passphrase changed.
密钥库现在受口令短语保护了。如果丢失了口令短语,您将无法访问该密钥库中的对象。
示例 13-5 使用口令短语保护密钥库
下面的示例说明了如何为 NSS 数据库设置口令短语。由于尚未创建口令短语,用户需要在第一个提示处按回车键。
% pktool setpin keystore=nss dir=/var/nss Enter current token passphrase:Press the Return key Create new passphrase: has8n0NdaH Re-enter new passphrase: has8n0NdaH Passphrase changed.
某些应用程序需要公钥/私钥对。在此过程中,将创建这些密钥对并存储它们。
使用以下方法之一。
基于文件的密钥是为从磁盘上的文件中直接读取密钥的应用程序而创建的。通常,直接使用 OpenSSL 加密库的应用程序要求您将应用程序的密钥和证书存储在文件中。
注 - file 密钥库不支持椭圆曲线 (elliptic curve, ec) 密钥和证书。
% pktool genkeypair keystore=file outkey=key-filename \ [format=der|pem] [keytype=rsa|dsa] [keylen=key-size]
在使用此方法之前,必须先完成步骤 1。
PKCS #11 密钥库用于将对象存储在硬件设备上。该设备可以是插入到加密框架的 Sun Crypto Accelerator 6000 卡、受信任的平台模块 (trusted platform module, TPM) 设备或智能卡。PKCS #11 还可以用于将对象存储在 softtoken,或基于软件的令牌中,从而将这些对象存储在磁盘上的专用子目录中。有关更多信息,请参见 pkcs11_softtoken(5) 手册页。
可以从密钥库中按指定的标签检索密钥对。
% pktool genkeypair label=key-label \ [token=token[:manuf[:serial]]] \ [keytype=rsa|dsa|ec] [curve=ECC-Curve-Name]]\ [keylen=key-size] [listcurves]
为密钥对指定标签。可以从密钥库中按其标签检索密钥对。
指定令牌名称。缺省情况下,令牌名称是 Sun Software PKCS#11 softtoken。
指定密钥对类型。对于椭圆曲线 (elliptic curve, ec) 类型,可选择性地指定曲线名称。曲线名称作为输出列出到 listcurves 选项。
指定密钥的长度(以位为单位)。该数字必须可以被 8 整除。
列出可用作 ec 密钥类型的 curve= 选项值的椭圆曲线名称。
NSS 密钥库由依赖 NSS 作为其主加密接口的服务器使用。例如,Oracle iPlanet Web Server 将 NSS 数据库用于对象存储。
在使用此方法之前,必须先完成步骤 1。
% pktool keystore=nss genkeypair label=key-nickname \ [token=token[:manuf[:serial]]] \ [dir=directory-path] [prefix=database-prefix] \ [keytype=rsa|dsa|ec] [curve=ECC-Curve-Name]] \ [keylen=key-size] [listcurves]
值 nss 指定密钥存储位置的 NSS 类型。
为密钥对指定标签。可以从密钥库中按其标签检索密钥对。
指定令牌名称。缺省情况下,令牌是 Sun Software PKCS#11 softtoken。
指定 NSS 数据库的目录路径。缺省情况下,directory 是当前目录。
指定 NSS 数据库的前缀。缺省为无前缀。
指定密钥对类型。对于椭圆曲线类型,可选择性地指定曲线名称。曲线名称作为输出列出到 listcurves 选项。
指定密钥的长度(以位为单位)。该数字必须可以被 8 整除。
列出可用作 ec 密钥类型的 curve= 选项值的椭圆曲线名称。
根据密钥的存储位置,使用以下命令之一:
% pktool list keystore=file objtype=key infile=key-filename Found n keys. Key #1 - keytype:location (keylen)
$ pktool list objtype=key Enter PIN for keystore: Found n keys. Key #1 - keytype:location (keylen)
% pktool list keystore=nss dir=directory objtype=key
示例 13-6 使用 pktool 命令创建密钥对
在以下示例中,用户首次创建 PKCS #11 密钥库。确定 RSA 密钥对的密钥大小后,用户生成应用程序的密钥对。最后,用户验证该密钥对是否在密钥库中。用户注意到 RSA 密钥对的第二个实例可以存储在硬件上。由于用户未指定 token 参数,因此该密钥对存储为 Sun Software PKCS#11 softtoken。
# pktool setpin Create new passphrase:Easily remembered, hard-to-detect password Re-enter new passphrase:Retype password Passphrase changed. % cryptoadm list -vm | grep PAIR ... CKM_DSA_KEY_PAIR_GEN 512 1024 . . . CKM_RSA_PKCS_KEY_PAIR_GEN 256 4096 . . . ... CKM_RSA_PKCS_KEY_PAIR_GEN 512 2048 X . . ecc: CKM_EC_KEY_PAIR_GEN,CKM_ECDH1_DERIVE,CKM_ECDSA,CKM_ECDSA_SHA1 % pktool genkeypair label=specialappkeypair keytype=rsa keylen=2048 Enter PIN for Sun Software PKCS#11 softtoken :Type password % pktool list Enter PIN for Sun Software PKCS#11 softtoken :Type password Found 1 keys. Key #1 - keypair: specialappkeypair (2048 bits)
示例 13-7 创建使用椭圆曲线算法的密钥对
在以下示例中,用户将椭圆曲线 (elliptic curve, ec) 密钥对添加到密钥库中,指定曲线名称并验证该密钥对是否在密钥库中。
% pktool genkeypair listcurves secp112r1, secp112r2, secp128r1, secp128r2, secp160k1 . . . c2pnb304w1, c2tnb359v1, c2pnb368w1, c2tnb431r1, prime192v2 prime192v3 % pktool genkeypair label=eckeypair keytype=ec curves=c2tnb431r1 % pktool list Enter PIN for Sun Software PKCS#11 softtoken :Type password Found 2 keys. Key #1 - keypair: specialappkeypair (2048 bits) Key #2 - keypair: eckeypair (c2tnb431r1)
此过程用于签署 PKCS #10 证书签名请求 (certificate signing request, CSR)。CSR 可以是 PEM 或 DER 格式。签署过程颁发 X.509 v3 证书。要生成 PKCS #10 CSR,请参见 pktool(1) 手册页。
开始之前
您是证书颁发机构 (certificate authority, CA),您已收到一个 CSR,该请求存储在文件中。
如果已将签名者的密钥存储在 PKCS #11 密钥库中,则 signkey 是检索此私钥的标签。
如果已将签名者的密钥存储在 NSS 密钥库或文件密钥库中,则 signkey 是保存此私钥的文件名。
指定 CSR 的文件名。
指定已签名证书的序列号。
指定已签名证书的文件名。
指定采用标识名 (distinguished name, DN) 格式的 CA 颁发者名称。
有关 signcsr 子命令的可选参数的信息,请参见 pktool(1) 手册页。
例如,以下命令可使用 PKCS #11 系统信息库中的签名者密钥签署证书。
# pktool signcsr signkey=CASigningKey \ csr=fromExampleCoCSR \ serial=0x12345678 \ outcert=ExampleCoCert2010 \ issuer="O=Oracle Corporation, \ OU=Oracle Solaris Security Technology, L=Redwood City, ST=CA, C=US, \ CN=rootsign Oracle"
以下命令使用文件中的签名者密钥签署证书。
# pktool signcsr signkey=CASigningKey \ csr=fromExampleCoCSR \ serial=0x12345678 \ outcert=ExampleCoCert2010 \ issuer="O=Oracle Corporation, \ OU=Oracle Solaris Security Technology, L=Redwood City, ST=CA, C=US, \ CN=rootsign Oracle"
您可以使用电子邮件、Web 站点或其他机制将该证书传送给请求方。
例如,您可以使用电子邮件将 ExampleCoCert2010 文件发送给请求方。
通过向插件提供密钥库名称来标识该插件。将插件添加到 KMF 中时,软件会按其密钥库名称标识它。可以定义该插件以接受选项。此过程包括如何从 KMF 中删除插件。
% /usr/bin/kmfcfg install keystore=keystore-name \ modulepath=path-to-plugin [option="option-string"]
其中
keystore-name-指定您提供的密钥库的唯一名称。
path-to-plugin-指定 KMF 插件的共享库对象的完整路径。
option-string-指定共享库对象的可选参数。
% kmfcfg list plugin keystore-name:path-to-plugin [(built-in)] | [;option=option-string]
% kmfcfg uninstall keystore=keystore-name % kmfcfg plugin list
示例 13-8 使用选项调用 KMF 插件
在以下示例中,管理员将 KMF 插件存储在站点专用目录中。定义该插件以接受 debug 选项。管理员添加插件,然后验证该插件是否已安装。
# /usr/bin/kmfcfg install keystore=mykmfplug \ modulepath=/lib/security/site-modules/mykmfplug.so # kmfcfg list plugin KMF plugin information: ----------------------- pkcs11:kmf_pkcs11.so.1 (built-in) file:kmf_openssl.so.1 (built-in) nss:kmf_nss.so.1 (built-in) mykmfplug:/lib/security/site-modules/mykmfplug.so # kmfcfg modify plugin keystore=mykmfplug option="debug" # kmfcfg list plugin KMF plugin information: ----------------------- ... mykmfplug:/lib/security/site-modules/mykmfplug.so;option=debug
该插件现在在调试模式下运行。