首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向OpenSSL pkcs8密钥添加可选属性

向OpenSSL pkcs8密钥添加可选属性
EN

Stack Overflow用户
提问于 2019-11-02 10:54:58
回答 1查看 232关注 0票数 1

根据rfc5208,https://www.rfc-editor.org/rfc/rfc5208#page-3,pkcs8密钥可以有可选的属性。

如何使用这些可选属性生成RSA密钥?我只看到了openssl genpkey pkeyopt的选项,我可以指定像rsa_keygen_bits:2048这样的东西来设置密钥大小,但是如果我想做一些事情,比如为与那个私钥相关的名称添加一个可选属性,我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2019-11-05 13:35:45

你不能用命令行来做这件事,这可能是幸运的,因为这不是一个编程问题,因此也不是真正适合这样做的主题。下面是一个最小的编程示例:

代码语言:javascript
复制
/* SO58667890 19nov04 PKCS8 attribute */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/asn1.h>
#include <openssl/err.h>
#include <openssl/objects.h>
#include <openssl/pem.h>
#include <openssl/pkcs12.h>
#include <openssl/x509.h>

void err (const char * s, int n){ fprintf(stderr, "%s:%d\n", s,n); ERR_print_errors_fp (stderr); exit(1); }

int main (int argc, char** argv){
  if( argc < 4 ){ fprintf(stderr, "Usage: %s privkey.pem attrname attrvalue\n"); return 0; }
  int rv;

  BIO *bio = BIO_new_file (argv[1],"r");
  if( !bio ) err("BIO_new_file-r",0);
  EVP_PKEY *pkey = PEM_read_bio_PrivateKey (bio, NULL, NULL,NULL);
  if( !pkey ) err("PEM_read_bio_PrivateKey",0);
  PKCS8_PRIV_KEY_INFO *p8inf = EVP_PKEY2PKCS8 (pkey);
  if( !p8inf ) err("EVP_PKEY2PKCS8",0);

  int nid = OBJ_txt2nid (argv[2]);
  if( nid == NID_undef ) err("OBJ_txt2nid",nid); 

#if OPENSSL_VERSION_NUMBER >= 0x1010000fL 
  rv = PKCS8_pkey_add1_attr_by_NID (p8inf, nid, V_ASN1_IA5STRING, (unsigned char*)argv[3], strlen(argv[3]));
  if( !rv ) err("PKCS8_pkey_add1_attr_by_NID",rv);
#else
  if( !X509at_add1_attr_by_NID (&p8inf->attributes, nid, V_ASN1_IA5STRING, (unsigned char*)argv[3], strlen(argv[3])) )
    err("X509at_add1_attr_by_NID",0);
#endif

  bio = BIO_new_file (argv[1],"w");
  if( !bio ) err("BIO_new_file-w",0);
  rv = PEM_write_bio_PKCS8_PRIV_KEY_INFO (bio, p8inf);
  if( !rv ) err("PEM_write_bio_PKCS8info",rv);
  rv = BIO_free(bio);
  if( !rv ) err("BIO_free",rv);

  return 0;
}

然而,正如Maarten评论的那样,这些属性很少使用。我至少见过one case here根本没有实现它们的地方。在PKI领域,包括S/MIME和SSL/TLS,您通常有一个X.509 (或PKIX)证书用于与您的私有密钥匹配的公钥,并且该证书有许多关于所有者的身份和密钥的授权使用的有用信息--这些信息是程序通常能够理解和使用的形式(尽管有时会出现这样的问题:一方或系统创建了另一方或系统不能理解的新证书扩展名)。例如,当您查看Windows certmgr或MacOS密钥链时,您看不到私钥本身;您看到的是附加了私钥的证书。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58667890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档