68user's page 掲示板

Prev< No. 3845〜3875> Next  [最新発言に戻る] [過去ログ一覧]
No. 3845 # ニッタン 2004/07/10 (土) 02:28:05
OpenSSLを使ってC言語でHttpClientを実装する方法を参考にさせて頂きました。
ですがサンプル通りでは、SSL_connect()で-1が返ってきます。
ずっと調べてまして、乱数を作成する時の種を設定しないと行けないみたいです。
それもある程度の長さの種じゃないと駄目なようです。(私の環境では32以上)
今、自宅なのでOpenSSLのバージョンはどれなのか判りませんが、
SSL_connect()するまでに以下の関数のどれかを使うと良い様です。
1、RAND_load_file()
2、RAND_seed()
3、RAND_poll()
一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。
ちなみにマスタリングTCP/IP SSL/TSL編のサンプルでは1が使われてました。

できれば、「SSL/TLS でアクセスしてみよう」に追記して頂ければ、
今後同じ所で嵌る人が困らないと思います。
お忙しいと思いますが、宜しくご検討下さい。

No. 3846 # 68user 2004/07/10 (土) 03:17:59
>>3845 ニッタン
質問ですが、
    http://search.luky.org/obu/msg02180.html
    http://search.luky.org/obu/msg02181.html
と同じく、/dev/random が存在しない環境でしたか?

No. 3847 # 68user 2004/07/11 (日) 22:58:42
UNIX の部屋
      http://x68000.q-e-d.net/~68user/unix/
を更新しましたが、苦労したわりに内容はいまいちです (m4 とか)。

あと、見栄えをいじりましたが、もし見づらかったら文句言ってください。

No. 3848 # bindユーザ 2004/07/12 (月) 15:04:02
ネームサーバはプライマリとセカンダリを置いて、プライマリが障害の場合セカンダリが応答しますよね。
この仕組みはどのように実現されているのでしょうか?
仮にプライマリがダウンした直後に、プライマリに問い合わせたクライアントがあったとすると、
応答待ちでしばらくするとエラーになりますよね?(自身なし)
しかし、しばらくすると、すべてのクライアントが障害のないセカンダリにのみ問い合わせるようになりますよね?(自身なし)
この間はどのくらいの時間なのでしょうか?
どこかで調整できるのでしょうか?

No. 3849 # ニッタン 2004/07/12 (月) 16:08:20
68userさん、お返事ありがとうございます。
実は、今日会社を休んだ為、OpenSSLのバージョンはまだ判っていませんが、
/dev/randomの件は、マスタリングTCP/IP SSL/TSL編には
少し紹介されてました。

結論から言いますと、多分/dev/randomは存在しない環境かと。
サンプルのソースだとOpenSSLのライブラリー部分で、
/dev/randomに標準でアクセスしに行く様になっているでしたら
現状のサンプルのままでも問題ないかと思います。
(でも一文位あったら親切だな〜っと思ったりもします。お忙しいと思いますが)

プロキシー接続だったので、過去ログではプロキシーでしか検索していませんでした。
結局、プロキシー云々は関係なかったですが。

No. 3850 # 68user 2004/07/12 (月) 18:41:13
>>3848 bindユーザ
> プライマリが障害の場合セカンダリが応答しますよね。
これは誤りで、セカンダリは常にリクエスト・レスポンスの送受信を
しています。

> 仮にプライマリがダウンした直後に、プライマリに
> 問い合わせたクライアントがあったとすると、
タイムアウトすると即座にセカンダリにリクエストを投げると思います。

> すべてのクライアントが障害のないセカンダリにのみ
> 問い合わせるようになりますよね?
ならないです。プライマリにもアクセスし続けます。

以上はキャッシュサーバについての説明です。

通常のマシンはキャッシュサーバにアクセスするだけで、コンテンツ
サーバ (プライマリ DNS サーバやセカンダリ DNS サーバ) に直接
アクセスすることはない、ということに注意してください。

とか言いつつ、わたしは DNS サーバの運営をしたことがないので、
嘘をついているかもしれません。
    http://dns.qmail.jp/server/
