2014-03-25 132 views
3

我想以编程方式生成仅包含使用openssl的公钥的证书。从证书中提取公共证书

所以我基本上需要做以下事情,但使用代码。

openssl x509 -in certificate.crt -pubkey 

挖了一点,似乎我需要创建一个新的证书,并复制除私钥以外的所有信息。

X509 * pNewKey = X509_new(); 
... Copy all the needed information ... 

PEM_write_bio_X509(bioKey, &pNewKey, NULL, NULL); 

有人有更好的方法吗?

+0

“从证书中提取公共证书” - 您的意思是写公钥吗?或者是其他东西? – jww

回答

4

我想以编程方式生成包含只有公钥

要设置公钥的证书,把你的公钥EVP_PKEY格式,并呼吁X509_set_pubkey。建立在你的示例代码:

X509* x509 = X509_new(); 
EVP_PKEY* pkey = /***/; 

int rc = X509_set_pubkey(x509, pkey); 
ASSERT(rc == 1); 

BIO* bio = BIO_new_file("filename.txt", "w"); 
ASSERT(bio != NULL); 

rc = PEM_write_bio_X509(bio, x509, NULL, NULL); 
ASSERT(rc == 1); 

... 
BIO_free(bio); 
EVP_PKEY_free(pkey); 
X509_free(x509); 

为了完整起见,OpenSSL的将保存的证书,没有属性,没有版本,不公钥,也没有签名。


所以我基本上需要做以下,但使用的代码。

OpenSSL的X​​509 -in certificate.crt -pubkey

OK,这是一个不同的问题。上述命令将打印公钥。

使用x509_get_pubkey

EVP_PKEY* pkey = X509_get_pubkey(X509* x509); 

一旦你的EVP_PKEY,你可以得到的类型。您需要提供此功能,因为OpenSSL的不提供它:

int EVP_PKEY_get_type(EVP_PKEY *pkey) 
{ 
    AC_ASSERT(pkey); 
    if (!pkey) 
     return NID_undef; 

    return EVP_PKEY_type(pkey->type); 
} 

然后,根据不同的类型,你可以打印键:

if(type == EVP_PKEY_RSA || type == EVP_PKEY_RSA2) 
{ 
    RSA* rsa = EVP_PKEY_get1_RSA(pkey); 
    RSA_print_fp(stdout, rsa, 0); 
    RSA_free(rsa); 
} 
... 

你必须打破按类型键和然后分别拨打XXX_print_fp,因为OpenSSL不提供EVP_PKEY_print_fp

get1 in EVP_PKEY_get1_RSA表示该键上的引用计数被碰撞。所以你必须打电话给*_free。 A get0确实不是碰到引用计数,并且不需要调用*_free