- PR -

ApacheへのHTTPS通信の方法

1
投稿者投稿内容
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 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>";
?>
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-05-27 15:17
こんにちは。

そもそもなのですが、Apache では SSL をサポートするような構成がされているのでしょうか?

hohojpさんが、Webサーバについて色々操作ができる権限があるのなら、構成情報や各種ログ等で、より状況がはっきりすると思います。
そうでないなら、サーバの管理者の方に、この点を確認するべきでしょうね。
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 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の設定が悪いということですか?
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 2005-05-27 15:53
一人突っ込みですが。。。
上記のエラーは、全然違うところで出ているエラーでした。
申し訳ないです。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-05-27 16:05
過去に出た話でC# https通信というのがあるようですね…。ひょっとしてこれかもしれませんね。
※ .NET は専門外なのであくまでご参考まで。
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 2005-05-27 17:26
angelさん、ありがとうございます。

引用:

過去に出た話でC# https通信というのがあるようですね…。ひょっとしてこれかもしれませんね。



私も、調べているときに、上記のページが一番ヒットする内容だと思い、組み込んでみましたが、App.confへ書いても駄目でしたし、2の方法でもうまくいきませんでした。
やはり、サーバ側のSSLの設定のせいなのでしょうかね。。。
hohojp
常連さん
会議室デビュー日: 2005/02/15
投稿数: 31
投稿日時: 2005-06-07 17:51
自己レスです

お騒がせしましが、先日の件は、ただのスペルミスでした。。。

しっかりと確認をせず、質問をしてすいませんでした。

ちなみに、以下のコードで画像がHTTPS通信で問題なく送れました。

コード:
string fs;    // 送りたいファイルの絶対パス
Uri uri = new Uri(url);     // https://ssl.hoge.com/hoge.php など

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(filename);                    //Nameに入る変数名
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(fs, FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
webrequest.ContentLength = length;

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();
fileStream.Close();

1

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