68user's page 掲示板

Prev< No. 3988〜4011> Next  [最新発言に戻る] [過去ログ一覧]
No. 3988 # 68user 2004/10/12 (火) 19:37:59
>>3987 akuro
WinSCP は知りませんが、
      http://itc.sfc.keio.ac.jp/ml/
の「2-6. 転送モードで[テキスト(T)] を選択します」という設定画面で
モード切替を行なえるように見えます。

> sshd_configを調べてみても、転送モードらしきものは見つかりませんでした。
わたしの知る限り、UNIX 的な ssh・scp は改行コード置換は行ないません。
WinSCP 独自のおせっかいな機能でしょう。

No. 3989 # akuro 2004/10/12 (火) 19:55:35
>>>3987

akuroと申します。なんども申し訳ありません。

先ほどは、改行コードを¥n→¥r変換しましたが。
¥nのままでもファイルに異常が生じるかテストしてみました所、
¥nの場合は問題なく転送できました。

No. 3990 # akuro 2004/10/12 (火) 20:07:26
>>3988 68user
返信ありがとうございます。akuroです。

問題解決いたしました。

ご指摘いただいたWinSCPの転送をバイナリにしたところ
問題なく転送できました。

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

No. 3991 # sugimoto 2004/10/14 (木) 18:28:40
sugimotoと申します。
OpenSSLとRSA暗号を調べていてここに辿りつきました。
あるユーザ様とCGIを介してデータ通信を行おうとしているのですが、ユーザ
様の指定で、データはRFC2313に準拠したRSA暗号化して送るという事になって
ます。
暗号化/復号については68user様のネットワークプログラミングの基礎を参考
に作れそうなのですが、唯一解決できない問題がありまして、ここに質問して
おります。
【問題点】
    ユーザ様から提示された仕様には暗号化キー/復号キーがそれぞれ1つしか
無い。
    RSAはモジュラスと私有指数,公開指数で暗号化/復号を行えるという理解な
のですが、ユーザ様の仕様ではモジュラスに該当する仕様が無いのです。
    RSAにおいて、このような事は可能なのでしょうか?
    例えば、opessl genrsaコマンドで作成したRSAキーなら、関数を使えば指数
とモジュラスに分割できるよ。など情報がありましたら教えて下さい。
※ユーザ様にも問い合わせ中なのですが、レスポンスの問題がありまして、
こちらにも質問した次第です。
    よろしくお願いいたします。

No. 3992 # 68user 2004/10/14 (木) 18:59:49
>>3991 sugimoto
> RSAはモジュラスと私有指数,公開指数で暗号化/復号を行えるという理解な
> のですが
そのとおりです。

> ユーザ様の仕様ではモジュラスに該当する仕様が無いのです。
これは定義の問題ではないでしょうか? 仕様にある「暗号化キー」は、
実は「モジュラスと公開指数」を意味する、ということはないですか?

# 「暗号化キー/復号キー」が具体的に何を指すのかよくわからない
# ので何ともいえないのですが。

> 例えば、opessl genrsaコマンドで作成したRSAキーなら、関数を使えば
> 指数とモジュラスに分割できるよ。など情報がありましたら教えて下さい。
genrsa で出力されるデータには、モジュラス・公開指数・非公開指数全てが
含まれていますので、可能です (openssl genrsa で生成したデータを読み込み、
openssl rsa -pubout で公開鍵を出力できるわけなので)。

試してませんが、genrsa で生成した PEM ファイルを
    http://www.openssl.org/docs/crypto/pem.html
などで読み込み、RSA 構造体を参照すればよいのではないでしょうか。

No. 3993 # sugimoto 2004/10/14 (木) 19:50:18
>>3992 68user
素早い回答どうも有難うございます。> 68User様
> > ユーザ様の仕様ではモジュラスに該当する仕様が無いのです。
> これは定義の問題ではないでしょうか? 仕様にある「暗号化キー」は、
> 実は「モジュラスと公開指数」を意味する、ということはないですか?
    ユーザからの回答として、上記が来る事を心待ちにしている所です。

  PEMファイルからモジュラスを抜き出す処理については、ユーザからの回
答を待ってからにしようと思っておりますが、必要になった場合は頑張って
みます。この処理を行いましたらまた報告します。

