OpenSSLのPEMファイル入出力時の問題について

このQ&Aのポイント
  • OpenSSLのPEMファイル入出力時に強制終了する問題が発生しています。
  • 関数実行時にエラーが表示されず、異常終了してしまいます。
  • ファイル出力ではなく、stdout(コンソール)での実行では問題が発生しないようです。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • norachlo
  • ベストアンサー率100% (10/10)
回答No.2

(たぶん)ソースコードには問題ないと思います。 DLL だけ以下のサイトから差し替えてみてはどうでしょうか。

参考URL:
http://www.nec.co.jp/WebOTX/module/apache1_080709.html
sh_hirose
質問者

お礼

参考URL先のDLLを使用したらうまくいきました。 ありがとうございました。

その他の回答 (1)

  • norachlo
  • ベストアンサー率100% (10/10)
回答No.1

皆目検討もつきませんが、 OpenSSL はご自分でコンパイルされたのでしょうか。 また、もし前後のソースコードを公開できるのなら、 それも解決のヒントになるかと思います。

sh_hirose
質問者

補足

回答ありがとうございます。 OpenSSLは http://www.slproweb.com/products/Win32OpenSSL.html からダウンロードしたDLLを使用しています。 ソースコード(通常のプロジェクト)は // main.c #include <stdio.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/engine.h> #include <openssl/pem.h> int main() { FILE *fp; RSA *rsa; int result; fp = fopen("C:\\publicKey", "w"); if( fp == NULL ) { printf("FILE ERROR!!"); return 1; } rsa = RSA_generate_key(2048, 65537, NULL, NULL); if (rsa == NULL) { printf("RSA ERROR!!"); fclose(fp); return 1; } result = PEM_write_RSA_PUBKEY(fp, rsa); if( result != 1 ) { printf("PEM WRITE ERROR!!"); fclose(fp); return 1; } RSA_free(rsa); fclose(fp); return 0; } // end result = PEM_write_RSA_PUBKEY(fp, rsa);の部分で強制終了してしまいます。 また、resutl = PEM_write_RSA_PUBKEY(stdout, rsa); だと正常終了します。 よろしくお願いいたします。

