OpenSSLでOPENSSL_Applinkが見つからない

このQ&Aのポイント
  • 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で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

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

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

uplink.c を読んでみましたが、 おそらくは直前の GetModuleHandle(NULL) によって DLL の呼び出し元の方が関数の検索対象になっているのですね。 ここを DLL 名に変えてコンパイルし直せば大丈夫かもしれませんが……。 また、ドキュメントを検索したところ以下のようなやり取りが見つかりました。 たぶん、FILE* を引数に取る関数を避けて IO 周りを自分で実装するように、 ということだと思いますが、結構な手間が掛かると思います。 もし速度がそれほど重要な局面でなければ、 DLL からコマンドを呼び出すようにした方が楽で無難かもしれません。

参考URL:
http://archive.netbsd.se/?ml=openssl-dev&a=2005-12&t=1552483
sh_hirose
質問者

お礼

よくよく調べたらGetModuleHandle(NULL)は起動プロセスのハンドルを返すのでやはりVBAからでは無理そうでした。 DLL → EXE → DLLの形でもいけそうです。 (実際にやってないので断言はできませんが^^;) ソースを変更して再コンパイルが一番妥当だと思いました。 ありがとうございました。

sh_hirose
質問者

補足

>おそらくは直前の GetModuleHandle(NULL) によって >DLL の呼び出し元の方が関数の検索対象になっているのですね。 >ここを DLL 名に変えてコンパイルし直せば大丈夫かもしれませんが……。 ExcelVBA側でOPENSSL_Applink関数が利用できる状態(Declare Function ~)にしてみたのですが ダメだったのでやはり再コンパイルするしか無いんでしょうね^^; >また、ドキュメントを検索したところ以下のようなやり取りが見つかりました。 >たぶん、FILE* を引数に取る関数を避けて IO 周りを自分で実装するように、 >ということだと思いますが、結構な手間が掛かると思います。 あまり時間が無いので後回しにさせていただきます; >もし速度がそれほど重要な局面でなければ、 >DLL からコマンドを呼び出すようにした方が楽で無難かもしれません。 これも考えたのですが、クライアント側にOpenSSLのインストールができないため断念しました。 再コンパイルでがんばってみます。

その他の回答 (1)

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

openssl/applink.c をインクルードしてもその現象は見られますか?

sh_hirose
質問者

補足

回答ありがとうございます。 openssl/applink.cはインクルードしています。 コンソール用に作成した(__declspec(dllexport)をはずしたり)ものなら動作するんです;

