OpenSSLを用いたRSAのプログラミングでエラー

[戻る]
たにし 2007/10/27(土) 20:24:50
開発環境 WindowsXP(Pro) VC++2005(Pro)

コンパイル済みのOpenSSLライブラリをダウンロードし、
VC++2005の設定にもOpenSSLのディレクトリを追加しました。
Webで見つけたサンプルソースを元にして、次のようなソースになりました。
(元のサンプルソースと、ほとんどかわりませんが)

公開カギ暗号方式(RSA)の公開カギと秘密カギを
PEM形式で書き出すというプログラムです。

つぎの3つの関数に入ったとたん、
OpenSSLがエラーを標準出力に吐き出してしまいます。
RSA_print_fp()、PEM_write_RSAPublicKey()、PEM_write_RSAPrivateKey()

エラー内容は「PENSSL_Uplink(100E1010,07): no OPENSSL_Applink」です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OpenSSLの公式サイトに気になる文章が載っていました。
http://www.openssl.org/support/faq.html#PROG2
これを参考にし、プロジェクトの設定→コード生成→ランタイムライブラリを/MDにし、
ソースに#include <openssl/applink.c>を追加したのですが、
あいかわらずエラーがでてしまい、PEMファイルが作成されません。

アドバイスよろしくお願い致します。



#include <stdio.h>
#include <string.h>
#include <openssl/applink.c>
#include <openssl/rsa.h>
#include <openssl/engine.h>
#include <openssl/pem.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")

static void printError(char *msg, unsigned long err);

int main(int argc, char *argv[])
{
OpenSSL_add_all_algorithms();
  int size = 1024;
  unsigned long expornent = 65537;
  FILE *privateKeyFile;
  FILE *publicKeyFile;

  if(argc != 3)
    {
      fprintf(stderr,
              "Usage : %s privateKeyFile publicKeyFile\n", argv[0]);
      exit(-1);
    }
  else
    {
      privateKeyFile = fopen(argv[1], "w");
      if (privateKeyFile == NULL)
        {
          perror("failed to fopen");
          exit(-1);
        }

      publicKeyFile = fopen(argv[2], "w");
      if (publicKeyFile == NULL)
        {
          perror("failed to fopen");
          exit(-1);
        }
    }

  // キーペアの作成
  RSA *rsaKey = RSA_generate_key(size, expornent, NULL, NULL);
  if (rsaKey == NULL)
    {
      printError("failed to RSA_generate_key",ERR_get_error());
      exit(-1);
    }

  if(RSA_print_fp(stdout, rsaKey, 0) != 1)
    {
      printError("failed to RSA_print_fp",ERR_get_error());
      exit(-1);
    }

  // 公開鍵をPEM形式で書き出し
  if(PEM_write_RSAPublicKey(publicKeyFile, rsaKey) != 1)
    {
      printError("failed to PEM_write_RSAPublicKey",ERR_get_error());
      exit(-1);
    }

  // 秘密鍵をPEM形式で書き出し
  if(PEM_write_RSAPrivateKey(privateKeyFile, rsaKey,
                             NULL,
                             NULL, 0,
                             NULL, NULL) != 1)
    {
      printError("failed to PEM_write_RSAPrivateKey",ERR_get_error());
      exit(-1);
    }

  // 領域の開放
  RSA_free(rsaKey);

  fclose(privateKeyFile);
  fclose(publicKeyFile);

  return 0;
}

static void printError(char *msg, unsigned long err)
{
  char *errmsg = ERR_error_string(err, NULL);
  fprintf(stderr, "%s(%s)\n",
          msg,
          errmsg);
}

たにし 2007/10/28(日) 10:13:25
[[解決]]
自己解決いたしました。
どうやら、Windows用のOpenSSLのバイナリを使っていなかったことが原因でした。

解決・設定方法を書いておきます。

1.以下のサイトで、Windows用OpenSSLバイナリをダウンロード。
    http://www.slproweb.com/products/Win32OpenSSL.html

2.ダウンロードしたexeファイルによりインストール
  ここではインストール先を[C:\OpenSSL]にしたとする。

3.VC2005の[ツール]→[オプション]
  →[プロジェクトおよびソリューション]→[インクルードファイル]
  →[C:\OpenSSL\includes]を追加。

4.ソースコードに次の3行を記述。
    #include <openssl/applink.c>

    #pragma comment(lib, "libeay32.lib")
    #pragma comment(lib, "ssleay32.lib")



これで[ OPENSSL_Uplink(100E1010,07): no OPENSSL_Applink ]というエラーが
出なくなりました。

古いスレッドには追加発言できません。