生成 CA 后,可以生成客户机证书。
要生成客户机证书,请生成证书签名请求 (Certificate Signing Request, CSR)。CSR 包含安全地传递到服务器所需的所有信息。
如果只希望检查客户机是否拥有您颁发的有效证书,无需对任何信息进行编码。当客户机向服务器提供其证书时,服务器将根据 CA 对该证书进行确认,验证该客户机证书是否由您生成。但是,SSL 需要 CSR 的 subject。如果不需要将任何其他信息传递到服务器,只需将 subject 设置为颁发证书的国家/地区。例如,可以将 subject 设置为 C=US。
比较好的做法是将客户机的用户名编码到证书中,从而允许服务器标识客户机。用户名是您向其授予对系统信息库的访问权限的用户的名称。可以将 CN 用于此目的。为此 CSR 指定标签,以便您可以找到并提取最终证书的密钥(如提取证书密钥中所述)。
使用以下命令生成 CSR:
$ pktool gencsr subject="C=US,CN=username" label=label format=pem \ outcsr=cert.csr
使用以下 OpenSSL 命令检查文件 cert.csr 中的 CSR:
$ openssl req -text -in cert.csr
CSR 必须经过 CA 的签名才能创建证书。要对 CSR 进行签名,请提供以下信息:
将证书的 issuer 设置为使用 gencert 命令创建 CA 时用于 subject 的相同字符串,如创建客户机证书的证书颁发机构中所述。
设置十六进制序列号。在此示例中,CA 序列号被指定为 0x01,因此应为第一个客户机证书提供序列号 0x02。对生成的每个新客户机证书递增序列号。
每个 CA 及其子孙客户机证书都具有其自己的序列号集。如果在密钥库中配置了多个 CA,请小心地正确设置客户机证书序列号。
将 signkey 设置为密钥库中的 CA 的标签。
将 outcert 设置为证书文件的名称。比较好的做法是在要访问的系统信息库后指定证书和密钥。
使用以下命令对 CSR 进行签名:
$ pktool signcsr signkey=CAlabel csr=cert.csr \ serial=0x02 outcert=reponame.crt.pem issuer="CN=name"
在文件 reponame.crt.pem 中创建证书。使用以下 OpenSSL 命令检查证书:
$ openssl x509 -text -in reponame.crt.pem
从密钥库提取此证书的密钥。将 label 设置为在生成证书签名请求中运行 gencsr 以生成 CSR 时指定的相同标签值。使用以下命令从密钥库导出密钥:
$ pktool export objtype=key label=label outformat=pem \ outfile=reponame.key.pem
将证书和密钥传输到需要访问受 SSL 保护的系统信息库的客户机系统。
要访问受 SSL 保护的系统信息库,客户机系统必须具有证书副本和密钥,并且必须在发布者配置中指定证书和密钥。
将证书 (reponame.crt.pem) 和密钥 (reponame.key.pem) 复制到每个客户机系统。例如,可以将它们复制到每个客户机上的 /var/pkg/ssl 目录。
使用以下命令在发布者配置中指定生成的证书和密钥:
$ pkg set-publisher -k reponame.key.pem -c reponame.crt.pem \ -p https://repolocation
请注意,仅 HTTPS 系统信息库 URI 支持 SSL 验证。文件系统信息库 URI 不支持 SSL 验证。