3

私は現在、openssl ライブラリ (libcrypto) を使用して証明書を生成するアプリに取り組んでいます。ここで、既存の証明書のハッシュを取得する必要があります。

ターミナルを使用すると、次を使用してハッシュ値を生成できます

openssl x509 -hash -in cert.pem -noout

出力: 01da0e2b

これは、C のライブラリを使用してハッシュ値を生成しようとする私のコードです。

X509 *cert = NULL;
FILE *fp = fopen(currentCert.UTF8String, "r");
PEM_read_X509(fp, &cert, NULL, NULL);

long hash = X509_subject_name_hash(cert);
char *mdString = malloc(sizeof(long));
sprintf(mdString, "%lx",hash);
printf(mdString);

出力: 1817886a

しかし、実際には私の出力は別のものです。誰が私が間違っているのか考えていますか?

4

2 に答える 2

5

しかし、実際には私の出力は別のものです。誰が私が間違っているのか考えていますか?

これがOpenSSLの使用方法です...

$ cd openssl-1.0.2-src
$ grep -R X509_subject_name_hash *
apps/x509.c:                BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x));
apps/x509.c:                BIO_printf(STDout, "%08lx\n", X509_subject_name_hash_old(x));
crypto/x509/x509.h:unsigned long X509_subject_name_hash(X509 *x);
crypto/x509/x509.h:unsigned long X509_subject_name_hash_old(X509 *x);
crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash(X509 *x)
crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash_old(X509 *x)
...

次に、見てapps/x509.c

...
} else if (subject_hash == i) {
    BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x));
}
...

そして、宣言は次のようになります。

unsigned long hash = X509_subject_name_hash(cert);

それで:

fprintf(stdout, "%08lx\n", hash);

また、OpenSSL は、OpenSSL 1.0.1 前後でサブジェクト ハッシュの計算方法を変更しました。そのため、X509_subject_name_hashand がありX509_subject_name_hash_oldます。

OpenSSL 0.9.8 (Mac OS X 10 など) を使用または比較している場合は、Generate Subject Hash of X509Certificate in Java を参照してください。Java ではありますが、サブジェクト ハッシュの OpenSSL 処理について詳しく説明しています。

于 2015-05-06T03:31:56.147 に答える
3

文字列に十分なメモリを割り当てていませんが、それが問題の原因であるかどうかはわかりません。

char *mdString = malloc(sizeof(long));

文字列に4バイトを割り当てますが、明らかに8バイトとターミネータを保持する必要があるため、お勧めします

char *mdString = malloc(sizeof(long)*2 + 1);
于 2015-05-05T17:51:28.870 に答える