開発環境 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);
}
自己解決いたしました。
どうやら、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 ]というエラーが
出なくなりました。