- PR -

OpenSSL SSL_CTX_use_certificate_fileでエラー発生

1
投稿者投稿内容
主婦
会議室デビュー日: 2006/08/29
投稿数: 15
投稿日時: 2006-11-22 15:59
こんにちわ、いつも勉強させて頂いています。

現在組み込み系のSSL対応を担当しているのですが、ポート443のコネクションを作成する部分で落ちてしまいます。

ソースを追っかけてゆくと、SSL_CTX_use_certificate_fileでエラーが帰ってきています。

ERR_print_errors_fpでエラーログを確認したところOpenSSLの中のbss_file.cの中で証明書の読み込み(fopen)で落ちていることが判明しました。

SSL_CTX_use_certificate_file関数はサーバー証明書をロードする関数なので、読み込みで落ちていることに納得がゆきません。

SSL_CTX_newでctxの取得は正常に行っていて、SSL_CTX_use_certificate_fileの第一引数にはSSL_CTX_newで取得したctx、第二引数にはサーバー証明書(server.crt)、第三引数にはSSL_FILETYPE_PEMを指定しています。

fopen('server.crt','r') で落ちている理由をご存知の方ご指南いただけますか?

よろしくお願いいたします。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-11-23 00:24
引用:

主婦さんの書き込み (2006-11-22 15:59) より:

SSL_CTX_newでctxの取得は正常に行っていて、SSL_CTX_use_certificate_fileの第一引数にはSSL_CTX_newで取得したctx、第二引数にはサーバー証明書(server.crt)、第三引数にはSSL_FILETYPE_PEMを指定しています。

fopen('server.crt','r') で落ちている理由をご存知の方ご指南いただけますか?




どの環境で使ってるのかが不明なのであえて聞きますが。
fopen()ってなんですか。
#この聞き方で、部下にやな顔されたな〜。
#よくfopenはfopenですって逆切れされたな。

OpenSSLで組み込みで、かつSSLサーバとして使いますか。
あまりお勧めはしない使い方ではあります。

「出来ない」とは言いませんが、OpenSSLが0.9.8(NOT 1.0)であることは
無視されているようです。

内部ではUnixの実装を想定していることが多いのが「お勧め」しない
理由です。いいのかmalloc()で、というところですか。

主婦
会議室デビュー日: 2006/08/29
投稿数: 15
投稿日時: 2006-11-30 11:40
引用:

加納正和さんの書き込み (2006-11-23 00:24) より:

どの環境で使ってるのかが不明なのであえて聞きますが。
fopen()ってなんですか。
#この聞き方で、部下にやな顔されたな〜。
#よくfopenはfopenですって逆切れされたな。

OpenSSLで組み込みで、かつSSLサーバとして使いますか。
あまりお勧めはしない使い方ではあります。

「出来ない」とは言いませんが、OpenSSLが0.9.8(NOT 1.0)であることは
無視されているようです。

内部ではUnixの実装を想定していることが多いのが「お勧め」しない
理由です。いいのかmalloc()で、というところですか。




レス遅くなってすみません。かつ環境についても記述不足でしたね。
#部下にはよく環境を説明しろと言ってるくせに・・

まず、環境から
・WinXPでOpenSSL0.9.8bをデーモンにVxWorksを立てて行っています。

fopen()ですが、サーバー証明書を解析の為に開いている(開く)関数です。
fopen()についてはこれでよろしいでしょうか?

bss_file.cの中で証明書を読み込んで解析してるようです。

現在ツールの会社に問い合わせをしているのですが、やはり組み込みでSSLサーバーという使用方法が他でも例がないようで、明確な回答が来ないで、チュートリアルが投げられてきました。(ため息)

これから英文チュートリアルとマニュアルの翻訳解析です。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-11-30 21:44
引用:

主婦さんの書き込み (2006-11-30 11:40) より:

まず、環境から
・WinXPでOpenSSL0.9.8bをデーモンにVxWorksを立てて行っています。

fopen()ですが、サーバー証明書を解析の為に開いている(開く)関数です。
fopen()についてはこれでよろしいでしょうか?



