当前位置: 首页 > 工具软件 > LibPKI > 使用案例 >

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
 类似资料:

相关阅读

相关文章

相关问答