OpenSSL関数エラーについて

このQ&Aのポイント
  • OpenSSLのd2i_RSAPublicKey関数を使用して公開鍵要素を取得したいが、NULLが返ってきてしまうエラーが発生しています。
  • 公開鍵の読み込みとd2i_RSAPublicKey関数のコールを行っていますが、取得したRSA構造体にはNULLが格納されています。
  • 公開鍵をRSA構造体に格納するための別の方法があるのかどうかについて、ご質問です。
回答を見る
  • ベストアンサー

OpenSSL関数エラーについて

■ 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構造体に格納するために、別の方法があるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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()だったら通るのではないでしょうか??

darkness22
質問者

お礼

ありがとうございます。 無事に読込むことができました。 ただ一点気になる事がありまして、“-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」オプションを付けたりして、 どうにかコマンドで出力させようとしてみたのですが、全く出来ませんでした。 もし、何か方法があるのであればご教授頂きたいです^^;

darkness22
質問者

補足

ご回答ありがとうございます。 そもそも、d2i_RSA_PUBKEY関数の存在すら知りませんでした。 まずは、d2i_RSA_PUBKEY関数を使用してみます。 それで無理であれば、「-RSAPublicKey_out」オプション(初めて見ました...) で作成してみて、d2i_RSAPublicKey関数を使用して読み込んで見ます。

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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内で判定しています。

darkness22
質問者

お礼

出来ました! -pubin と -RSAPublicKey は混在できないんですね。 Wr5さんのように、私もソースコードから解析するようにします。 このたび、誠にありがとうございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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; なんじゃないですか? コピペミスると検証も厳しくなるので注意した方がよろしいかと。

darkness22
質問者

補足

全てご指摘のとおりです。 書き直そうとしたのですが、投稿後、修正できませんでした。 「質問者は回答できません」と出てきてしまいました。 ありがとうございます。

