2016-05-05 58 views
2

問題があり、どのように解決できるかわかりません。 ExtendedKeyUsage拡張子のカスタムOID(オブジェクト識別子)を持つX.509v3証明書があります。 OpenSSL 1.1.0を使用してExtendedKeyUsageからすべてのOIDを抽出するにはどうすればよいですか?OpenSSLで証明書からすべてのOIDを抽出する方法

例えば、IはextendedKeyUsageの拡張の3つのフラグを持つ証明書作成:

"clientAuth, 1.3.6.1.5.5.7.3.103, timeStamping" 

clientAuthtimeStamping OpenSSLのために知られています。真ん中のフラグは私のカスタムOIDです。 OpenSSL関数X509V3_EXT_conf_nid()ですべてのフラグを追加しました。 OK ...すべての作品に限ります。

今私はX509_get_extended_key_usage(cert)でOIDを抽出しようとしましたが、私はclientAuthtimeStampingしか得ていません。 30:1E:06:08:2B:06:01:05:05:07:03:02:06:08:2B:06:01:05:05:07:03:67:06:08:2B:06:01:05:05:07:03:08

int size; 
unsigned char *data; 
ASN1_OCTET_STRING *os; 
X509_EXTENSION *ext; 

// extracting data from certificate extension 
ext = X509_get_ext(cert, 2); 
os = X509_EXTENSION_get_data(ext); 

size = ASN1_STRING_length(os); 
data = ASN1_STRING_data(os); 

このヘクスでdataの内容です:

は今、私はこのようなASN1_OCTET_STRINGとしてextendedKeyUsageのからの生データを抽出しました。

Offset|Length|LenByte| 
======+======+=================================================== 
    0| 30|  1| SEQUENCE : 
    2|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.2' (id-kp-clientAuth) 
    12|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.103' 
    22|  8|  1|  OBJECT_IDENTIFIER : '1.3.6.1.5.5.7.3.8' (id-kp-timeStamping) 

私のOIDが利用可能ですが、私は、OpenSSLでこのOIDを抽出する方法:私は外部のツールで、この16進数文字列をデコードする場合

、その後、私はこれを取得しますか?私はそれを解析することができます....どのように? 。!:(事前に

おかげであなたを

+0

あなたは 'openssl asn1parse -i -in cert.der -inform der'を使ってみましたか? – oliv

答えて

4

私は解決策を見つける

ここに私のDIRY迅速かつコードです:

// optional: we can set an OID name 
OBJ_create("1.3.6.1.5.5.7.3.103", "myObjectShortName", "myObjectLongName"); 

// find the extendedKeyUsage 
int extIndex = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); 
if (extIndex < 0) 
    std::cerr << "extendedKeyUsage is not present"; 

// get the correct X.509 extension 
X509_EXTENSION *ext = X509_get_ext(cert, extIndex); 
if (!ext) 
    std::cerr << "'ext' is a nullptr"; 

// get the extendedKeyUsage 
EXTENDED_KEY_USAGE *eku = static_cast<EXTENDED_KEY_USAGE*>(X509V3_EXT_d2i(ext)); 
if (!eku) 
    std::cerr << "'eku' is a nullptr"; 

// print all OIDs 
for (int i = 0; i < sk_ASN1_OBJECT_num(eku); i++) 
{ 
    char buffer[100]; 
    OBJ_obj2txt(buffer, sizeof(buffer), sk_ASN1_OBJECT_value(eku, i), 1); // get OID 

    std::cout << "eku flag " << i << ": " << buffer << "\t - "; 
    std::cout << OBJ_nid2ln(OBJ_obj2nid(sk_ASN1_OBJECT_value(eku, i))) << std::endl; // get OID name 
} 

// free used resource 
if (eku) 
    EXTENDED_KEY_USAGE_free(eku); 

は出力:

eku flag 0: 1.3.6.1.5.5.7.3.2 - TLS Web Client Authentication 
eku flag 1: 1.3.6.1.5.5.7.3.103 - myObjectLongName 
eku flag 2: 1.3.6.1.5.5.7.3.8 - Time Stamping 

多分このコードは他の誰かを助ける

関連する問題