1

C++ コードから subjectAltName を使用して自己署名リクエストを作成しようとしています (このような動的な自己署名証明書 を実際のバージョンの OpenResty に実装しようとしていますが、subjectAltName の解決策はありません)。

C++/OpenSSL コードから SAN を設定する例をいくつか挙げてください。私はこのようなものを試しています:

    X509_EXTENSION  *ext;
    STACK_OF (X509_EXTENSION) * extlist;
    char *ext_name = "subjectAltName";
    char *ext_value = "DNS:lohsport.com";

    extlist = sk_X509_EXTENSION_new_null ();
    ext = X509V3_EXT_conf (NULL, NULL, ext_name, ext_value);
    if(ext == NULL)
    {
        *err = "Error creating subjectAltName extension";
        goto failed;
    }
    sk_X509_EXTENSION_push (extlist, ext);

    if (!X509_REQ_add_extensions (x509_req, extlist)){
        *err = "Error adding subjectAltName to the request";
        goto failed;
    }
    sk_X509_EXTENSION_pop_free (extlist, X509_EXTENSION_free);

コンパイルは成功していますが、動作しません。どんな助けにも感謝します。

更新 今、私は OpenSSL ライブラリの selfsing.c デモのように動作しようとしています:

1) CSR に拡張機能を追加する関数を定義しました。

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;
}

2) CSR を生成する関数にこのブロックを追加します。

   char Buffer[512];
    // Format the value
    sprintf (Buffer, "DNS:%s", info->common_name);
    xts = sk_X509_EXTENSION_new_null();
    add_ext(exts, NID_subject_alt_name, Buffer);

    if(X509_REQ_add_extensions(x509_req, exts) != 1) {
        *err = "X509_REQ_add_extensions() failed";
        goto failed;
    }
    sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);

コードは再び正しくコンパイルされ、証明書はその場で生成されますが、代替名はまだ機能せず、ブラウザーにエラーが表示されます。

ネット :: ERR_CERT_COMMON_NAME_INVALID

証明書の詳細に別名情報が表示されません。

SAN の問題に対して他にどのような解決策がありますか? 役立つ場合は、たとえば github ですべてのコードを提供できます。

4

2 に答える 2

1

こんにちは私はそのようなことをしました(しかし、私はあなたのようなオブジェクトでX509はなくX509_REQオブジェクトで作業しています:

static int cs_cert_set_subject_alt_name(X509 *x509_cert)
{
    char *subject_alt_name = "IP: 192.168.1.1";
    X509_EXTENSION *extension_san = NULL;
    ASN1_OCTET_STRING *subject_alt_name_ASN1 = NULL;
    int ret = -1;

    subject_alt_name_ASN1 = ASN1_OCTET_STRING_new();
    if (!subject_alt_name_ASN1) {
        goto err;
    }
    ASN1_OCTET_STRING_set(subject_alt_name_ASN1, (unsigned char*) subject_alt_name, strlen(subject_alt_name));
    if (!X509_EXTENSION_create_by_NID(&extension_san, NID_subject_alt_name, 0, subject_alt_name_ASN1)) {
        goto err;
    }
    ASN1_OCTET_STRING_free(subject_alt_name_ASN1);
    ret = X509_add_ext(x509_cert, extension_san, -1);
    if (!ret) {
        goto err;
    }
    X509_EXTENSION_free(extension_san);

err:
    if (subject_alt_name_ASN1) ASN1_OCTET_STRING_free(subject_alt_name_ASN1);
    if (extension_san) X509_EXTENSION_free(extension_san);
    return -1;
}

今のところはうまくいきましたが、既存の証明書を新しいサブジェクトの代替名で更新したい場合(新しいIPアドレスのため)、まだ問題があります。

結果を表示し、件名の代替名が作成されているかどうかを確認するには:

$ openssl x509 -text -in cert.pem 
于 2020-05-19T12:22:01.770 に答える