関連するQ&A

  • openssl関数

    <?php $dn = array( 'countryName' => 'JP' ,'stateOrProvinceName' => 'Tokyo' ,'localityName' => 'Shibuyaku' ,'organizationName' => 'HOGE' ,'organizationalUnitName' => 'hogehoge' ,'commonName' => 'example.com' ,'emailAddress' => 'hoge@example.com' ); $pkeypass = '1234'; $numofdays = 365; $pkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $pkey); $sscert = openssl_csr_sign($csr, null, $pkey, $numofdays); $publickey = null; $privatekey = null; $csrStr = null; openssl_x509_export($sscert, $publickey); openssl_pkey_export($pkey,$privatekey,$pkeypass); openssl_csr_export($csr, $csrStr); echo $publickey; // 公開鍵 echo $privatekey; // 秘密鍵 echo $csrStr; // CSR 上記のプログラムで生成される公開鍵と秘密鍵は乱数的に生成されているのでしょうか? あと $pkeypass = '1234'; と echo $csrStr; の部分がどういった理由で記述されているのかイマイチわかりません。。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • OpenSSLでOPENSSL_Applinkが見つからない。

    WindowsXPでOpenSSL(ver 0.9.8.h)を使用したDLLを作成しています。 PEMファイルを読み込むためにPEM_read_RSA_PUBKEY、PEM_read_RSAPrivateKeyを使用したいのですが、PEM_readRSA_PUBKEY、PEM_read_RSAPrivateKey部分で、 OEPNSSL_Uplink(04847010,05):no OPENSSL_Applinkというエラーが出てしまいます。 通常プロジェクトですとうまくいくのですが、DLLにしてExcelVBAで動作させると上のエラーが発生してしまいます。 エラー箇所だと思われるソースコード(uplink.c)を見ると applink=(void**(*)())GetProcAddress(h,"OPENSSL_Applink"); if (applink==NULL) { apphandle=(HMODULE)-1; _tcscpy (msg+len,_T("no OPENSSL_Applink")); break; } の箇所でapplinkがNULLのためエラーになってしまっているようです。 作成したDLLをコマンド[dumpbin /EXPORTS 自作DLL]で見ると実行させたい関数と、OPENSSL_Applink関数が表示されます。 (序数ではなく、_OPENSSL_Applinkで表示されます。) 原因がわかる方いらっしゃいますでしょうか? よろしくお願い致します。 OS:WindowsXP OpenSSL:0.9.8.h Excel:2002

  • OpenSSLについて。実行できません。

    C言語でOpenSSLを利用したいと考えております。 こちら(http://x68000.q-e-d.net/~68user/net/rsa-1.html)のrsa-1.cをコンパイルし、 rsa-1 のように実行、または こちら(http://blogs.itmedia.co.jp/komata/2011/02/caesopensslmcry.html)のaesencrypt.cをコンパイルし、 aesencrypt 1234567890123456 "This is a test." のように実行すると 「問題が発生したため、rsa-1.exe を終了します。 ご不便をおかけして申し訳ありません。」というウィンドウが表示され、実行が停止されてしまいます。 単に扱っている情報量が大きすぎるせいでメモリ容量が足りないだけでしょうか? もし他に原因があれば教えて頂きたいです。 どうぞよろしくお願い致します。

  • sshでパスワードなしにする方法(サーバ)

    リモートのコンピュータ(windows2003server)にクライアント(HU-UX)からsshを利用して自動実行したいのですが、どうしてもパスワードを聞かれてしまいます。 クライアント側 # ssh -v OpenSSH_3.7, SSH protocols 1.5/2.0, OpenSSL 0.9.7c 30 Sep 2003 サーバ側 C:\Documents and Settings\Administrator>ssh -v OpenSSH_3.8.1p1, OpenSSL 0.9.7d 17 Mar 2004 手順は クライアント側 # ssh-keygen -t rsa1 下記が作成される 秘密鍵: ~/.ssh/id_dsa 公開鍵: ~/.ssh/id_dsa.pub id_dsa.pubをリモート側の~/.sshに転送する。 リモート側 id_dsa.pubをauthorized_keysに追加する。 以上です。

  • VCのincludeについて

    現在、opensslをダウンロードして、 opensslの関数を使おうとしています。 環境:VC2005 その際、以下のinclude部に対してエラーが出ます。 ------------------------------------------------ #include <openssl/rsa.h> fatal error C1083: include ファイルを開けません。'openssl/rsa.h': No such file or directory ------------------------------------------------ この、エラーは、”openssl”文字列が ”opensslのincludeフォルダのパス”に変換されていない というエラーだとわかるのですが、どのようにしたら 設定できるのでしょうか?

  • OpenSSLのPEMファイル入出力時の強制終了

    こんにちは。 現在WindowsXP環境にてOpenSSL(ver0.9.8.h)を使用したDLL(C言語)の作成を行っています。 そこでlibeay32.dll、libssl32.dllをsystem32に配置し、VC++を使用してDLL作成のプロジェクトでPEMファイルを読み込む関数を作成しました。 その関数の中で、PEM_write_RSA_PUBKEY、PEM_read_RSA_PUBKEY等を実行すると異常終了してしまいます。(エラーが表示されず、強制終了します。) そこで通常のプロジェクトで同じように作成し、実行しても駄目でした。 ですが、ファイル出力ではなく、stdout(コンソール)だとうまくいくのでよくわかりません。 どなたか原因のわかる方はいらっしゃいますでしょうか? OS:WindowsXP OpenSSL:0.9.8.h

  • SSHの公開鍵について

    お世話になっております。 現在3台のサーバA,B,Cがあり、AのサーバからB,Cにパスワードなしでログインできるようにするため、 AのサーバでSSHの公開鍵と秘密鍵を作成しました。(パスフレーズはnull) 具体的な手順は以下になります。 ------------------------------------------------------------------------------------------- 1. Aサーバにて公開鍵と秘密鍵を作成 A # ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (//.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in //.ssh/id_rsa. Your public key has been saved in //.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx root@A 2. 秘密鍵、公開鍵が作成されていることを確認 A # ls ~/.ssh id_rsa id_rsa.pub known_hosts 3. 公開鍵をBとCサーバへ配信 A # scp ~/.ssh/id_rsa.pub root@B:/tmp Password: id_rsa.pub 100% |***************************************| 223 00:00 4. BとCサーバ側で公開鍵の登録 B # cat /tmp/id_rsa.pub > ~/.ssh/authorized_keys ------------------------------------------------------------------------------------------- 登録後、AサーバからB,CサーバにSSHで接続してみたのですが、一見パスワードなしでログインできているようでした。 ただ、何故か B,Cサーバや無関係なDサーバからもAサーバへパスワードなしでアクセスできてしまいます。 公開鍵を登録したのはB,Cサーバのみで、B,CサーバからAサーバに対してパスワードなしでアクセスできないはずという認識です。 更に、数日後AサーバからB,Cサーバに接続を試みたところ、以下のメッセージが出力されました。 ------------------------------------------------------------------------------------------- ホスト 'B (1.1.1.1)' の認証を確立できません. RSA 鍵フィンガープリントは xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx です 本当に接続を継続してもよろしいですか (yes/no)? ------------------------------------------------------------------------------------------- 公開鍵はBサーバ初回接続時にknown_hostsへ登録済みで、Bサーバ側のIPアドレスの変更なども実施していません。 SSHの仕様で、公開鍵が数日で変更されるのでしょうか? 上記について、アドバイスや問題点があればご教示いただければ幸いです。

  • sshの公開鍵認証の基本的な仕組みについて

    ネットワークセキュリティの初心者です。教えてください。 sshの認証を使用して、サーバのファイルをクライアントにコピーしようとしています。 こちらで行った手順は以下のとおりです。(クラサバ共にSolaris) クライアントにて:  ・ssh-keygen -t rsa で秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を作成。  ・scp id_rsa.pub hoge@192.168.10.10:/tmp でサーバに転送  (パスワードを入力すれば転送できた) サーバにて  ・cat /tmp/id_rsa.pub >> ~/.ssh/authorizedkeys で設定 上記にて、クライアントから scp testfile hoge@192.168.10.10:/tmpをしたところ、パスワード入力なしで無事転送することができました。 ここまではOKなのですが(前置き長くてすみません) この状態で、クライアントにて再度 ssh-keygenを実行してしまうと、またサーバのauthorizedkeysを設定しなおさなければならないのでしょうか? また、クライアントでのssh-keygen実行時に、id_rsa以外の名前で鍵を作成したときはどうなのでしょうか?(やはりサーバでの設定が必要?) そもそも鍵を作成する仕組みや鍵を管理している仕組みがわかっていれば簡単な問題かもしれませんが、どなたか教えてください。 こちらでは安易にテストする環境がないため、宜しくお願いします。

  • SSH通信で秘密鍵の読み込みが失敗

    ●質問の主旨 クライアントコンピューターとサーバー間で SSH通信を行いたいと考えています。 公開鍵暗号方式でSSHサーバーに対して、 クライアントコンピュータからリモート接続を行おうとして クライアントのTeraTermを使って秘密鍵でアクセスしようとしたところ、 「SSH2秘密鍵の読み込みに失敗しました」という添付画像のような メッセージが出ます。 このメッセージ出されることなく、クライアント~サーバー間で SSH通信を行うためには、どこをチェックすればよいでしょうか? ご存知の方がいらっしゃいましたら、ご教示願います。 ●質問の補足 現在の状況は以下の通りです。 1.クライアントのTeraTermで秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を作成 2.秘密鍵(id_rsa)はクライアントのCドライブのRSAという任意の名前のフォルダに保存 3. 公開鍵(id_rsa.pub)はSFTPでサーバーの一般ユーザのホームディレクトリに転送 4. 一般ユーザのホームディレクトリ配下に/.ssh/authorized_keysディレクトリを追加 (cat id_rsa.pub > /home/user/.ssh/authorized_keys) 5.chmodコマンドで.ssh及び.ssh/authorized_keysのアクセス権を変更 6.cat authorized_keysで中身を見ると、 公開鍵(id_rsa.pub)の文字の羅列が並んでいる ●環境 上記で言う、クライアントコンピュータはWindows8を使用しています SSHサーバーは、CentOS6.0をディストリビューションとするLinuxを使用しています

  • DLLファイルの暗黙的リンクについて

    環境:WindowsXP VC2005 OpenSSLのRSA構造体を暗黙的リンクしようとしているのですが、 やり方がわかりません。 OpenSSLの関数群で、RSA構造体が使用されているのですが、 RSA構造体をdllimport出来ないので、失敗してしまいます。 [フォーマット] (例)main.c int main(void) { __declspec(dllimport) RSA* 関数名(引数); ※RSA構造体をdllimportしていないため、エラーが発生。 } 構造体をdllimportする方法をご存知の方がいらっしゃいましたら、 お願いします。

専門家に質問してみよう