をご一読ください。


>>3849 ニッタン
ソースが不十分であることは認識していますので、直します。

# ついでにエラーメッセージの出力が不十分なので、これも
# 直します。

ただ、なぜ RAND_load_file()/RAND_seed()/RAND_poll() しなければ
ならないのかを正確に書きたかったので、質問させていただきました。

今気づきましたが、FAQ にも書いてありますね。
      http://www.openssl.org/support/faq.html#USER1

1週間ほど時間をください。

No. 3851 # hash 2004/07/12 (月) 22:16:23
>>3847 68user
チェックボタンをonにする、ラベル用途のJavaScriptでエラーが出ます。
数年前からだと思うのですが…

私は、Windows2K & ie6ユーザーです。

No. 3852 # 68user 2004/07/12 (月) 22:41:35
>>3851 hash
ありがとうございます。丸一年気づいていませんでした。
さきほど修正しました。

どうでもいいんですが、こういう用途に使える label 要素
ってのがあることをつい先日知りました。

http://tohoho.wakusei.ne.jp/html/label.htm

No. 3853 # 68user 2004/07/12 (月) 23:51:24
この掲示板の全文検索 (namazu.cgi) ですが、問題が発生したため
再び休止します。

No. 3854 # tototo [E-mail] 2004/07/13 (火) 09:33:12
お聞きしたいのですが、
Linuxでのbashシェルを使った
環境変数PATHの順番を変更するやり方を教えてください。

No. 3855 # 68user 2004/07/13 (火) 12:33:21
>>3854 tototo
お望みの PATH をそのまま設定する方が自然だと思われます。
どうしても「順番の変更」でなくてはならない理由はありますか?

No. 3856 # ニッタン 2004/07/13 (火) 13:02:44
68userさん、
お忙しいとは思いますが、よろしくお願い致します。
とっても有益な情報が沢山載っているので、
今後も役立つと思いますので、頑張ってください。

私の方でももう一度、調べてみましたが
RAND_poll()が、自動的に呼ばれる様になっていますね。
(FAQにもそれらしい事が書いてあるような気もしますね。)
私の使っている環境に移植してきた担当者が
RAND_poll()を空関数に実装し直していました。
出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。

No. 3857 # つばき [E-mail] 2004/07/13 (火) 14:44:25
はじめまして。大学生をやっていますつばきです。
Unixのコマンドの意味でわからないことがありました。
学校の課題で「ftp」と「rcp」の違いを説明せよ、というものがありまして、
こちらのサイトでコマンドを検索してみたのですが、
「ftp」はファイルを置いてくる/持ってくる、「rcp」はファイルをコピーする、という説明が出てきました。
この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
具体的な違いは何なのでしょうか。
できれば、でよろしいのでご回答お願いします。

No. 3858 # 68user 2004/07/13 (火) 15:09:09
>>3856 ニッタン
> 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。
了解です。

>>3857 つばき
> この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
同じです。
    - ftp なら get するか、put するか
    - rcp なら rcp ./file host: するか rcp host:file . するか
の違いです。

わたしの思う大きな違いは Anounymous ftp という仕組みでファイルを
配布できるのが ftp、そうでないのが rcp。

後は些細な違いしかないと思いますが、それでも 10 や 20 はあげられる
かと思います。課題ということなのでいろいろ調べてみてください。

No. 3859 # samsara 2004/07/13 (火) 15:57:04
はじめまして、ネットワークプログラミングの勉強をしています。
Windows上でネットワーク関連のソフトウェアを作成したことはあるのですが、
ライブラリを使用していた為、SocketAPI等はあまり深い知識がありません。
そこで教えていただきたい事があるのですが、ここの掲示板でよろしいでしょうか?

1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?

参考情報等教えていただきたいと思ってます。宜しくお願い致します。

No. 3860 # tototo 2004/07/13 (火) 16:51:20
順番変更しなければならない理由はないのですが、
PATHの順番を変更するやり方
はあるのかが気になったのため、お聞きしました。

No. 3861 # 68user 2004/07/13 (火) 21:46:58
>>3859 samsara
> 1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/bsd-compatibility.html など。

