- 論壇徽章:
- 0
|
讓我們先來看一下pem.h頭文件中的定義:
#define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u)
#define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u)
#define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u)
#define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u)
對應的很工整是不是,你生成一個私鑰,然后用它生成一個公鑰。
openssl genrsa -out private.pem 1024
openssl rsa -in priv.pem -pubout -out public.pem
用任何一種方法打開私鑰,讀取私鑰信息,得到RSA,查看RSA,ok,沒有問題,一切都還看起來比較正常。
然后用任何一種方法打開公鑰,讀取公鑰信息,問題出現(xiàn)了:RSA對象為空,你失敗了。
通過openssl的手冊和幫助,你會發(fā)現(xiàn)兩個函數(shù):
PEM_read_bio_RSA_PUBKEY()
PEM_read_RSA_PUBKEY()
他們才是你要找的對應的,而上面兩個函數(shù)是從任何.h里面找不到的,但是他們的確是真實存在的符號連接,在對應的.o文件中用objdump可以查看到他們的符號,很詭異!
現(xiàn)象描述完了,還未探其究竟。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/1574/showart_2035483.html |
|