2

以下のコードを実装しています (コメントを参照してください)::

#include <stdio.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/rand.h>

#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")

void verifyCertificate() ;
X509 *loadCert(char*) ;
void loadToStore(char*, X509_STORE*&) ;

void verifyCertificate()
{
    int i = 0 ;
    char argv[50] = "C:\\My\\CA.pem" ;  /* Details:: Issuer = Verisign Inc & Subject = Verisign Inc
    char argv1[50] = "C:\\My\\mid1.pem" ;   /* Details:: Issuer = Thawte & Subject = Verisign Inc
    char argv2[50] = "C:\\My\\mid2.pem" ;   /* Details:: Issuer = Verisign Inc & Subject = Verisign Inc
    char argv3[50] = "C:\\My\\Signer.pem" ; /* Details:: Issuer = Verisign Inc & Subject = SignerOrganisation

    X509 *cert = loadCert(argv3);
    X509_STORE *store = X509_STORE_new();

    loadToStore(argv, store);
    loadToStore(argv1, store);
    loadToStore(argv2, store);

    X509_STORE_CTX *ctx = X509_STORE_CTX_new();

    X509_STORE_CTX_init(ctx, store, cert, NULL);

    i = X509_verify_cert(ctx);
    printf("i = %d\n", i) ; // Returns i = 0
    if (i != 1)
      printf("%s", X509_verify_cert_error_string(ctx->error));
           // Returns "Certificate Signature Failure"

    X509_STORE_CTX_cleanup(ctx);
    X509_STORE_CTX_free(ctx);
    X509_STORE_free(store);
    ctx = NULL;
    store = NULL;
}

void loadToStore(char* file, X509_STORE *&store)
{
    X509 *cert = loadCert(file);
    if (cert != NULL)
        X509_STORE_add_cert(store, cert);
    else
        printf("Can not load certificate");
}

X509 *loadCert(char* file)
{
    FILE *fp = fopen(file, "rb");
    X509 *cert = PEM_read_X509(fp, NULL, NULL, NULL);
    fclose(fp);
    return cert;
}

int main(int argc, char** argv)
{
    verifyCertificate() ;
    return 0 ;
}

含まれているすべての証明書を抽出し、ストアにロードしました。

問題:: X509_verify_cert が Zero(0) を返しています。何かアドバイスはありますか?

4

1 に答える 1

1

X509_verify_cert は、有効な証明書チェーンに対してのみ成功を返します。つまり、次の各証明書は前の証明書によって署名される必要があります (自己署名する必要がある最初の証明書を除く)。有効なチェーンがあるかどうかを判断するには、pem に関する完全な情報を提供する必要があります。しかし、あなたのコメントを考慮すると、CA.pem のサブジェクト (Verisign Inc) が mid1.pem の発行者 (Thawte) と等しくないため、CA.pem は mid1.pem に署名していないことがわかります。

于 2014-08-12T07:09:31.193 に答える