> 2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?
たとえば
    http://x68000.q-e-d.net/~68user/net/echo-3.html#6
の backlog とか、UDP で受信できる最大サイズを超えた場合の
処理などですかね。より詳しいことを知りたいなら
    http://x68000.q-e-d.net/~68user/net/link-book.html
        「UNIX ネットワークプログラミング第2版 Vol.1」
をどうぞ。後は
    http://apr.apache.org/
などのライブラリのソースの #if 部分をとことん読む、などなど。

>>3860 tototo
> PATHの順番を変更するやり方
    PATH=`echo $PATH | sed 's@/usr/bin:@@'`':/usr/bin'
とか
    for i in `echo $PATH | tr ':' ' '`; do
          いろいろ
    done
とかですかねぇ。

No. 3862 # 68user 2004/07/13 (火) 22:24:51
ここ数ヶ月 (web 引越し前)、マルチポストしたり回答しても返事すら
書かない質問者が多く、困っていました。困るだけならまぁいいんですが、
わたしの web 更新のモチベーションを大いに下げてくれました。

というわけで、↑に書いたとおり、
      http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse
を読まない・読んでも守りたくない人は質問しないでください。
もちろん、これらのルールを守っておられる方々の質問は引き続き
歓迎いたします。

これはマナーではなく、この掲示板のルールであることに注意して
下さい。これが気にいらない方は (当然ながら) この掲示板を見ない
自由があります。

web 引越し後は以前のような不届きな質問者はいなくなったようで、
とてもうれしく思っています。

No. 3863 # samsara 2004/07/13 (火) 23:01:52
68userさま、回答ありがとうございます。
教えていただいたページをじっくり読んでみます。

No. 3864 # 68user 2004/07/14 (水) 02:36:01
>>3845 ニッタン
自分用のメモ。ソースが
    SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method());
    SSL ssl = SSL_new(ctx);
    SSL_connect(ssl);
