pkcs11_parse_uri - 解析 PKCS#11 URI 方案
cc [flag...] file ... -lcryptoutil [library ... ]
#include <cryptoutil.h> int pkcs11_parse_uri(const char *str, pkcs11_uri_t *uri)
RFC 7512 指定 PKCS#11 统一资源标识符 (Uniform Resource Identifier, URI) 方案,用于标识 PKCS#11 令牌中存储的 PKCS#11 对象、标识 PKCS#11 库或标识 PKCS#11 令牌本身。URI 基于 PKCS#11 加密令牌接口标准中标识 PKCS#11 对象、库和令牌的方式。
pkcs11_parse_uri() 实现支持以下属性:token、manufacturer、serial、model、object、type、id 和 pin-source。有关每个属性的更多信息,请参见 RFC 7512 规范。
pin-source 查询属性指定了应用程序或库应从何处查找用户的令牌 PIN。该属性的值可以是以下值之一:
如果值为 builtin-dialog,则会提示提供 PIN,并且会从终端读取 PIN。
如果值表示 URI,则将其视为包含 PIN 的对象 (file://)。
如果值为 |<absolute-command-path>,则会从绝对路径 <absolute-command-path>(其中字符 | 表示不必使用百分号进行编码的管道)所指定的应用程序的输出读取 PIN。
PKCS#11 规范限制某些字段的长度。例如,生产商标签最多可以包含三十二个字符,PKCS#11 URI 不施加此类限制。由 PKCS#11 URI 的使用者负责执行任何必要的合理性长度检查。
以前版本的 Oracle Solaris 支持的但未在 RFC 7512 中定义的属性在此 Oracle Solaris 发行版中已过时。过时的属性包括 objecttype、manuf、pinfile 和 passphrasedialog。
空 PKCS#11 URI 对 PKCS#11 使用者来说可能很有用:
pkcs11:示例 2 标识对象
最简单也是最有用的一种形式可能就是一个 PKCS#11 URI 仅指定一个对象标签及其类型。使用的是缺省令牌,所以 URI 未指定它。请注意,当指定公共对象时,可能不需要令牌 PIN。
pkcs11:object=my-pubkey;objecttype=public
如果指定了私钥,则必须使用 pk11-pin-source 属性向应用程序提供用户的 PIN。
从文件获取 PIN:
pkcs11:object=my-key;type=private?pin-source=file:///etc/token_pin
通过 /etc/mygetpin 命令获取 PIN:
pkcs11:object=my-key;type=private?pin-source=|/etc/mygetpin
从终端获取 PIN:
pkcs11:object=my-key;type=private?pin-source=builtin-dialog
以下示例标识了软件令牌中的一个证书。请注意,除 type 以外的所有属性都可以具有空值。在本例中,serial 为空。如果不允许空值,URI 的使用者可以执行必要的检查。
请注意,id 属性值的表示法是完全的百分比编码。不必使用百分号对保留集中的 ,(逗号)进行编码,因为它不与所使用的任何子分隔符冲突。与 /(斜杠)一样,#(井号)字符也是一个常规分隔符,因此必须使用百分号对其进行编码。
pkcs11:token=The%20Software%20PKCS%2311%20softtoken; manufacturer=Snake%20Oil,%20Inc.; serial=; model=1.0; object=my-certificate; type=cert; id=%69%95%3E%5C%f4%BD%EC%91 ?pin-source=file:///etc/ssh/token_pin
可以标识单独的令牌而不指定任何 PKCS#11 对象。可能仍需要 PIN 来列出所有对象,例如:
pkcs11:token=Software%20PKCS%2311%20softtoken; manufacturer=Snake%20Oil,%20Inc. ?pin-source=file:///etc/ssh/token_pin示例 3 使用特殊字符
以下示例显示了属性值可以包含分号。在这种情况下,对它进行了百分比编码。id 属性值中也可以包含小写字符,但请注意,[RFC3986] 建议对所有百分比编码的字符使用大写十六进制数字。
pkcs11:token=My%20token%25%20created%20by%20Joe; object=my-certificate; type=cert; id=%69%95%3e%5c%f4%bd%ec%91 ?pin-source=file:///etc/ssh/token_pin
例如,如果需要包括文字 %; 子字符串,则必须对这两个字符进行转义。令牌值必须读作:
The token name with a strange substring ';
则
pkcs11:token=A%20name%20with%20a%20strange%20substring%20'%25%3B'; object=my-certificate; type=cert ?pinfile=/etc/ssh/token_pin
在下一个示例中,令牌名称中包含一个带锐音符的小 A。必须根据 UTF-8 字符编码以八位字节对其编码,然后使用百分比编码。鉴于带锐音符的小 A 是 U+225 Unicode 代码点,所以 UTF-8 十进制编码为 195 161,它的百分比编码为 %C3%A1。
pkcs11:token=Name%20with%20a%20small%20A%20with%20acute:%20%C3%A1; object=my-certificate; type=cert
有关下列属性的说明,请参见 attributes(7):
|
J.Pechanec 和 D.Moffat,"The PKCS #11 URI Scheme"(《PKCS #11 URI 方案》),RFC 7512,2015 年 4 月
Berners-Lee, T.、Fielding, R. 和 L.。Masinter,"Uniform Resource Identifier (URI): Generic Syntax"(《统一资源标识符 (Uniform Resource Identifier, URI):通用语法》),RFC 3986,STD 66,2005 年 1 月。
OASIS PKCS 11 TC,"PKCS #11 Cryptographic Token Interface Current Mechanisms Specification Version 2.40"(《PKCS #11 加密令牌接口最新机制规范版本 2.40》),2014 年 9 月。