No. 3994 # sugimoto 2004/10/15 (金) 18:53:17
>>3993 sugimoto
sugimotoです。
結局PEMファイルから秘密指数/公開指数とモジュラスを抜き出す事にしました。
プライベート鍵ファイルからの読み込みは
PEM_read_RSAPrivateKey()という関数を利用する事で上手く行ったのですが、
パブリックキーの読み込みに失敗している状態です。
以下が読み込みプログラム
RSA *ReadPublicKey(char *keyfile)
{
    FILE *fp = fopen (keyfile, "r");
    RSA *pkey;
    if (!fp) return NULL;
    pkey = PEM_read_RSAPublicKey(fp,NULL,NULL,NULL);
    fclose (fp);
    if (pkey == NULL)
          ERR_print_errors_fp (stderr);
    return pkey;
}
この関数を実行すると、以下のエラーが出てしまいます。
=== ここから ===
5563:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:669:Expect
ing: RSA PUBLIC KEY
Error: can't load public key
=== ここまで ===
渡しているファイルは
openssl rsa -in private.key -pubout -out public.key
で作成した、public.keyになります。
ちなみに、private.keyの読み込みは上記関数のPEM_read_RSAPublicKeyを
PEM_read_RSAPrivateKeyに変えた物で、問題無く動作します。
どなたか、private.keyの読み込みを行った方が居ましたら、助言をお願い
いたします。

No. 3995 # 68user 2004/10/15 (金) 19:02:13
>>3994 sugimoto
今実行環境がないのでわかりませんが、とりあえず気になったところだけ。

> プライベート鍵ファイルからの読み込みは
> PEM_read_RSAPrivateKey()という関数を利用する事で上手く行ったのですが、
これで RSA 構造体に「秘密指数/公開指数とモジュラス」がセットされていませんか?

あと、目的がよくわからないのですが、PEM ファイルは誰が作るのですか? (自分? 相手?)
なぜ「秘密指数/公開指数とモジュラス」を抜き出す必要があるのでしょうか?

No. 3996 # sugimoto 2004/10/15 (金) 20:12:28
>>3995 68user
> > プライベート鍵ファイルからの読み込みは
> > PEM_read_RSAPrivateKey()という関数を利用する事で上手く行ったのですが、
> これで RSA 構造体に「秘密指数/公開指数とモジュラス」がセットされていませんか?

はい。セットされます。
動作の確認のため、パブリック鍵ファイルも読み込みたかったのです。

> あと、目的がよくわからないのですが、PEM ファイルは誰が作るのですか? (自分? 相手?)
  PEMは自分で作成して、一方を相手に渡します。

> なぜ「秘密指数/公開指数とモジュラス」を抜き出す必要があるのでしょうか?
    PEMファイルの鍵を使って暗号化と復号を行いたいからです。

    で、当初の問題であったパブリック鍵の読み込みですが、
    PEM_read_RSA_PUBKEY() という関数を使ったところ上手く行きました。
    色々ご助言いただき有難うございました。

