- PR -

C# https通信

1
投稿者投稿内容
cane
常連さん
会議室デビュー日: 2004/10/06
投稿数: 37
投稿日時: 2004-10-06 11:51
HTTPS(SSL)通信でエラーが発生します。
エラー内容
***********************************************************************

基になる接続が閉じられました : リモート サーバーと信頼関係を確立できませんでした。

***********************************************************************
1,httpサイト、一部のhttpsサイトには接続可能な状態です。

2,証明書のインストール、登録作業をMMC、ブラウザーに行いました。

ソースコード

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Net;
using System.Web;
using System.IO;
using System.Text;
using System.Security;

public class Class2 {
public static void Main(){
string OrderNo = null;
string con_url = null;
string Amount = null;
string URL = null;
string Account = null;
string Password = null;
string paytype = null;

paytype = "type";
OrderNo = "333";
Amount = "12";
Account = "sasa";
Password = "saa";



con_url = "接続サイトを記入";

Stream stream = null;
StreamReader sr = null;

try{
System.Net.WebRequest webReq = HttpWebRequest.Create(con_url);

//ポスト送信設定
webReq.Method = "POST";

// 5秒でタイムアウトさせる。
webReq.Timeout = 5000;

// デフォルトのコンテントタイプ
webReq.ContentType = "application/x-www-form-urlencoded";
string param = "enctype=text/plain&=paytype";
param += HttpUtility.UrlEncode(paytype, Encoding.GetEncoding("SHIFT-JIS"));
param += " Account=";
param += HttpUtility.UrlEncode(Account, Encoding.GetEncoding("SHIFT-JIS"));
param += "&Password=";
param += HttpUtility.UrlEncode(Password, Encoding.GetEncoding("SHIFT-JIS"));
param += "&OrderNo=";
param += HttpUtility.UrlEncode(OrderNo, Encoding.GetEncoding("SHIFT-JIS"));
param += "&Amount=";
param += HttpUtility.UrlEncode(Amount, Encoding.GetEncoding("SHIFT-JIS"));
Debug.WriteLine("AAA");

//Ascii なので、エンコーディングは指定する必要なし。

StreamWriter sw = new StreamWriter(webReq.GetRequestStream(), Encoding.GetEncoding("SHIFT-JIS"));
sw.Write("param");
sw.Close();

// 結果を受け取る。
WebResponse webRes = webReq.GetResponse();

// HttpWebRequest からストリームを取得する。
stream = webRes.GetResponseStream();

// SHIFT JIS で読み取る。
sr = new StreamReader(stream, Encoding.GetEncoding("SHIFT-JIS"));
String str = null;
str = sr.ReadToEnd();
Debug.WriteLine(str);

}

catch (Exception exc){
Debug.WriteLine(exc.Message);
}

finally{
if (sr != null) sr.Close();
if (stream != null) stream.Close();
}
}
}

解決策があればご教授お願い致します。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-10-06 17:10
南部です。

エラーメッセージから察するに、
ブラウザからアクセスすると証明書に関して
「セキュリティの警告」がでませんか?

もしでるのであれば、それが原因です。

「セキュリティ証明書の名前が無効であるか、またはサイト名と、、、、」
だけに警告マークがあるのであれば、
App.configのconfiguration下に
<system.net>
 <settings>
  <servicePointManager checkCertificateName="true" />
 </settings>
</system.net>
を設定すればよいらしいです(未確認)。

他の
「このセキュリティ証明書は、信頼する会社から、、、」
や、日付での警告の回避は、次の実装になります(確認済み)

1.次のクラスを作成します。
public class MyPolicy : ICertificatePolicy
{
public bool CheckValidationResult(
 ServicePoint srvPoint,
 System.Security.Cryptography.X509Certificates.X509Certificate certificate,
 WebRequest request, int certificateProblem)
{
 if (certificateProblem == 0 || //正常
   certificateProblem == -2146762487 || //信頼されてない?
   certificateProblem == -2146762495 || //期限切れ
   certificateProblem == -2146762481) //名前不正?
  return true;
 else
  return false;
}
}

#確認ダイアログを出してもいいですね。

2.初期化処理に次のコードを追加
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

以上です。


なお、動作確認環境は、
クライアント:Window 2000 Pro + .NET Framework 1.1 SP1
サーバー:Window 2000 Server
です。


[ メッセージ編集済み 編集者: nanbu 編集日時 2004-10-06 17:42 ]
cane
常連さん
会議室デビュー日: 2004/10/06
投稿数: 37
投稿日時: 2004-10-06 18:58
南部さん。
ありがとうございました。無事、接続できました。
こうした処理を勉強するにあたり、何かおすすめの書籍はありますか?
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-10-06 21:05
書籍ですか、私も知りたいです。
私の場合、MSDNライブラリとネットの情報です。

# あ、いや、私の場合、仕事じゃなくて趣味なんで
# あまり、調べていません。
# 誰か教えてください。
1

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