1

x509v3 証明書を解析しようとしています。サブジェクトの別名の URI フィールドを除いて、必要なすべての部分を取得する方法をまとめました。次のコードがあります。テスト証明書の作成に使用する構成ファイル内のサブジェクトの代替名フィールドを変更すると、カウント、SA、およびタイプの出力に適切な変更が加えられているため、SA URI の正しい領域を読み取っているように見えます。ただし、私の SA 出力は常に「1」として出力されるため、URI フィールドに名前があるため、正しい構造体メンバーではないようです。

証明書テキスト出力から (openssl コマンド経由):

X509v3 Subject Alternative Name: 
URI:ThisIsTheUri, email:foo@bar.com

コード:

GENERAL_NAMES* subjectAltNames =
               (GENERAL_NAMES*)X509_get_ext_d2i(&certificate, NID_subject_alt_name, NULL, NULL);

boost::int32_t altNameCount = sk_GENERAL_NAME_num(subjectAltNames);
std::cout << "Alt Name Count: " << altNameCount << "." << std::endl;
for (boost::int32_t i = 0; i < altNameCount; ++i)
{
  GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
  if (generalName->type == GEN_URI)
  {
    subjectAltName = std::string(reinterpret_cast<char*>(generalName->d.ia5->data));
    // subjectAltName should be "ThisIsTheUri", but is "1".
    std::cout << "SA: '" << subjectAltName << "'." << std::endl;
  }
  else
  {
    std::cout << "Type: '" << generalName->type << "'." << std::endl;
  }
}
4

1 に答える 1

2

トリックは、ASN1_STRING_data() と ASN1_STRING_length() を使用して ia5 文字列を抽出することです。

std::string(reinterpret_cast<char*>(ASN1_STRING_data(generalName->d.uniformResourceIdentifier)),
            ASN1_STRING_length(generalName->d.uniformResourceIdentifier));
于 2012-11-01T20:29:57.630 に答える