2014-12-06 99 views
4

如果我有一個0123ssopenssl提供了我,那麼找出RSA公鑰的位的最佳方法是什麼?證書?我無法弄清楚這一點。我敢肯定,如果我在SSL證書驗證回調的時候,我可以得到X509 PTR與Openssl如何找出在X509證書中公鑰的位大小是多少

X509 * cert = X509_STORE_CTX_get_current_cert(the_x509_store_ctx); 

,我會猜測我得到這樣

EVP_PKEY *public_key = X509_get_pubkey(cert); 

公鑰和那麼我需要檢查它是否是RSA,據推測?

if (public_key && (EVP_PKEY_RSA == public_key->type)) 

,一旦我知道我有一個公鑰回來,它的RSA,我想這樣做:

int key_length = BN_num_bits(public_key->pkey.rsa->n); 

,但我發現,雖然這個工程相當不錯的openssl 0.9.8,在1.0.1h它在Windows上segfaults。 BIGNUM'n'似乎不是有效的 - 其中的數據ptr有一個垃圾指針。

任何想法有什麼不對?

+0

只是一個想法:你可以使用'EVP_PKEY_get1_RSA'然後'RSA_size' ?您可能還想檢查是否需要'RSA_free'。你也可以嘗試使用OpensSL郵件列表 - 可能是一個bug ... – 2014-12-06 11:28:42

+0

也許一個失敗代碼的副本會很好....你說你假裝做什麼,但不是你實際上在做什麼。 – 2014-12-08 09:52:58

+0

@owlstead:看起來這是做這件事的正確方法。作爲回答發佈,我會相應地標記它。 – 2014-12-09 00:07:14

回答

6

前面已經提出,讓字節的RSA模數尺寸(所以不是「位大小」 ......)使用方法:

EVP_PKEY * public_key = X509_get_pubkey(cert); 
RSA *rsa_key = EVP_PKEY_get1_RSA(public_key); 
int key_length = RSA_size(rsa_key); 
... 
RSA_free(rsa_key); 
+2

不要忘記通過callint''RSA_free'''釋放'''RSA *'''! – 2015-06-29 16:08:02

+0

補充說,建議,謝謝 – 2016-06-30 14:16:53

+0

也不要忘了添加'EVP_PKEY_free(public_key);'釋放公鑰上的引用計數。 – bradfordrg 2017-06-07 06:34:44