関連するQ&A

  • 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

  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

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

  • 自己証明時エラー

    SSL_CTX_use_PrivateKey_file "sample.crt" failed - aborted error:0906D06C:PEM routines:PEM_read_bio:no start line opensslを使用して自己証明をおこないたいのですが、上記のようなエラーが出ます。 これは、どういう意味なのでしょうか? また、対応策を教えていた抱けたらと思います。 よろしくお願いします。

  • bcc32 GetProcAddress( )

    mydll.cpp と mymain.cpp でDLL内の関数を使うテストを しようとしたところです。 GetProcAddress( ) が失敗します。 どこを直せばいいか教えてください。 ///////// mydll.cpp #include <windows.h> extern "C" __declspec(dllexport) int MyFunc(int, int); int MyFunc(int a, int b){return( a + b );} ///////// mymain.cpp #include <windows.h> typedef int (*FUNCTYPE)(int, int); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){  HMODULE hModule;  FUNCTYPE ft;  int i;  switch(msg){  case WM_RBUTTONDOWN:   hModule = LoadLibrary("mydll.dll");   ft = (FUNCTYPE)GetProcAddress(hModule, "MyFunc");   if(ft == NULL){    //GetLastError();   }   i = (*ft)(7, 8);  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return DefWindowProc(hWnd, msg, wParam, lParam);  }  return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int){  ・・・ } ///////// コンパイル C:\bcc32 -WD mydll C:\bcc32 -W mymain mydll.obj ///////// 実行 LoadLibrary( ) は NULL 以外を返しました。 DLL_PROCESS_ATTACH は確認できました。 GetProcAddress( ) は NULL を返しました。

  • レジストリのエクスポートについて教えてください

    開発環境 :eMbedded Visual C ++ 4.0 (SP4) 動作環境OS :WindowsCE 5.0 以上の環境でレジストリのエクスポートを行いたいのですが、うまく動作しません。 「RegSaveKey()」を使用しているのですが、「RegSaveKey()」を行った時点でエラー(50)が発生しエクスポートできません。 [例] HKEY hRegKey; // レジストリキー DWORD dwDisposition; // -------------------------------- coredll.dll ロード HMODULE hModule = LoadLibrary( _T("coredll.dll") ); // -------------------------------- RegSaveKeyアドレス取得 PFN_REGSAVEKEY pfnRegSaveKey = (PFN_REGSAVEKEY)GetProcAddress( hModule, _T("RegSaveKey") ); if ( NULL == pfnRegSaveKey ) { // -------------------------------- coredll.dll アンマップ FreeLibrary( hModule ); return ; } // -------------------------------- レジストリキー オープン dwRet = RegCreateKeyEx( HKEY_LOCAL_MACHINE, L"SOFTWARE", 0, NULL, REG_OPTION_BACKUP_RESTORE, KEY_ALL_ACCESS, NULL, &hRegKey, &dwDisposition); if( dwRet == ERROR_SUCCESS ) { dwRet = pfnRegSaveKey( hRegKey, L"\\registry.reg", NULL ); } // -------------------------------- coredll.dll アンマップ FreeLibrary( hModule ); // -------------------------------- レジストリキー クローズ RegCloseKey(hRegKey); Windows CEでのレジストリ関係をいろいろ調べたのですが解決できませんでした。詳しい方、アドバイスをよろしくお願いします。

  • 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フォルダのパス”に変換されていない というエラーだとわかるのですが、どのようにしたら 設定できるのでしょうか?

  • VB6で作成したDLLをVC6で使用する方法

    VB6で作成したDLLをVC6で使用できなくて困っています。 以下にトライしたことを示します。 (1) VB6でTRUEを返すだけの関数を入れたActiveX DLLを作成 (2) VC6のLoadLibraryに成功(戻り値がNULL以外) (3) VC6のGetProcAddressに失敗(戻り値がNULL) (4) VC.NET付属のDumpbinユーティリティでは(1)で作成した関数が表示されない。 何が悪いのでしょうか。 宜しくお願いします。

  • OpenSSLの共有ライブラリ(libcrypto.so)動的リンクにつきまして

    [環境] Linux version 2.6.9-67.EL gcc version 3.4.6 (Red Hat 3.4.6-8)) 以下のように、OpenSSLの共有ライブラリlibcrypto.soをロードする プログラムを書いているのですが、 ------ #include <stdio.h> #include <dlfcn.h> #include <errno.h> void main(void) { void* hSO; hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); if( hSO == NULL ) { printf("%s\n", dlerror()); } else { // 処理 } } ------ hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); で、NULLが返って来てしまいます。 [dlerror内容] /usr/local/ssl/lib/libcrypto.so: cannot open shared object file: No such file or directory しかし、このパスには、シンボリックリンクされたlibcrypto.soファイルが存在します。 試しに、同ディレクトリにあるlibcrypto.so.0.9.8mも試しましたが、同じエラーが出力されました。 パスの指定方法に、何か行う必要があるのでしょうか。

  • AfxLoadLibrary関数で、DLLのハンドルが取得できない

    はじめまして。 タイトルの通りですが、AfxLoadLibraryを使用して、DLLのハンドルを取得しようとしています。(取得したハンドルでGetProcAddress関数を使用する為) ここで、AfxLoadLibraryの戻り値となる、ハンドルがNULL(0x0000)となってしまい、GetProcAddressによる関数ポインタの設定が行えない状況となっています。 FormatMessage関数とGetLastErrorを使用し、原因を調べたところ、「指定されたモジュールが見つかりません」というメッセージとなりました。 AfxLoadLibraryで指定しているDLLについては、Exeファイルと同じフォルダ内に存在し、かつ、名前についても間違っていません。 試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、EXE側のコーディングミスという所は考えづらいところです。 お手数ですが、他の原因に心あたりがありましたらご教唆願います。 <コーディング(一部抜粋)> ---------------------------------------------------------------- HINSTANCE m_handle_Aaa; typedef WORD (WINAPI *LPOpenAaa)(); LPOpenAaa lpOpenAaa; BOOL DllLoad(void) { // Load Dll m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll"); if(m_handle_Aaa < (HINSTANCE)HINSTANCE_ERROR) { PutLastError(); // Error Message return FALSE; } // Get Function Pointer lpOpenAaa = (LPOpenAaa)GetProcAddress( m_handle_Aaa, "OpenAaa"); if(lpOpenAaa == NULL) return FALSE; ・ ・ ・ ----------------------------------------------------------------

専門家に質問してみよう