- - PR -
ApacheへのHTTPS通信の方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-05-27 14:54
HTTPSにより、クライアントプログラムからファイルをサーバ(Linux+Apahce)へデータを送りたいと思っています。色々調査をしましたが、サーバがIISであれば、サンプルがたくさんあるのですが、Apahceへの送信に関しては、解決に至るまでの情報がありませんでした。
ご教授いただければ幸いです。 <現象> 下記のクライアントプログラムで、URLを入れるところに「http://」と入力して、HTTPで通信を行いましたが、問題なく送信ができました。 そこで、「https://」という形でセキュアサーバへ送信したところで、エラー(基になる接続が閉じられました : リモート サーバーに接続できません。)が発生しました。どうやら、これは、IISでないサーバに接続するとでるみたいなのですが。。。これ以上は分かりませんでした。 <環境> ・クライアント WindowsXP Pro C# ・サーバ FedraCore3 Apache PHP <送信するもの> 画像(jpeg)です。 fs(string)にはクライアントの絶対パスが入っております。 <クライアントアプリ(C#)> string fileFormName; string contenttype; string uploadfile;// set to file to upload string url="http://hogehoge.com/project/trance.php"; fileFormName = "uploadfile"; contenttype = "image/pjpeg"; uploadfile = fs; Uri uri = new Uri(url); string boundary = "----------" + DateTime.Now.Ticks.ToString("x"); HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri); webrequest.ContentType = "multipart/form-data; boundary=" + boundary; webrequest.Method = "POST"; StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(boundary); sb.Append("\\r\\n"); sb.Append("Content-Disposition: form-data; name=\\""); sb.Append(fileFormName); sb.Append("\\"; filename=\\""); sb.Append(Path.GetFileName(fs)); sb.Append("\\""); sb.Append("\\r\\n"); sb.Append("Content-Type: "); sb.Append(contenttype); sb.Append("\\r\\n"); sb.Append("\\r\\n"); string postHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\\r\\n--" + boundary + "\\r\\n"); FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read); long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length; webrequest.ContentLength = length; //HTTPS通信の場合、以下で中断されます。 Stream requestStream = webrequest.GetRequestStream(); requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))]; int bytesRead = 0; while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 ) requestStream.Write(buffer, 0, bytesRead); requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); WebResponse responce = webrequest.GetResponse(); Stream s = responce.GetResponseStream(); StreamReader sr = new StreamReader(s); sr.ReadToEnd(); requestStream.Close(); <サーバ側(PHP)> <?php $uploadDir = './image/'; $uploadFile = $uploadDir . $_FILES['uploadfile']['name']; print "<PRE>"; move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadFile); print "</PRE>"; ?> | ||||
|
投稿日時: 2005-05-27 15:17
こんにちは。
そもそもなのですが、Apache では SSL をサポートするような構成がされているのでしょうか? hohojpさんが、Webサーバについて色々操作ができる権限があるのなら、構成情報や各種ログ等で、より状況がはっきりすると思います。 そうでないなら、サーバの管理者の方に、この点を確認するべきでしょうね。 | ||||
|
投稿日時: 2005-05-27 15:34
angelさん、ありがとうございます。
Apahceは、Apache+SSLで構成しています。 クライアント側のIEから、上記のサーバへSSLで通信をすると正常にプログラムが走ります。 ちなみに、私が立てているサーバですので、操作する権限はちゃんとあります^^; 確かに、何かしらエラーが出ていますね。。。 [Fri May 27 10:54:50 2005] [error] SSL_accept failed [Fri May 27 10:54:50 2005] [error] error:1407609B:SSL routines:SSL23_GET_CLIENT_HELLO:https proxy request これは、Apache+SSLの設定が悪いということですか? | ||||
|
投稿日時: 2005-05-27 15:53
一人突っ込みですが。。。
上記のエラーは、全然違うところで出ているエラーでした。 申し訳ないです。 | ||||
|
投稿日時: 2005-05-27 16:05
過去に出た話でC# https通信というのがあるようですね…。ひょっとしてこれかもしれませんね。
※ .NET は専門外なのであくまでご参考まで。 | ||||
|
投稿日時: 2005-05-27 17:26
angelさん、ありがとうございます。
私も、調べているときに、上記のページが一番ヒットする内容だと思い、組み込んでみましたが、App.confへ書いても駄目でしたし、2の方法でもうまくいきませんでした。 やはり、サーバ側のSSLの設定のせいなのでしょうかね。。。 | ||||
|
投稿日時: 2005-06-07 17:51
自己レスです
お騒がせしましが、先日の件は、ただのスペルミスでした。。。 しっかりと確認をせず、質問をしてすいませんでした。 ちなみに、以下のコードで画像がHTTPS通信で問題なく送れました。
|
1