Linux 上的 PKCS #11 openCryptoki API -入门更新
- UID
- 1066743
|
Linux 上的 PKCS #11 openCryptoki API -入门更新
清单 31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [root@draeger /root]# /usr/lib/pkcs11/methods/pkcsconf -I -c 0
Enter the SO PIN: 87654321
Enter a unique token label: DraegerICA
[root@draeger /root]# /usr/lib/pkcs11/methods/pkcsconf -t -c 0
Token #0 Info:
Label: DraegerICA
Model: IBM ICA
Serial Number: 123
Flags: 0x45
Sessions: -1/-1
R/W Sessions: -1/-1
PIN Length: 4-8
Public Memory: 0xFFFFFFFF/0xFFFFFFFF
Private Memory: 0xFFFFFFFF/0xFFFFFFFF
Hardware Version: 1.0
Firmware Version: 1.0
Time: 11:14:17 AM
|
2. 设置安全性主管 PIN:谨慎的管理实践是让安全性主管在初始化令牌之后立即更改安全性主管 PIN。这个过程防止了未知个人再度初始化设备并除去所有已存储的对象(例如,密钥和证书)。
清单 41
2
3
4
| [root@draeger /root]# /usr/lib/pkcs11/methods/pkcsconf -P -c 0
Enter the SO PIN: 87654321
Enter the new SO PIN: fredrules
Re-enter the new SO PIN: fredrules
|
3. 设置用户 PIN(通过安全性主管)
清单 51
2
3
4
| [root@draeger /root]# /usr/lib/pkcs11/methods/pkcsconf -u -c 0
Enter the SO PIN: fredrules
Enter the new user PIN: billybob
Re-enter the new user PIN: billybob
|
4. 更改用户 PIN(通过用户)
清单 61
2
3
4
| [root@draeger /root]# /usr/lib/pkcs11/methods/pkcsconf -p -c 0
Enter user PIN: billybob
Enter the new user PIN: 12345678
Re-enter the new user PIN: 12345678
|
应用程序与 openCryptoki本节描述了如何使 openCryptoki 对于应用程序可用,并且提供了一个关于如何写此类应用程序的示例。
使 openCryptoki 对于应用程序可用许多应用程序使用 PKCS #11 令牌。这些应用程序中的大多数必须被配置装入令牌的特定共享对象(DLL)。在 openCryptoki 环境下,只有一个模块( /usr/lib/pkcs11/PKCS11_API.so )必须装入,以访问当前在子系统运行的所有令牌。子系统支持多种令牌类型,每种令牌类型依照插件模块的实现指定对应于一个槽。
如果添加或除去设备,令牌所驻留的 PKCS #11 槽将更改。因为这个原因,当令牌已被初始化并且假设指定的槽并不总是包含期望的令牌时,应用程序应该通过所提供的令牌标号找到特定令牌。
对于与 PKCS #11 开发相关的应用程序特定配置信息,参阅应用程序文档。
编写应用程序要开发使用 openCryptoki 的应用程序,您必须首先使用动态库调用装入共享对象。然后调用 C_GetFunctionList 。例如,下列例程装入共享程序库并得到后序调用的函数清单:
清单 71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| CK_FUNCTION_LIST *funcs;
int do_GetFunctionList( void )
{
CK_RV rc;
CK_RV (*pfoo)();
void *d;
char *e;
char f[]="/usr/lib/pkcs11/PKCS11_API.so";
printf("do_GetFunctionList...
");
d = dlopen(f,RTLD_NOW);
if ( d == NULL ) {
return FALSE;
}
pfoo = (CK_RV (*)())dlsym(d,"C_GetFunctionList");
if (pfoo == NULL ) {
return FALSE;
}
rc = pfoo(&funcs);
if (rc != CKR_OK) {
show_error(" C_GetFunctionList", rc );
return FALSE;
}
printf("Looks okay...
");
return TRUE;
}
|
一旦装入,应用程序必须调用 C_Initialize 函数。在前面的示例中,函数将通过下列行调用:
1
2
3
| CK_C_INITIALIZE_ARGS cinit_args;
memset(&cinit_args,0x0,sizeof(cinit_args));
funcs->C_Initialize(&cinit_args);
|
参阅 RSA Labs 网站的 PKCS #11 规范(参阅 )以获得更多选项。
注: openCryptoki 要求允许操作系统线程。如果其它线程例程被传入,将被忽略。如果 no-os 线程变量在初始化变量结构中已经设置,对 C_Initialize 的调用将会失败。
样本程序下列样本程序打印出当前在系统中使用的所有令牌和槽。如果您要构建样本程序,在该样本之后还必须包含 Makefile。
清单 8:Makefile1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| VPATH = ..
INCS = -I../. -I../../../../../include/pkcs11
CFLAGS = $(OPTLVL) $(INCS) -DAPI -DDEV -D_THREAD_SAFE -DLINUX -DDEBUG -DSPINXPL
CC = gcc
LD = gcc
LIBS = -ldl -lpthread
OBJS = sample.o
.c.o: ; $(CC) -c $(CFLAGS) -o $@ $<
all: sample
sample: $(OBJS)
${CC} ${OBJS} $(LIBS) -o $@
TARGET = sample
build: $(TARGET)
clean:
rm -f *.so *.o $(TARGET)
|
|
|
|
|
|
|