■ OpenSSLのd2i_RSAPublicKey関数の戻り値がNULLの件
<環境>
WindowsXP
OpenSSLバージョン1.0.0a
VC2005
<現象>
OpenSSLのライブラリ関数 d2i_RSAPublicKey関数を使用して、RSA構造体に公開鍵要素を取得
したいのですが、NULLが返ってきてしまいます。(入力は、公開鍵)
ERR_error_string(ERR_get_error(), NULL); 関数でエラーを確認したところ、
『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
と表示されます。
以下に、手順を追って、実行したことを書きます。
何が悪いのか、ご指摘いただきたいです。
(PEM形式は使用しない前提です。)
[鍵ペア生成(DER方式)]
まず、DOS窓を立ち上げて、下記のようにDERフォーマットの
RSA鍵ペアを作成しました。
openssl genrsa -out pri_test.der 2048
openssl rsa -in pri_test.pem -outform DER -out pri_test.der
openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der
秘密鍵:pri_test.der
公開鍵:pub_test.der
[公開鍵の読み込み と d2i_RSAPublicKey関数のコール]
公開鍵:pub_test.der を、VCの入力ファイルに入力し、
d2i_RSAPublicKey関数をコールしました。
// file read
/* 入力ファイルを開く */
FILE* file_p;
RSA* rsa;
unsigned char buff[1024];
unsigned char* pbuff;
file_p = "pub_test.der", "rb");
if( NULL == pF_pubca ) {
return -1;
}
// fileサイズを調べます(省略します)
filesize = 0x126;
// fileをバッファへ読み込みます
memset( buff, 0, sizeof(buff) );
fread( buff, 1, filesize, file_p );
// buff には公開鍵pub_test.derの値 と サイズ分、
// 全て正常に格納されている事を確認済みです
// ダブルポインタを作るために、ポインタバッファに渡します。
pBuff = pubca_buff;
// d2i_RSAPublicKey関数をコールし、RSA構造体に公開鍵要素を取得します。
rsa = d2i_RSAPublicKey( NULL, &pBuff, filesize );
// ↑ここで、rsa構造体にはNULLが格納されています。
// エラーのログを出力します。
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
// ⇒ 『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
// と表示されてしまいます。
<備考>
同様の方法で、入力を秘密鍵に設定し、d2i_RSAPrivateKey関数であれば、
正常にRSA構造体に各要素が格納されます。
何か、公開鍵をRSA構造体に格納するために、別の方法があるのでしょうか。
No.2ベストアンサー
- 回答日時:
正しいのかどうか…に関しては不明ですが……
>openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der
で公開鍵を作成する特に、「-pubout」ではなく「-RSAPublicKey_out」として出力したpub_test.derならば、d2i_RSAPublicKey()は通るようです。
……そんなオプション知らねぇよ…って感じですが、opensslのソースから検索するとあったりします。
-puboutだと「i2d_RSA_PUBKEY_bio()」で出力、-RSAPublicKey_outだと「i2d_RSAPublicKey_bio()」で出力…となっています。
……d2i_RSA_PUBKEY()だったら通るのではないでしょうか??
この回答への補足
ご回答ありがとうございます。
そもそも、d2i_RSA_PUBKEY関数の存在すら知りませんでした。
まずは、d2i_RSA_PUBKEY関数を使用してみます。
それで無理であれば、「-RSAPublicKey_out」オプション(初めて見ました...)
で作成してみて、d2i_RSAPublicKey関数を使用して読み込んで見ます。
ありがとうございます。
無事に読込むことができました。
ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを
使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
公開鍵要素を表示させようとしても、表示できませんでした。
------------エラーログ---------------
>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout
unable to load Public Key
23916:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:.\crypto\a
sn1\tasn_dec.c:1319:
23916:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:.
\crypto\asn1\tasn_dec.c:381:Type=X509_ALGOR
23916:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1
error:.\crypto\asn1\tasn_dec.c:751:Field=algor, Type=X509_PUBKEY
------------エラーログ---------------
但し、d2i_RSAPublicKey関数で読み込むと、正しい値が読込まれています。
# ここで正しい値とは、
# 「-pubout」で出力した公開鍵を、上記のOpenSSLコマンドを使って表示させた値と、
# 同じ値を取得できているという意味です。
奥が深すぎです...。
私のほうで「-RSAPublicKey_out」オプションを付けたりして、
どうにかコマンドで出力させようとしてみたのですが、全く出来ませんでした。
もし、何か方法があるのであればご教授頂きたいです^^;
No.3
- 回答日時:
>ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを
>使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
>公開鍵要素を表示させようとしても、表示できませんでした。
>>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout
openssl rsa -inform DER -RSAPublicKey_in -in temp_pub.der -text -noout
でどうでしょう?
# opensslのソース、apps\rsa.c内で判定しています。
出来ました!
-pubin と -RSAPublicKey は混在できないんですね。
Wr5さんのように、私もソースコードから解析するようにします。
このたび、誠にありがとうございました。
No.1
- 回答日時:
回答には結びつきませんが……
>file_p = "pub_test.der", "rb");
>if( NULL == pF_pubca ) {
突然出てくる「pF_pubca」はなにものですか?
# 直前のfile_pのエラーチェックではないのですか?
>filesize = 0x126;
同じく、突然出てくるこの変数はなにものですか?
# long型の変数…でしょうかね……。
>pBuff = pubca_buff;
同じく、この2つはなにものですか?
pbuff = buff;
なんじゃないですか?
コピペミスると検証も厳しくなるので注意した方がよろしいかと。
この回答への補足
全てご指摘のとおりです。
書き直そうとしたのですが、投稿後、修正できませんでした。
「質問者は回答できません」と出てきてしまいました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.out.printlnの出力先
-
System.out.printlnの意味がよ...
-
Apache POI のログについて
-
system.out.printが出力されない
-
1~100までの数字を表示したい
-
Javaで改行などが出来ないのです。
-
VBAでEUC-JPのHTMLソースを取得...
-
1~100までの数字を表示し、か...
-
javaのUDP受信プログラムについて
-
VBSエラー"オブジェクト型の変...
-
Javaの問題なのですが、 永久ル...
-
OpenSSL関数エラーについて
-
JavaのswingでCardLayoutの画面...
-
無名配列の作成方法について質問
-
VBAで配列の計算
-
2次元配列のコピー
-
パソコンキーボードで時分秒を...
-
ボタンの複数割り当てについて
-
nullcline
-
Javaのコマンドライン引数を使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
1~100までの数字を表示したい
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
JavaScriptの変数をjavaのメソ...
-
数字文字列をパック10進数に変...
-
tomcatのstdout.logを停止したい。
-
java ファイル操作について
-
InputStreamはreadが1回しかで...
-
switch分が機能しません。
-
VBAでEUC-JPのHTMLソースを取得...
-
テキストエリアで改行する
-
VBSエラー"オブジェクト型の変...
-
Tomcatが無応答となる現象が起...
-
JAVAのServletで、画像表示につ...
おすすめ情報