No. 3997 # 68user 2004/10/15 (金) 20:19:42
>>3996 sugimoto
> PEMファイルの鍵を使って暗号化と復号を行いたいからです。
PEM ファイルをロードしたら RSA 構造体が生成されるわけですから、
それを使って OpenSSL の関数で RFC2313 (PKCS#1) なデータを生成
するのはダメなのですか?

…と質問しようかと思ったのですが、おそらく「そういう仕様である」が
答えなような気がしますのでやめておきます。

No. 3998 # 68user 2004/10/15 (金) 20:29:31
>>3997 68user
あー、公開指数とモジュラスだけ (独自フォーマットで 相手側に送りたい、
という意図かな。

No. 3999 # sugimoto 2004/10/15 (金) 21:01:45
>>3998 68user
やりたい事を上手く伝える事ができないくて、すみません。
送信者は平文をPEM形式のパブリック鍵で暗号化し、
受信者はPEM形式のプライベート鍵で復号する。
という事を実現したかっただけなのです。
暗号化/復号の際にはPEM形式ファイル内の指数とモジュラスを抜き出す
必要があって・・・という話です。
と、ここまで書いて思ったのですが、もしかしてPEM形式の鍵をそのまま
使ってRSA暗号化する関数が存在するのでしょうか?
とすれば、何て無駄な事をしているんだ・・・。という感じです。

No. 4000 # nira 2004/10/15 (金) 22:11:58
はじめまして。
「HTTPクライアントを作ってみよう」に関して質問させてください。

一般的なHPなら「HTTPクライアントを作ってみよう(2)」のソースで、指定されたURLのhtmlファイル
のソースを読み込むことができますが、Operaブラウザでオートリダイレクトを有効にしていない場合
に表示されないようなURLを指定すると

<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="">here</a>.</body>

のようなhtmlソースを拾ってきてしまいます。

リダイレクト先のhtmlソースを拾ってくるようにしたいのですが、どのようにすればいいのでしょうか。

よろしくお願いします。

No. 4001 # 68user 2004/10/15 (金) 23:27:56
>>3999 sugimoto
> 送信者は平文をPEM形式のパブリック鍵で暗号化し、
まずこの表現が微妙に変です。PEM はフォーマットのひとつでしかありません。
「送信者は PEM形式で保存されている公開鍵を使って暗号化し」ならわかります。

# わかっている人が書いた文章であればあまり気になりませんが、今回は
# どうも理解があやしいのではないかという気がします。

PEM 形式でファイルに保存されている鍵を使って RSA で暗号化するのであれば、
PEM_read_RSAPrivateKey でファイルから鍵を読み込み、RSA 構造体に適切な
データをセットして、
    http://X68000.q-e-d.net/~68user/net/rsa-1.html
のように RSA_private_encrypt を使えばすみます。モジュラスなどを参照する
必要はありません。

コマンドラインから行うなら openssl rsautl -encrypt でも同じ結果になると
思われます。

なお、PKCS#1 では鍵が k オクテットのとき、最大でも k-11 オクテットのデータ
しか暗号化できませんが、それはよいのですか?

>>4000 nira
> リダイレクト先のhtmlソースを拾ってくるようにしたいのですが
Location ヘッダを見て、再度リクエストを送る必要があります。
    http://X68000.q-e-d.net/~68user/net/http-4.html#3
をどうぞ。

No. 4002 # アンドロメダ 2004/10/18 (月) 13:51:43
はじめまして!!
おしえてください。
UNIX(HP)のサーバー間でファイルを大量コピーする作業があります。
rcp -pr コマンドを使用したところ、ログインしたユーザ名で全てのファイルが移動されて
しまいます。
例)user1 file0001  コピー後⇒ user1 file0001
        root file0002 user1 file0002

所有者を変更せずにコピーできる方法があれば
どなたかご教授願います。
宜しくお願いします<m(__)m>

No. 4003 # 68user 2004/10/18 (月) 17:29:15
>>4002 アンドロメダ
root で実行してもダメですか? もしダメなら tar で固めてそれを rcp し、
tar xfp で展開するとよいでしょう。

No. 4004 # とーりすがり 2004/10/19 (火) 01:37:52
>>4002 アンドロメダ
rcpの-pオプションはパーミッションは保持されますが
ファイルのオーナーは変わってしまいます。
(Solaris、AIXでも同様)

大ざっぱですが、こんな感じで...
tar cfp - ./from_dir | rsh to_server "cd to_dir; tar xfp -"

No. 4005 # アンドロメダ 2004/10/19 (火) 15:15:24
みなさんアドバイスありがとうございました。
tarでまとめてリモートコピーする方法でテストしたところ
うまくできました。
ありがとうございました。\(^O^)/

No. 4006 # くろ 2004/10/21 (木) 23:18:25
はじめまして、くろと申します。

ここのサイトのネットワークプログラミング[ SSL/TLS でアクセスしてみよう (1) ]の
サンプルを元に、https接続で、メソッドをGETではなくPOSTで、データを送信したところ
HTTPステータス[400 Bad Request]が戻ってきてしまいます。

リクエストのヘッダーがおかしいのかな?と思い、下記のようにしたのですが、
POST プログラム名 HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)
Content-Length: 270
Content-type: text/xml; charset=utf-8

上手くいきませんでした。(改行コードは、\r\nです)

このステータスが戻ってくる原因として、他にどんなことが考えられますでしょうか?
正直、今の私にはここまで限界で・・・

どなたかご存知の方がいらっしゃいましたら、教えていただけませんでしょうか?

宜しくお願い致します。

No. 4007 # 68user 2004/10/22 (金) 01:39:07
>>4006 くろ
> POST プログラム名 HTTP/1.0
プログラム名って何ですか? https でなく http ならうまくいくんですか?
POST でなく GET ならうまくいくんですか?

POST を受けてくれる SSL/TLS サーバが手元にないので、
        https://www.rsasecurity.com/solutionsPrimary.asp
に対して以下のリクエストを送信してみましたが、正常なレスポンスを
取得できました。

        POST /solutionsPrimary.asp HTTP/1.0
        Host: www.rsasecurity.com
        Content-Length: 2

        ab

No. 4008 # くろ 2004/10/22 (金) 13:47:15
>>4007 68user

説明に至らない点があったみたいで、すみません。

>プログラム名って何ですか?
これは、POSTをするプログラム名を指しています。

教えて頂いたURLに、POSTしてみたのですが、
サーバーからのレスポンスとして、「HTTP/1.1 400 Bad Request」
が戻ってきました。。。

68userさんでは、上手くいっているようなので、
私のプログラムの問題のようですね。。。

既に6日間も悪戦苦闘しますので、
なにか助言などありましたら、お手数ですが宜しくお願いします。

No. 4009 # 68user 2004/10/22 (金) 13:54:22
>>4008 くろ
> これは、POSTをするプログラム名を指しています。
だからプログラム名って具体的に何ですか?
      POST hoge HTTP/1.0
とかしてたりしませんか? ちゃんと
      POST /hoge HTTP/1.0
