如何将issuer name设置为x509_req类型对象

时间:2018-01-09 12:09:43

标签: c++ c++11 openssl openssl-engine

我正在尝试使用CA证书的私钥对现有的csr进行签名。所以我打算使用X509_req_sign() API。我通过读取csr文件创建了一个x509_req对象。我还从CA证书中提取了主题名称。

但我没有得到如何将发行者名称设置为x509_req对象。我发现API x509_set_issuer_name()存在,但它适用于X509类型的对象。是否还有x509_Req类型的类似API?使用CA证书私钥签署现有csr的简便方法是什么?我必须使用C ++代码完成所有这些。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

发行人名称和信息应通过颁发CA来填写,而不是由主题填写。请参考https://tools.ietf.org/html/rfc2986#page-5的CSR结构。

由于发行人名称在结构中不存在,您无法设置。您可以在https://github.com/openssl/openssl/blob/b69ae442a3b3e168d73c53dcd04bacf33eee8569/crypto/include/internal/x509_int.h

查看结构定义
/* PKCS#10 certificate request */

struct X509_req_info_st {
    ASN1_ENCODING enc;          /* cached encoding of signed part */
    ASN1_INTEGER *version;      /* version, defaults to v1(0) so can be NULL */
    X509_NAME *subject;         /* certificate request DN */
    X509_PUBKEY *pubkey;        /* public key of request */
    /*
     * Zero or more attributes.
     * NB: although attributes is a mandatory field some broken
     * encodings omit it so this may be NULL in that case.
     */
    STACK_OF(X509_ATTRIBUTE) *attributes;
};

struct X509_req_st {
    X509_REQ_INFO req_info;     /* signed certificate request data */
    X509_ALGOR sig_alg;         /* signature algorithm */
    ASN1_BIT_STRING *signature; /* signature */
    CRYPTO_REF_COUNT references;
    CRYPTO_RWLOCK *lock;
};

您可以看到请求结构中没有颁发者名称,您无法设置它。