LibPKI0.1.9--FAQ
红富
2023-12-01
1.PKI_TOKEN
1.1 PKI_TOKEN
这个库介绍了PKI_TOKEN这样一个概念,PKI_TOKEN 这个对象提供了几个函数来操纵私用数据结构。
PKI_TOKEN接口提供了这样一些功能:
1)管理密钥对
2)产生新的X.509请求
3)产生自签名证书
4)颁发新证书
5)验证证书
1.2 产生新的PKI_TOKEN
要产生新的PKI_TOKEN可以使用PKI_TOKEN_new()函数来产生,例子如下:
#include <libpki/pki.h>
int main () {
PKI_TOKEN *tk = NULL;
tk = PKI_TOKEN_new();
if( tk == NULL ) {
printf("ERROR, can not generate a new PKI_TOKEN!/n");
return(1);
}
}
1.3使用PKI_TOKEN产生密钥对
要使用PKI_TOKEN产生密钥对,首先应该使用PKI_TOKEN_set_scheme() 设置token使用的算法,然后再
用 PKI_TOKEN_new_keypair()去产生新的代码,下面是例子程序:
#include <libpki/pki.h>
int main () {
PKI_TOKEN *tk = NULL;
tk = PKI_TOKEN_new();
if( tk == NULL ) {
printf("ERROR, can not generate a new PKI_TOKEN!/n");
return(1);
}
/*设置使用的算法,LibPKI支持的算法包括 PKI_SCHEME_RSA, PKI_SCHEME_DSA 和
* PKI_SCHEME_ECDSA
*/
if((PKI_TOKEN_set_scheme ( tk, PKI_SCHEME_RSA )) == PKI_ERR ) {
printf("ERROR, can not set the crypto scheme!/n");
return (1);
}
/* 现在我们开始产生新的密钥对 */
if((PKI_TOKEN_new_keypair ( tk, bits )) == PKI_ERR) {
printf("ERROR, can not generate new keypair!/n");
return (1);
}
/* 到这里所有事情都做好了 */
return(0);
}
2.底层的API
这一部分我们分析的是LibPKI中较为底层的一些API,我们强烈建议开发者在他们的应用程序里使用PKI_TOKEN接口,而非这些底层函数.下面是一个产生RSA密钥对的简单程序:
#include <libpki/pki.h>
int main (int argc, char *argv[] ) {
PKI_KEYPAIR *p = NULL;
/* 从这儿开始生成一个RSA密钥对 */
p = PKI_KEYPAIR_new( PKI_SCHEME_RSA, 4096, NULL, NULL );
/*将密钥度写入文件中*/
if(!PKI_KEYPAIR_write_file( p, PKI_FORMAT_PEM, "keypair.pem" )) {
printf("<file write error>/n");
};
return(0);
}
倘若我们要使用不同的算法来产生密钥对(现在支持RSA,DSA和ECDSA),我们只需要在函数PKI_KEYPAIR_new()的参数里使用不同的参数PKI_SCHEME_*(以PKI_SCHEME开头的一系列函数),比如下面是我们使用它来产生ECDSA密钥:
#include <libpki/pki.h>
int main (int argc, char *argv[] ) {
PKI_KEYPAIR *p = NULL;
/* 现在产生一个ECDSA 密钥对 */
p = PKI_KEYPAIR_new( PKI_SCHEME_ECDSA, 4096, NULL, NULL );
/* 我们将密钥写入文件*/
if(!PKI_KEYPAIR_write_file( p, PKI_FORMAT_PEM, "keypair.pem" )) {
printf("<file write error>/n");
};
return(0);
}
3.网址网址检索
LibPKI实现了一个功能非常强大的网址网址检索接口.通过使用这些提供的函数,应用程序可以从下面几中格式的地址里取得数据:File,MySQL,PostgreSQL,Web Server,LDAP,PKCS11 Device .
3.1获取数据
为了获取基本数据,LibPKI提供了URL_get_data()和URL_get_data_url()函数.这些函数返回一个PKI_MEM_STACK指针.有些URLs可能会返回多对象,这就是为什么参数会是一个栈.函数原型如下:
PKI_MEM_STACK * URL_get_data( char *url_string, ssize_t size )
PKI_MEM_STACK * URL_get_data_url( URL *url, ssize_t size )
参数size用来限定函数从参数URL里读取的数据大小.如果参数值为0的话,函数将对所获取数据的大小不做限制.
PKI_MEM * 这个返回堆栈可以用PKI_STACK_*(以PKI_STACK开头的一系列函数) 函数来浏览.下面是如何浏览堆栈的例子:
PKI_MEM_STACK *sk = NULL;
PKI_MEM *elem = NULL;
int i = 0;
/* Here we assume you called the URL_get_data() function
in order to fill the PKI_STACK */
for ( i = 0; i < PKI_STACK_elements( sk ); i++ ) {
elem = PKI_STACK_get_num( sk, i );
printf("Got Element %d - size is %d/n");
}
3.2支持的URL类型
LibPKI定义了不通类型的URL来访问不同的数据源.通用的格式如下:
[协议://][用户[:密码]@地址[:端口]][/路径]
不同类型的URL有特定的方法来解析URL从而获取需要的选项.下面是不同URL类型的例子和解释:
file-用来访问本地文件系统的一个文件.如果没有指出URL的协议的话,默认为file://
http-用来访问网络服务器的资源(使用HTTP GET方法)
ldap-用来访问目录服务器的资源(LDAPv3)
mysql-用来访问MySQL服务器存储的资源
pg-用来访问PostgreSQL服务器存储的资源
pkcs11-用来访问PKCS#11设备的资源
英文地址:https://mm.cs.dartmouth.edu/wiki/index.php/Main_Page