【问题标题】:How do you add a subjectNameAlt extension to X509_REQ?如何将 subjectNameAlt 扩展添加到 X509_REQ?
【发布时间】:2013-04-12 06:36:30
【问题描述】:

我正在创建一个将由我的服务器处理的 CSR。它需要设置 subjectNameAlt 以便服务器可以处理它。我进行了广泛的搜索,只发现如何使用普通的 X509 证书而不是 X509_REQ。我该如何做到这一点(使用 C 和 OpenSSL。即,我需要 X509_get_ext_d2i 但对于 X509_REQ)?

【问题讨论】:

    标签: c openssl x509


    【解决方案1】:

    以编程方式

    查看 OpenSSL 附带的 demos/x509/mkreq.c 文件。它会创建一个请求并添加一个电子邮件地址作为替代名称。剥离它执行以下操作:

    exts = sk_X509_EXTENSION_new_null();
    add_ext(exts, NID_subject_alt_name, "email:steve@openssl.org");
    X509_REQ_add_extensions(x, exts);
    sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
    

    add_ext 是这样实现的:

    int add_ext(STACK_OF(X509_EXTENSION) *sk, int nid, char *value) {
      X509_EXTENSION *ex;
      ex = X509V3_EXT_conf_nid(NULL, NULL, nid, value);
      if (!ex)
        return 0;
      sk_X509_EXTENSION_push(sk, ex);
      return 1;
    }
    

    从命令行

    尽管 OP 请求了 API,但我将这部分留给其他人。

    https://wiki.cacert.org/FAQ/subjectAltName 建议将openssl.cnf 文件复制到一个临时的openssl-san.cnf 文件中,然后像这样进行编辑:

    [req]
    req_extensions = v3_req
    
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = host1.yourdomain.tld
    DNS.2 = host2.yourdomain.tld
    

    【讨论】:

    • 我想通过 c 来实现,而不是通过 shell 或文件系统。
    • 太棒了!我已经找了好几个小时了!
    • 我们如何以编程方式使用 c 添加像 in[alt_names] 这样的多值扩展?
    • 我发现您无法添加任意数据作为主题替代名称。我在您的示例中看到您使用“电子邮件:...”。我发现在“DNS:”前面加上我想使用的值对我有用。否则 X509V3_EXT_conf_nid() 只是返回 null。
    • X509V3_EXT_conf_nid 函数仅适用于某些扩展的 NULL 上下文。其他扩展需要 x509 上下文才能生成数据。
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2013-09-19
    相关资源
    最近更新 更多