5

openssl を使用して X509 証明書を解析しています。拡張子を取得することはできますが、拡張子の値を抽出する方法がわかりません。

私が使用しているコードは次のとおりです。

  X509_EXTENSION *extension =  sk_X509_EXTENSION_pop(exts);
  int critical =  X509_EXTENSION_get_critical(extension);

  ASN1_OBJECT *obj = extension-> object;
  ln = OBJ_nid2ln(OBJ_obj2nid(obj));
  if( !ln ) ln = "";
  OBJ_obj2txt(objbuf,sizeof(objbuf),obj,1);
  int nid = OBJ_txt2nid(ln);  

このコードは、拡張機能が重要かどうかを示し、拡張機能の nid を提供します。

値は次の方法で取得できると思います。

ASN1_OCTET_STRING *data= X509_EXTENSION_get_data(拡張子);

しかし、取得したdataオブジェクトを処理する方法がわかりません。データオブジェクトは逆エンコードされているはずです。拡張データを取得する方法について何か考えはありますか?

編集:ここで提案されているように、私はやろうとしていました:

ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension);
const unsigned char* octet_str_data = octet_str->data;
long xlen;
int tag, xclass;
int ret = ASN1_get_object(&octet_str_data, &xlen, &tag, &xclass, octet_str->length);
printf(@"value: %s\n", octet_str_data);

しかし、デコード後に取得する文字列は、デコード前と同じです-次のようなものです:4Á˃◊∫Ns∑äP∂W≠%£A

4

3 に答える 3

1

テキスト表現が必要な場合は、メモリ BIO を使用できます。このスレッドのキー使用法拡張機能については、この方法に回答しましたが、その方法はすべての拡張機能で同じです。

よろしく。

于 2012-04-13T15:57:16.337 に答える
1

私があなたの立場なら、専用の ASN.1 ライブラリの 1 つを使用して証明書をデコードすることを真剣に検討します。OpenSSL が得意とすることは、信頼チェーンに対して証明書を検証することです。適切な証明書を持っていることがわかったら、それを ASN.1 ライブラリに渡し、残りを処理させます。(SNACC は良さそうです。) 証明書全体が ASN.1 でエンコードされているため、v3 拡張機能の処理に使用するのと同じライブラリを証明書全体の処理に使用できることに注意してください。

于 2012-04-09T22:36:38.760 に答える
1

これは非常に興味深いです。私はあなたが提供したリンクとここで会話が発生するのを見てきました.Roger Dahlの回答の正誤表のコメントに同意します:

x509v3 拡張機能の情報を抽出する方法に関する一般的な解決策を探しているようです。この質問のタイトルが示すように、単一のOCTET STRING. それを超えて、SNACClibtasn1などの外部ASN.1パーサーを使用し、OpenSSLソースコード(crypto/asn1/asn1_par.cの周り: 135)。

(リンクの追加は私のものです。)

トリックは、一般的にうまく処理されないモーダル拡張モデルを操作しようとしていることです。この回答は、それがどのように機能するかについての良い概要を提供します。残りの回答については、ドキュメントが失敗した場合、ソースを読むことが正直なところ最善の解決策であるという彼の観察に同意します。

于 2012-04-09T19:30:24.363 に答える