としていますか?

んなこたわかっとると思われるかもしれませんが、あなたのレベルが
わからないので、こういうところから確認しているんですよ。

No. 4010 # 68user 2004/10/22 (金) 14:08:46
>>4008 くろ
> 教えて頂いたURLに、POSTしてみたのですが、
> サーバーからのレスポンスとして、「HTTP/1.1 400 Bad Request」
> が戻ってきました。。。
ああ、これを見落としていました。

ではリクエストのやり方が悪いのでしょう。ソースを提示してください。

No. 4011 # くろ 2004/10/22 (金) 15:14:32
>>4010 68user

ご迷惑をお掛けしまして、大変申し訳ありません。
プログラム名ですが、[POST hoge HTTP/1.0] という感じで、
設定しております。

以下がソースになります。

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define EXT_OK 0
#define EXT_ERR -1
#define LINE_MAX_LEN 512
#define FILE_PATH_LEN 256
#define SEND_XML_LEN 640
#define RECV_VAL_LEN 256

#define SEND_VALUE "xml=送信データ"

int main(int argc ,char *argv[])
{
    int ierr = 0;
    int isockt = 0;
    int read_size = 0;
    struct hostent *servhost; // サーバ情報構造体
    struct sockaddr_in server; // ソケット構造体
    struct servent *service; // サービス構造体
    
    SSL *ssl;
    SSL_CTX *ctx;
    
    char *str;
    char send_buf[SEND_XML_LEN + 1]; // 送信データ
     char request[SEND_XML_LEN + 1]; // ヘッダー
    char total_buf[RECV_VAL_LEN + SEND_XML_LEN + 1]; // 送信データ(ヘッダー + データ)
    char *host = "接続先ホスト名"; // サーバ名セット
    char *path = "CGIパス"; // CGI名セット
    char buf[RECV_VAL_LEN];
    
    memset(send_buf,'\0',sizeof(send_buf));
    memset(request,'\0',sizeof(request));
    memset(total_buf,'\0',sizeof(total_buf));
    
    servhost = gethostbyname(host);
    
    if ( servhost == NULL )
    {
        fprintf(stderr, "[%s] から IP アドレスへの変換に失敗しました。\n", host);
        
        exit( EXT_ERR );
    }
    
    bzero((char *)&server, sizeof(server));
    
    server.sin_family = AF_INET;
    
    bcopy(servhost->h_addr, (char *)&server.sin_addr, servhost->h_length);
    
    service = getservbyname("https", "tcp"); // ポート番号取得
    
     if ( service != NULL )
    {
         server.sin_port = service->s_port;
    }
    else
    {
         server.sin_port = htons(443); // 取得できなかったら、ポート番号を 443 に決め打ち
    }
    
     isockt = socket(AF_INET, SOCK_STREAM, 0);
    
    if ( isockt < 0 )
    {
         fprintf(stderr, "ソケットの生成に失敗しました。\n");
        
        exit( EXT_ERR );
    }
    
    if ( connect(isockt, (struct sockaddr*) &server, sizeof(server)) == -1 )
    {
         fprintf(stderr, "connect に失敗しました。\n");
        
        exit( EXT_ERR );
    }
    
    SSL_library_init(); // SSLのライブラリを初期化
    
    SSL_load_error_strings(); // SSLエラーメッセージ Catch
    
    ctx = SSL_CTX_new(SSLv23_client_method()); // SSLv2を使用
    
    ssl = SSL_new(ctx);
    
    SSL_set_fd(ssl, isockt); // SSLとソケットの関連付け
    
    ierr = SSL_connect(ssl);
    
    sprintf(send_buf,"%s",SEND_VALUE);
    
    sprintf(request, "POST %s.cgi HTTP/1.0\r\n"
                "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)\r\n"
                "Content-Length: %d\r\nContent-type: text/xml; "
                "charset=utf-8\r\n\r\n",argv[0],strlen(send_buf));
    
    sprintf(total_buf,"%s%s",request,send_buf);
    
    ierr = SSL_write(ssl, total_buf, strlen(total_buf));
    
    printf("サーバからのレスポンス\n");
    
    while (1)
    {
        memset(buf,'\0',sizeof(buf));
        
        read_size = 0;
        
         read_size = SSL_read(ssl, buf, sizeof(buf)-1);
        
        buf[read_size] = '\0';
        
        if ( read_size > 0 )
        {
            write(1, buf, read_size);
        }
        else
        {
             break;
         }
     }
    
    SSL_shutdown(ssl);
    
     close(isockt); // ソケットクローズ
    
    SSL_free(ssl);
    
    SSL_CTX_free(ctx);
    
     exit( EXT_OK );
}
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+

申し訳ありませんが、ご教授ください。
宜しくお願いします。

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