4

X509_verify() をどのように使用できますか。私は2つの証明書を持っています。最初の証明書は、次の証明書 (私の証明書) に署名したルート証明書です。したがって、C++ で x509_verify() を使用して、証明書がルート証明書によって署名されているかどうかを確認したいと思います。私の目標は、コードをシンプルで理解しやすいものにして、オンラインにも掲載できるようにすることです。

4

3 に答える 3

12

X509_verify の署名は

 int X509_verify(X509 * x509, EVP_PKEY * pkey);

root にルート証明書があり、mycert に証明書があるとします。

   X509 * root;
   X509 * mycert;

//Get root certificate into root
//Get mycert into mycert.

//Get the public key.
EVP_PKEY * pubkey = X509_get_pubkey(root);

//verify. result less than or 0 means not verified or some error.
int result = X509_verify(mycert, pubkey);

//free the public key.
EVP_PKEY_free(pubkey);

これはあなたを助けると思います。

于 2013-05-10T05:09:10.450 に答える
4

使い方はdbasicさんとバラムルガンさんが答えてくれたと思います。取得したエラーを解釈する方法を次に示します。エラー処理は、ビジネス ロジックよりもはるかに重要であることがわかりました。問題のない環境で動作するコードは、ほぼすべての人がコピー アンド ペーストできるからです。失敗、壊れた/悪い入力、敵対的な環境にどのように対応するかがより重要です.

関数のソース コードは次の<openssl dir>/crypto/x509/x_all.cとおりです。

int X509_verify(X509 *a, EVP_PKEY *r)
    {
    return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
        a->signature,a->cert_info,r));
    }

ASN1_item_verifyで定義された ID <openssl dir>/crypto/asn1/a_verify.c:

int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *alg,
        ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey)
    {
        ...
    }

この関数は、次のエラー コードのいずれかで失敗した場合、-1 を返します。

  • ERR_R_PASSED_NULL_PARAMETERもしそうpkeyならNULL
  • ASN1_R_UNKNOWN_SIGNATURE_ALGORITHMalgOID ルックアップを使用して不明な場合
  • ASN1_R_WRONG_PUBLIC_KEY_TYPEpkeyタイプが一致しない場合pkey->method
  • ERR_R_MALLOC_FAILUREバッファ割り当てが失敗した場合

この関数は、次のエラー コードのいずれかで失敗した場合は 0 を返します。

  • ERR_R_EVP_LIBEVP_DigestVerifyInit失敗した場合
  • ERR_R_EVP_LIBEVP_DigestVerifyUpdate失敗した場合
  • ERR_R_EVP_LIBEVP_DigestVerifyFinal失敗した場合

成功すると、関数は 1 を返します (220 行目あたりから)。

    ...
    if (EVP_DigestVerifyFinal(&ctx,signature->data,
            (size_t)signature->length) <= 0)
        {
        ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
        ret=0;
        goto err;
        }

    ret=1;

err:
    EVP_MD_CTX_cleanup(&ctx);
    return(ret);

    } /* End of function */

から<openssl dir>/crypto/err/err.h、 を使用ERR_get_error()してエラー コードを取得します。

err.h:#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__)
于 2014-03-08T05:56:08.880 に答える
3

ステップ 1 : 証明書を読み取り、証明書を X509 構造に変換します // 以下は、ファイル (DER または PEM エンコード) から証明書を読み取る方法を示しています。

X509* oCertificate=NULL;
FILE *lFp=NULL;
lFp=fopen(iFilePath.c_str(),"rb");  // iFilepath is the string 
if(lFp==NULL)
{
    oCertificate=NULL;      
}
else
{
    oCertificate = PEM_read_X509(lFp, NULL, NULL, NULL);
            if (oCertificate  == NULL )
            {
              //Certificate may be DER encode 
             oCertificate = d2i_X509_fp(lFp, NULL);
            }    
    fclose(lFp);
}
// OCertificate contains

ステップ 2: ルート証明書キーを読み取ります (使用前に X509 が NULL であるかどうかを確認してください)。

ステップ 3 : X509_verify() 関数を使用します。

于 2013-06-19T05:25:28.273 に答える