となっていたとして、

      SSL_CTX *SSL_CTX_new(SSL_METHOD *meth){
            ret->method=meth;

      SSL_METHOD *SSLv23_client_method(void){
            SSLv23_client_data.ssl_connect=ssl23_connect;

      int ssl23_connect(SSL *s)
            ret=ssl23_client_hello(s);

      static int ssl23_client_hello(SSL *s)
            RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);

      int RAND_pseudo_bytes(unsigned char *buf, int num)
            const RAND_METHOD *meth = RAND_get_rand_method();
            return meth->pseudorand(buf,num); /* (*1) */

      const RAND_METHOD *RAND_get_rand_method(void)
            default_RAND_meth = RAND_SSLeay(); /* (*2) */
            return default_RAND_meth;

      static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num){
            ret = RAND_bytes(buf, num);

      static int ssleay_rand_bytes(unsigned char *buf, int num)
            if (ok){
                  ...
            } else {
                  RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

ときて「PRNG not seeded」エラーになる、てな感じですかね。


(*1)
      RAND_METHOD rand_ssleay_meth={
            ssleay_rand_seed,
            ssleay_rand_bytes,
            ssleay_rand_cleanup,
            ssleay_rand_add,
            ssleay_rand_pseudo_bytes,
            ssleay_rand_status
      };

      typedef struct rand_meth_st {
            void (*seed)(const void *buf, int num);
            int (*bytes)(unsigned char *buf, int num);
            void (*cleanup)(void);
            void (*add)(const void *buf, int num, double entropy);
            int (*pseudorand)(unsigned char *buf, int num);
            int (*status)(void);
                } RAND_METHOD;
(*2)
      RAND_METHOD *RAND_SSLeay(void)
            return(&rand_ssleay_meth);

No. 3865 # つばき [E-mail] 2004/07/14 (水) 10:40:53
68user様。回答ありがとうございました。
自分なりに調べまして解決しました。助言を下さってありがとうございます。

No. 3866 # 2004/07/14 (水) 11:17:29
To UNIXの部屋管理者様
もしかすると変なことを行ってるかもしれませんが。
cp -r の項目で以下の解説が有りますが。

-R ディレクトリを再帰的にコピーする
ディレクトリ dir1 以下に、ファイル foo・bar があった場合、
% cp -R dir1 dir2
は、ディレクトリ dir2 の下にディレクトリ dir 1をコピーする。つまり
dir2/dir1/foo、dir2/dir1/foo <<<<<<<<<の二項目はdir2/dir1/barではないでしょうか
というファイルが新たに作成される。一方、
% cp -R dir1/ dir2
とすると(`/'を付けると)、dir2 の下に dir1 以下のファイル・ディレクトリをコピーする。つまり
dir2/foo、dir2/foo <<<<<<<<<同様にの二項目はdir2/barではないでしょうか
というファイルができる。

No. 3867 # ニッタン 2004/07/14 (水) 12:18:27
68userさん、はいそうです。
ここまで調べるのは苦労しませんでしたか?
私はマスタリングTCP/IP SSL/TLS編がなければ
未だに判らなかったと思います。

No. 3868 # jeiu 2004/07/14 (水) 17:44:12
ただいまSLL勉強中です。このHPも参考にさせて頂いています。
つまらない質問ですが初心者の至りということでお許しください。
ネットワークプログラミングの基礎知識 >> RSA で暗号化してみよう (1)に
暗号化のサンプルがありますが、これらの作業はOpenSSLのライブラリの中で
行われている事なのでしょうか。
たとえば、ネットワークプログラミングの基礎知識 >> SSL/TLS でアクセスしてみよう (1)
には暗号化の記述はありませんが実際には指定したプロトコルで暗号化が行われている
と思います。どこで実装されるものなのでしょうか?

No. 3869 # 68user 2004/07/14 (水) 23:15:03
>>3866
ご指摘のとおりかと思います。というわけで、修正しました。
      http://X68000.q-e-d.net/~68user/unix/pickup?cp
ありがとうございました。

>>3867 ニッタン
> ここまで調べるのは苦労しませんでしたか?
調べるのに 3日かかってますので、苦労しました。

でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません (別にこれがわからなくても構わないんですが、
気になるもので)。

>>3868 jeiu
> どこで実装されるものなのでしょうか?
OpenSSL のライブラリの中です。

SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
提示し、サーバがその中から選びます。よって常に RSA が使用される
わけではありません (DH を使う場合もある)。

で、暗号スイートを提示したり、RSA で暗号化・復号化したり、
DH で鍵交換したり、プレマスターシークレットを送ったり、
ということはすべて OpenSSL のライブラリ中で記述されています。

No. 3870 # ニッタン 2004/07/15 (木) 22:09:01
>調べるのに 3日かかってますので、苦労しました。

でしたら、やはりお持ちのマスタリングTCP/IP SSL/TLS編を
辞書的に使いながら追いかける方がいいかもしれませんよ。

>でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません

結局、RAND_poll()内で乱数の種をプロセスIDや/dev/randomなどを使って作成して
RAND_add()しているからだと思います。
RAND_seed()も結局、RAND_add()をしていますし。

No. 3871 # 68user 2004/07/16 (金) 02:33:49
>>3870 ニッタン
/dev/random や /dev/urandom がない環境ではエラーになるが、
RAND_poll() を呼ぶとうまくいくと。

ということはおそらく RAND_poll() を呼ぶと
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7348.html#145
に処理が移ると思います。

# このソースは OpenSSL 0.9.7d です。

ここでは /dev/random や /dev/urandom を読んでいろいろやって
ますが、/dev/random や /dev/urandom がない環境なので、結局は

    unsigned long l;

    l=curr_pid;
    RAND_add(&l,sizeof(l),0);
    l=getuid();
    RAND_add(&l,sizeof(l),0);
    l=time(NULL);
    RAND_add(&l,sizeof(l),0);

だけが実行されると思います。ここで 第三引数の entropy には全て 0 を
渡しています。

RAND_add を呼ぶと ssleay_rand_add が呼ばれ、
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7341.html#190
が実行されます。

    if (ok)
        return(1);
    else
        RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

とあるのがエラーになっている箇所かと思います。つまり RAND_poll() を
呼ぶと ok が真になり、RAND_poll() を呼ばないと偽になる、と。ここで
ok とは何かというと

    ok = (entropy >= ENTROPY_NEEDED);

です。ENTROPY_NEEDED は

    ./crypto/rand/rand_lcl.h:#define ENTROPY_NEEDED 32 /* require 256 bits = 32 bytes of randomness */

なので、entropy <= 32 なときに RPNG_NOT_SEEDED でエラーになる。
逆に言えば、RAND_poll() を呼ぶと entropy >= 32 になるためうまく
いくようになる、ということです。しかし entropy を増やしているのは

    entropy += add;

しかないような気がします。でも、add は RAND_add() の第三引数で、
今回はすべて 0 が渡されています。よって、

    entropy += 0;

となるわけです。それなのになぜ entropy が増えて >=32 になるのか
わからないなぁ、といったところで止まっています。

「マスタリングTCP/IP SSL/TLS編」は調べましたが、内部構造には
触れていようで見つけられませんでした。もしどこかに載っていたら
教えてください。

No. 3872 # 68user 2004/07/16 (金) 02:58:19
>>3872 68user
続きです。

こちらには /dev/random・/dev/urandom が存在しない環境がないため、
FreeBSD で OpenSSL のソースをいじって、無理矢理 /dev/random・
/dev/urandom が存在しない状況を作ってみました。その結果、
    PRNG not seeded
なエラーが発生しました。

しかし SSL_connect() の直前に RAND_poll() を挿入しても、同じく
PRNG not seeded となりました。そこで確認させていただきたいのですが、

>>3845 ニッタン
> SSL_connect()するまでに以下の関数のどれかを使うと良い様です。
> 3、RAND_poll()
> 一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。
はそちらの環境では正常に動作しているのですよね?

No. 3873 # jeiu 2004/07/16 (金) 11:57:50
回答ありがとうございます。
もうひとつ教えてください。

>SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
>提示し、サーバがその中から選びます。よって常に RSA が使用される
>わけではありません (DH を使う場合もある)。

クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?

たとえば、SSL V2に対応したアプリケーションとかV3に対応した
アプリケーションとかで決まることなのでしょうか?
または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。

No. 3874 # 68user 2004/07/16 (金) 12:41:39
>>3873 jeiu
> クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?
クライアント作成者が勝手に決めます。例えば 3DES と RC4 はいいけど
DES は暗号強度が気に入らないから使わないとか、MD5 より強固な SHA-1 を
使うとか。

OpenSSL であれば SSL_CTX_set_cipher_list() を使って好きな暗号
スイートをセットすればよいでしょう。

暗号スイートは具体的には
      http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt

    TLS_RSA_WITH_3DES_EDE_CBC_SHA
    TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
などを指します。

上記 RFC の ClientHello がクライアントからの暗号スイートの提示、
ServerHello がサーバからの暗号スイート決定通知、です。

> または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
これは意味がわかりませんでした。

No. 3875 # ニッタン 2004/07/16 (金) 12:48:04
誤解を招くような書き方をしてしまいました。
申し訳ありません。
まず、RAND_poll()はRAND_byte()やRAND_status()の始めての呼び出しの際に
一度だけ呼ばれていると思われます。
RAND_poll()内では/dev/random・/dev/urandomを使用して
乱数の種を作っています。

/dev/random・/dev/urandomが存在しない環境でも
上記の様にRAND_poll()は呼ばれていますが、
No.3871の通り
乱数の種は作られません。
そこで、RAND_poll()を自前で呼び出しても同じ結果になります。

つまり、RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDEDのエラーが
発生した時は
RAND_poll()で乱数の種を作成するのに失敗しているので、
自前で乱数の種を作らないといけない
と言った説明を追記して頂ければいいと思います。

自前で乱数の種を作るのが
1、RAND_load_file()

2、RAND_seed()
と言う訳です。

貴重な時間を割かせてしまいまして、申し訳ありませんでした。

Prev< No. 3845〜3875> Next  [最新発言に戻る] [過去ログ一覧]