関連するQ&A

  • 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

  • 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(Windows版) 起動時にMSVCR71.dllエラー

    Opensslをインストールしましたが、openssl.exeを実行したとき openssl.exe-コンポーネントが見つかりません 「MSVCR71.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題が解決される場合があります。」というエラーが表示され実行できません。 OSは、WindowsXPPro インストールするためダウンロードしたファイルは、こちらの2つです。 ActivePerl-5.8.8.822-MSWin32-x86-280952.msi Win32OpenSSL-0_9_8e.exe どうしたらOpenSSLを利用できるようになるでしょうか。 ご存知の方いらっしゃいましたらご教授ください。 よろしくお願いいたします。

  • openSSLで秘密鍵ファイルエラー

    はじめまして。 Solaris10で、OpenSSLとApacheを導入し、認証ファイル作成で エラーになりました。 認証局ファイル作成(CA) cd /usr/local/ssl/misc/CA.sh -newca Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: unknown option -selfsign usage: ca args -verbose - Talk alot while doing things -config file - A config file -name arg - The particular CA definition to use -gencrl - Generate a new CRL -crldays days - Days is when the next CRL is due -crlhours hours - Hours is when the next CRL is due -startdate YYMMDDHHMMSSZ - certificate validity notBefore -enddate YYMMDDHHMMSSZ - certificate validity notAfter (overrides -days) -days arg - number of days to certify the certificate for -md arg - md to use, one of md2, md5, sha or sha1 -policy arg - The CA 'policy' to support -keyfile arg - private key file -keyform arg - private key file format (PEM or ENGINE) -key arg - key to decode the private key if it is encrypted -cert file - The CA certificate -in file - The input PEM encoded certificate request(s) -out file - Where to put the output file(s) -outdir dir - Where to put output certificates -infiles .... - The last argument, requests to process -spkac file - File contains DN and signed public key and challenge -ss_cert file - File contains a self signed cert to sign -preserveDN - Don't re-order the DN -noemailDN - Don't add the EMAIL field into certificate' subject -batch - Don't ask questions -msie_hack - msie modifications to handle all those universal strings -revoke file - Revoke a certificate (given in file) -subj arg - Use arg instead of request's subject -extensions .. - Extension section (override value in config file) -extfile file - Configuration file with X509v3 extentions to add -crlexts .. - CRL extension section (override value in config file) -engine e - use engine e, possibly a hardware device. -status serial - Shows certificate status given the serial number -updatedb - Updates db for expired certificates もしかして、上記でエラーですか? 次に、証明書署名要求ファイル作成(CSR) cd /usr/local/ssl/misc/CA.sh -newreq openssl req -in newreq.pem -text →確認したらOKでした。 openssl rsa -in newreq.pem -text 確認した所、エラーになります。 unable to load Private Key 18943:error:0906D06C:PEM routines:PEM_read_bio:no start line:/on10/build-nd/F10U8B6/usr/src/common/openssl/crypto/pem/pem_lib.c:637:Expecting: ANY PRIVATE KEY Googleで、調べているんですが、よくわかりません。 ご存知の方がいたら、教えてください。 よろしくお願いします。

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

  • DLL作成時、defファイルを使いたくない

    また質問させて下さい。 Visual Studio2005でDLLを使ったプログラムを作ろうとしています。 defファイルを利用すると、そのDLLファイルを作成できるのですが、 __declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。 なぜでしょうか? 下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に その関数を書きました。(これがダメだと思うのですが…) //●Visual Studioのプロジェクト作成で、生成される部分 // dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル // #pragma once __declspec(dllexport) void __cdecl test0(void); #ifndef __AFXWIN_H__ #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください" #endif #include "resource.h" // メイン シンボル // Cdll_test7App // このクラスの実装に関しては dll_test7.cpp を参照してください。 // class Cdll_test7App : public CWinApp { public: Cdll_test7App(); // オーバーライド public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; //■作成した関数 __declspec(dllexport) void __cdecl test0(void) { CString cs; cs="aa"; ::AfxMessageBox(cs); } 上記は、defファイルを利用するとこの関数を呼び出せます。 以上、どうぞよろしくお願い致します。

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

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

  • Runtime Error!で強制終了してしまう。

    Visual c++ Express Edition 2005のネットワーク版をインストールしてプロジェクトを作成しました。 その後、ネットワーク版をアンインストールしてVisual c++ Express Edition 2005のダウンロード版をインストールし、プロジェクトを開き、ビルドの実行を行いました。 するとRuntime Error!の ポップアップが表示されて強制終了してしまいます。 何が原因なのでしょうか。

  • VB6自身が強制終了される

    アバウトな質問になりますこと最初にお詫びします。 現在WindowsXP(SP2)+VisulaBasic(SP5)にて開発しています。 ざっとした内容はEXE形式で作成されたメニューのプログラムから複数の(メニュー単位の)DLLを呼び出して処理するシステムです。よって全てのソースがVBGにて管理されています。 そこで先日まで動いていたプログラムが急にVB6自身がアボートしてしまうようになりそれ以来、アボートばかりしてしまいます。 ちなみに別のPC(WindowsXP+VB6 SPも同様)の環境では問題なく同じソースで動作しています。ソースの問題ではないと思うのですが何が原因なのでしょうか?ちなみに現段階ではVB6の再インストールを行ないましたが結果は同じでした。VBGから対象のプロジェクトを開放しDLLで実行しても同様でした。しいて言うなら先日メモリを増設したことぐらいの環境変化なのです。解りづらく尚且つアバウトで申し訳ありませんがどなたかご存知の方がおられましたらよろしくお願いします。

  • VB6のデバッガ?強制終了?について

     お世話になります。VB6とアクセスにてデータベースを作成中、動作確認のため実行したところ、「問題が発生したためVBを終了します。」が出現、VCが立ち上がり、   「VB6-MICROSOFT C++[停止]-[混合モード] メッセージボックス出現、 「デバッグ ハンドルされていない例外は VB.EXE(VB6.DLL)にあります。OXC 0000005:Accsee Violation」  となります。   そして、そのVCを閉じると「このコマンドを実行するデバッガを停止します」となります。  懲りずに又実行するとやはり同じです。仕方が無いので、VBの別なプロジェクトを用意して、先程のプログラムを「エラーの原因と思われる箇所を除いて」コピーして実行したところ今度は問題なく動きました。  単にコードの記述間違いならその程度を示すメッセージボックスがでるだけでしたが、VC出現は初めてです。  私なりの対処法で、「別のプロジェクトにもう一度書き直す」で一応はメドがたったようですが、別の対処法があれば御教授御願いします。 また、「明確な原因」がわかるならそれもお願いします。