VxWorksにfopen()があるのでしょうか。open()ならあるのかもしれませんが。。。
fopen()は暗黙の了解としてファイルシステムの存在を前提としてます。

最低限、STDIOを実装している関数でないと動かないはすですが。。
VxWorksのことは良く知りませんが。

引用:

bss_file.cの中で証明書を読み込んで解析してるようです。

現在ツールの会社に問い合わせをしているのですが、やはり組み込みでSSLサーバーという使用方法が他でも例がないようで、明確な回答が来ないで、チュートリアルが投げられてきました。(ため息)

これから英文チュートリアルとマニュアルの翻訳解析です。



bss_file.cに書いてある系統の関数群は、OSにより実装が異なるはすです。
いわゆるBIOライブラリのやつは、open,read,writeを関数ポインタで
持っておいてOSごとに違うのを使うようにしてあったはずですが。

typedef struct bio_method_st
{
int type;
const char *name;
int (*bwrite)(BIO *, const char *, int);
int (*bread)(BIO *, char *, int);
int (*bputs)(BIO *, const char *);
int (*bgets)(BIO *, char *, int);
long (*ctrl)(BIO *, int, long, void *);
int (*create)(BIO *);
int (*destroy)(BIO *);
long (*callback_ctrl)(BIO *, int, bio_info_cb *);
} BIO_METHOD;

こんな様な構造体で関数ポインタを設定して、各BIO系内では
BIO_ctrlで制御しているようです。

関数ポインタはソースを追う時には、あちこち飛んでよく分からなかった
記憶があります。

BIO_new_file()は使ってはいけなかったような。。。違ったかな。
主婦
会議室デビュー日: 2006/08/29
投稿数: 15
投稿日時: 2006-12-01 09:51
引用:

加納正和さんの書き込み (2006-11-30 21:44) より:
VxWorksにfopen()があるのでしょうか。open()ならあるのかもしれませんが。。。
fopen()は暗黙の了解としてファイルシステムの存在を前提としてます。

最低限、STDIOを実装している関数でないと動かないはすですが。。



STDIOを実装、読み込み対象のファイルシステムは存在は確認しています。
読み込み対象のファイルシステムが サーバー証明書ファイル(Server.crt)になります。


引用:

bss_file.cに書いてある系統の関数群は、OSにより実装が異なるはすです。
いわゆるBIOライブラリのやつは、open,read,writeを関数ポインタで
持っておいてOSごとに違うのを使うようにしてあったはずですが。

typedef struct bio_method_st
{
int type;
const char *name;
int (*bwrite)(BIO *, const char *, int);
int (*bread)(BIO *, char *, int);
int (*bputs)(BIO *, const char *);
int (*bgets)(BIO *, char *, int);
long (*ctrl)(BIO *, int, long, void *);
int (*create)(BIO *);
int (*destroy)(BIO *);
long (*callback_ctrl)(BIO *, int, bio_info_cb *);
} BIO_METHOD;

こんな様な構造体で関数ポインタを設定して、各BIO系内では
BIO_ctrlで制御しているようです。




このようなコードにて実装されてました。
static BIO_METHOD methods_filep=
{
BIO_TYPE_FILE,
"FILE pointer",
file_write,
file_read,
file_puts,
file_gets,
file_ctrl,
file_new,
file_free,
NULL,
};


引用:

関数ポインタはソースを追う時には、あちこち飛んでよく分からなかった
記憶があります。

BIO_new_file()は使ってはいけなかったような。。。違ったかな。




飛び先は加納さんの仰るとおり、あちこち飛んでよく判らない状態です。

BIO_new_file()はしっかり使われていました。

まだ、英文マニュアル翻訳解析中でした・・・
主婦
会議室デビュー日: 2006/08/29
投稿数: 15
投稿日時: 2006-12-07 17:37
自己解決しました。

加納さんの仰るとおり、読み込みのターゲットファイルを認識していなかった為の現象でした。

ツールをいじってなんとか認識させ、ポート443を通しました。

ご指南ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)