🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

2回答

12639閲覧

HTTPプロトコルを介して他のコンピューターのアプリケーションとデータを安全に交換したい。(セルフホスト)

firstlast

総合スコア138

WCF

WCFは、.NET Frameworkの提供する機能の一つ。サービス指向アプリケーション構築のためのフレームワークです。ネットワークを通して、異なるコンピュータ上で動くソフトウェア間の通信が可能になります。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

0クリップ

投稿2019/11/06 07:58

編集2019/11/10 00:27

実現したいこと(目的)

HTTPプロトコルを介して他のコンピューター上のアプリケーションとデータを交換したい。
要件:

  • 盗聴、改竄、なりすまし対策が施されている。
  • セルフホストである(IISは使用しない。)

試したこと

  • WCFを使用
  • RESTFul方式(WebHttpBinding)を使用
  • SSLを使用

  但し、サーバー証明書をコンピューターにインポートする手順に未精通なため、サービスのアプリケーションが直接pfxファイルを読み込んで行う方式で実装している。

問題点

エラー(後述)が発生して、データを交換できない。

よろしくお願い致します。

#概要
###通信イメージ
イメージ説明
イメージ説明

###サービス外観
イメージ説明

###サービス利用側外観
イメージ説明

どうぞよろしくお願い致します。

該当のソースコード

イメージ説明

サービス

Program.cs

C#

1using System; 2using System.Security.Cryptography.X509Certificates; 3using System.ServiceModel; 4using System.ServiceModel.Description; 5using System.ServiceModel.Security; 6using System.ServiceModel.Web; 7 8namespace TestService 9{ 10 class Program 11 { 12 static WebServiceHost host; 13 14 static void Main() 15 { 16 //--------------------------バインディング 17 WebHttpBinding binding = new WebHttpBinding(); 18 binding.Security.Mode = WebHttpSecurityMode.Transport; 19 binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 20 binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 21 22 //--------------------------アドレス 23 Uri uri = new Uri("https://localhost:5000/TestService"); 24 25 //--------------------------サービスの作成とエンドポイントの追加 26 host = new WebServiceHost(typeof(TestService)); 27 ServiceEndpoint se = host.AddServiceEndpoint(typeof(ITestService), binding, uri); 28 29 var behavior = new WebHttpBehavior(); 30 behavior.FaultExceptionEnabled = false; 31 behavior.HelpEnabled = true; 32 behavior.DefaultOutgoingRequestFormat = WebMessageFormat.Json; 33 behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json; 34 se.EndpointBehaviors.Add(behavior); 35 36 //-------------------------- 37 ServiceDebugBehavior debug = host.Description.Behaviors.Find<ServiceDebugBehavior>(); 38 debug.IncludeExceptionDetailInFaults = true; 39 40 ServiceMetadataBehavior metad = new ServiceMetadataBehavior(); 41 metad.HttpGetEnabled = true; 42 metad.HttpsGetEnabled = true; 43 host.Description.Behaviors.Add(metad); 44 45 //-------------------------- 46 var certificate = new X509Certificate2(@"D:\Work\TestService\ServerCert1.pfx", "pswd", X509KeyStorageFlags.UserKeySet); 47 host.Credentials.ServiceCertificate.Certificate = certificate; 48 host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 49 50 //-------------------------- 51 host.Open(); 52 Console.WriteLine(string.Format(null, "URL : {0}", uri.ToString())); 53 Console.WriteLine("Press <ENTER> to terminate"); 54 Console.ReadLine(); 55 host.Close(); 56 57 } 58 } 59} 60 61
ITestService.cs

C#

1using System.Runtime.Serialization; 2using System.ServiceModel; 3using System.ServiceModel.Web; 4 5namespace TestService 6{ 7 [ServiceContract] 8 interface ITestService 9 { 10 [OperationContract] 11 [WebInvoke(Method = "POST" 12 , RequestFormat = WebMessageFormat.Json 13 , UriTemplate = "/PostMsg" 14 )] 15 MessageData PostMsg(MessageData msg); 16 } 17 18 [DataContract] 19 public class MessageData 20 { 21 [DataMember] 22 public string Name { get; set; } 23 24 [DataMember] 25 public int Gender { get; set; } 26 27 [DataMember] 28 public int Age { get; set; } 29 30 } 31 32} 33 34
TestService.cs

C#

1using System; 2 3namespace TestService 4{ 5 class TestService : ITestService 6 { 7 public MessageData PostMsg(MessageData msg) 8 { 9 Console.WriteLine(string.Format(null, "受信 : {0}", msg.ToString())); 10 11 return new MessageData() 12 { 13 Name = msg.Name, 14 Gender = msg.Gender, 15 Age = msg.Age + 1 16 }; 17 } 18 19 } 20} 21 22

サービス利用側

Form1.cs

C#

1using System; 2using System.Windows.Forms; 3using System.Security.Cryptography.X509Certificates; 4using System.ServiceModel; 5using System.ServiceModel.Description; 6using System.ServiceModel.Security; 7using System.ServiceModel.Web; 8using TestService; 9 10namespace TestClient 11{ 12 public partial class Form1 : Form 13 { 14 WebChannelFactory<ITestService> cf = null; 15 ITestService channel = null; 16 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void Form1_Load(object sender, EventArgs e) 23 { 24 listBox1.HorizontalScrollbar = true; 25 26 Uri uri = new Uri("https://123.123.123.123:5000/TestService"); 27 EndpointAddress endpointAddress = new EndpointAddress(uri); 28 29 //--------------------------チャンネル 30 cf = new WebChannelFactory<ITestService>(uri); 31 WebHttpBinding binding = cf.Endpoint.Binding as WebHttpBinding; 32 binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 33 binding.Security.Mode = WebHttpSecurityMode.Transport; 34 35 var behavior = new WebHttpBehavior(); 36 behavior.FaultExceptionEnabled = false; 37 behavior.HelpEnabled = true; 38 behavior.DefaultOutgoingRequestFormat = WebMessageFormat.Json; 39 behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json; 40 cf.Endpoint.Behaviors.Add(behavior); 41 42 var clientCertificate = new X509Certificate2(@"D:\Work\TestService\ServerCert1.pfx", "pswd", X509KeyStorageFlags.UserKeySet); 43 cf.Credentials.ClientCertificate.Certificate = clientCertificate; 44 cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 45 46 channel = cf.CreateChannel(); 47 48 } 49 50 private void button1_Click(object sender, EventArgs e) 51 { 52 MessageData msg = new MessageData() 53 { 54 Name = "Taro", 55 Gender = 1, 56 Age = 3 57 }; 58 MessageData rtn = channel.PostMsg(msg); //<--------ここでエラー発生 59 listBox1.Items.Insert(0, string.Format("Name:{0}, Gender:{1}, Age{2} ", rtn.Name, rtn.Gender, rtn.Age)); 60 61 } 62 } 63} 64 65

エラー内容

https://123.123.123.123:5000/TestService/PostMsg に対する HTTP 要求の発行中にエラーが発生しました。この原因としては、HTTPS ケースの HTTP.SYS でサーバー証明書が正しく構成されていないこと、またはクライアントとサーバーの間でセキュリティ バインドが整合していないことが考えられます。

証明書作成

DOS

1自己証明機関の作成 2makecert -n "CN=ServerCN1" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv ServerCert1.pvk ServerCert1.cer -ss Root -sr localMachine -cy authority -b 11/06/2019 -e 12/31/2019 3 4ソフトウェア発行元証明書の作成 5cert2spc ServerCert1.cer ServerCert1.spc 6 7個人情報交換ファイルの作成 8pvk2pfx -pvk ServerCert1.pvk -spc ServerCert1.spc -po pswd -pfx ServerCert1.pfx -f

#試したこと1
①パワーシェルで、以下のコマンドを実行し、証明書の捺印を取得
Get-PfxCertificate -FilePath ServerCert1.pfx

②トランスポート層で X.509 証明書を使用して認証するクライアントをサポートするために
netsh http add sslcert ipport=0.0.0.0:5000 certhash=9512A6EA3042F7717EA02194097187207136E5FB appid={541eea84-c788-4d23-b6b2-f5210bcdf5c5} clientcertnegotiation=enable
を実行 ※certhashに①で取得した捺印を、appidには、Visual StudioのサービスプロジェクトのプロパティウィンドウにあるGUIDを設定。

===>下記エラー発生
SSL 証明書を追加できませんでした。エラー: 1312
指定されたログオン セッションは存在しません。そのセッションは既に終了している可能性があります。

#試したこと2
サービスとクライアントの各ソースコードからセキュリティ関連のコードを除去した場合は、正常なメッセージのやり取りが実現できています。

#試したこと3
X509Certificate2メソッドのパスワードの引数をわざと違うものに設定するとちゃんとエラーになります。

#補足1
IISでは.pfxファイルをコンピュータにインポートするが、今回の試みでは、X509Certificate2メソッドの引数にファイルを指定している。

#補足2
HTTPS通信は、共通鍵暗号方式と公開鍵暗号方式のハイブリッドで成り立っているらしい。

環境

Microsoft Windows 10 Pro (Version 1903)
Microsoft Visual Studio Community 2019
Microsoft .NET Framework 4.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

WCFには明るくないので外しているかもですが、サーバー側でホスティングしようとしているURIは"https://localhost:5000/TestService"であるのに対し、クライアント側は違うURI、"https://123.123.123.123:5000/TestService" でアクセスしようとしています。

"123.123.123.123"は質問投稿用の仮のIPアドレスなのかもしれませんが、いずれにせよlocalhostとは異なります。httpsで運用するサーバーは、アクセスされる際のホスト名を厳密に意識しているはずなので、ここで不一致は良くないのでは。

開発環境上では同一PCということなので、hostsファイルなどを利用してホスト名の部分を合わせてみるか、IPアドレスを合わせてアクセスしてみてください。あるいは簡単に、クライアント側から "https://localhost:5000/TestService" でアクセスできるのであれば、やはりそういうことなのではないかな、と思います。


追記しました:2019-11-12 02:42

先の回答は外していました。くやしかった(?)のと、お手を煩わせてしまった罪滅ぼしに当方でも検証してみました。
結果から書きますと、以下の処置で限定的ながら通信できるようになりました。

  1. 作成した自己証明書の*.pfxファイルをWindows証明書マネージャでインポート
  2. インポートしたWindows証明書マネージャで証明書のサムプリント(拇印)を取得
  3. netshコマンドでポート構成をバインド
  4. サーバー側プログラムで、匿名アクセスを受け付けるよう修正
  5. クライアント側プログラムで、「自己証明書による不正な証明書エラー」によるエラーを回避するよう修正

以下、順にご説明します。

1. 作成した自己証明書の*.pfxファイルをWindows証明書マネージャでインポート

質問者さんの「試したこと1」で、netsh コマンドによるSSL証明書のポート構成のバインド操作ですが、PowerShellのGet-PfxCertificateコマンドで得た拇印ではダメでした。(私自身がこの辺りに不慣れなこともあって)様々なオプションを試しましたが、結局、以下の記事を参考にさせていただき、MMCでの「Windows証明書マネージャcertlm」を用いて自己(オレオレ)SSL証明書ファイルServerCert1.pfxをインポートしました。(すべてデフォルトの指定に沿います)
OnTimeサーバーにSSL証明書を設定する - OnTime Group Calendar

2. インポートしたWindows証明書マネージャで証明書のサムプリント(拇印)を取得

証明書のサムプリント(拇印)は、1.のWindows証明書マネージャで得られたものを利用しました。 (操作方法は記事中に記載されています

3. netshコマンドでポート構成をバインド

証明書のサムプリントの取得部分が違うだけで、あとは質問者さんで行った方法と同じです。

CMD

1netsh http add sslcert ipport=0.0.0.0:5000 certhash=eae70a1d0144a9a367b4aa810f22b8e95815b602 appid={90164bb5-886c-4536-a752-7fbbf652c070} clientcertnegotiation=enable

netsh http show sslcertでSSL証明書のバインド状況を確認すると、以下のようなものとなりました。

CMD

1C> netsh http show sslcert 2SSL 証明書のバインド: 3------------------------- 4 5 6 7 IP:ポート : 0.0.0.0:5000 8 証明書ハッシュ : eae70a1d0144a9a367b4aa810f22b8e95815b602 9 アプリケーション ID : {90164bb5-886c-4536-a752-7fbbf652c070} 10 証明書ストア名 : (null) 11 クライアント証明書の失効状態の検証: Enabled 12 キャッシュされたクライアント証明書のみを使用した失効状態の検証: Disabled 13 使用法のチェック : Enabled 14 失効リストの更新を確認する間隔: 0 15 URL 取得のタイムアウト : 0 16 Ctl 識別子 : (null) 17 Ctl ストア名 : (null) 18 DS マッパーの使用法 : Disabled 19 クライアント証明書のネゴシエート: Enabled 20 接続の拒否 : Disabled 21 HTTP2 を無効にする : Not Set 22 QUIC を無効にする : Not Set 23 TLS1.2 を無効にする : Not Set 24 TLS1.3 を無効にする : Not Set 25 OCSP Stapling を無効にする : Not Set 26 トークンのバインドを有効にする : Not Set 27 拡張イベントをログに記録する : Not Set 28 レガシ TLS バージョンを無効にする : Not Set 29 セッション チケットを有効にする : Not Set 30 拡張プロパティ: 31 PropertyId : 0 32 受信ウィンドウ : 1048576 33 拡張プロパティ: 34 PropertyId : 1 35 フレームごとの最大設定 : 2796202 36 1 分間の最大設定 : 4294967295

4. クライアント側プログラムで、「自己証明書による不正な証明書エラー」によるエラーを回避するよう修正

もとのサーバー、クライアントプログラムですと、自己証明書を使っていることによる、System.ServiceModel.Security.SecurityNegotiationException 「リモート証明書は無効です。」例外が起きます。

System.ServiceModel.Security.SecurityNegotiationException HResult=0x80131501 Message=機関 'servercn1:5000' との SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。 Source=mscorlib スタック トレース: ...(省略) 内部例外 1: WebException: 接続が切断されました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。 内部例外 2: AuthenticationException: 検証プロシージャによると、リモート証明書は無効です。

これを避けるために、クライアント側に自己証明書であった場合でも、無理やりOKとするよう修正します。
参考:How to accept a self-signed SSL certificate in a WCF client? - Stack Overflow

C#

1// MessageData rtn = channel.PostMsg(msg); で送信する前に、リモート証明書の妥当性チェックコールバックを登録 2ServicePointManager.ServerCertificateValidationCallback += 3 new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck); 4 5// コールバックメソッド 6bool EasyCertCheck(object sender, X509Certificate cert, 7 X509Chain chain, System.Net.Security.SslPolicyErrors error) 8{ 9 // 自己証明書の場合でも必ずチェックOKとする 10 Debug.WriteLine("EasyCertCheck"); 11 return true; 12}

5. サーバー側プログラムで、匿名アクセスを受け付けるよう修正

サーバー側のコードで、binding.Security.Transport.ClientCredentialTypeHttpClientCredentialType.Certificateであると、以下の例外となります。HTTPステータス403なので一応は繋がっているかたちですが、成功としてレスポンスを受信したいので、この設定値を緩やかなものに変えます。

System.ServiceModel.Security.MessageSecurityException HResult=0x80131501 Message=この HTTP 要求は、クライアントの認証方式 'Anonymous' で許可されませんでした。 Source=WindowsFormsApp1 スタック トレース: ...(省略) 内部例外 1: WebException: リモート サーバーがエラーを返しました: (403) 使用不可能

C#

1//ここを無効にして binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 2 3// 匿名アクセスを可能とする 4binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

6. まとめ

自己証明書用でも構わず処理するようにクライアントを修正したのと、特に匿名アクセスでも受け付けるようにサーバーを修正した点は気になるところですが、一応https接続はできるようになったので、現状の回答として追記させてもらった次第です。

検証した環境は以下となります。。

  • Windows 10 Professional Version 1903 (OSビルド 18362.418)
  • Visual Studio 2017 (Version 15.9.17)
  • .NET Framework 4.5

プログラムの実行状況です。
プログラム実行状況

クライアント側はProgram.csの修正量が多いので、全部掲載します。

C#

1using System; 2using System.Windows.Forms; 3using System.Security.Cryptography.X509Certificates; 4using System.ServiceModel; 5using System.ServiceModel.Description; 6using System.ServiceModel.Security; 7using System.ServiceModel.Web; 8using System.Net; 9using System.Diagnostics; 10using TestService; 11 12namespace TestClient 13{ 14 public partial class Form1 : Form 15 { 16 WebChannelFactory<ITestService> cf = null; 17 ITestService channel = null; 18 //private static string pfxPath = @"D:\Work\TestService\ServerCert1.pfx"; 19 private static string pfxPath = @"C:\project\teratail\221557\ServerCert1.pfx"; 20 //private static string uris = @"https://123.123.123.123:5000/TestService"; 21 //private static string uris = @"https://localhost:5000/TestService"; 22 //private static string uris = @"https://ServerCN1:5000/TestService"; 23 private static string uris = @"https://192.168.11.103:5000/TestService"; 24 25 public Form1() 26 { 27 InitializeComponent(); 28 } 29 30 private void Form1_Load(object sender, EventArgs e) 31 { 32 listBox1.HorizontalScrollbar = true; 33 34 //Uri uri = new Uri("https://123.123.123.123:5000/TestService"); 35 Uri uri = new Uri(uris); 36 EndpointAddress endpointAddress = new EndpointAddress(uri); 37 38 //--------------------------チャンネル 39 cf = new WebChannelFactory<ITestService>(uri); 40 WebHttpBinding binding = cf.Endpoint.Binding as WebHttpBinding; 41 binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 42 binding.Security.Mode = WebHttpSecurityMode.Transport; 43 44 var behavior = new WebHttpBehavior(); 45 behavior.FaultExceptionEnabled = false; 46 behavior.HelpEnabled = true; 47 behavior.DefaultOutgoingRequestFormat = WebMessageFormat.Json; 48 behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json; 49 cf.Endpoint.Behaviors.Add(behavior); 50 51 ServicePointManager.ServerCertificateValidationCallback += 52 new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck); 53 54 //var clientCertificate = new X509Certificate2(@"D:\Work\TestService\ServerCert1.pfx", "pswd", X509KeyStorageFlags.UserKeySet); 55 var clientCertificate = new X509Certificate2(pfxPath, "pswd", X509KeyStorageFlags.UserKeySet); 56 cf.Credentials.ClientCertificate.Certificate = clientCertificate; 57 cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 58 //cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; 59 60 channel = cf.CreateChannel(); 61 } 62 63 private void button1_Click(object sender, EventArgs e) 64 { 65 MessageData msg = new MessageData() 66 { 67 Name = "Taro", 68 Gender = 1, 69 Age = 3 70 }; 71 try 72 { 73 MessageData rtn = channel.PostMsg(msg); //<--------ここでエラー発生 74 listBox1.Items.Insert(0, string.Format("Name:{0}, Gender:{1}, Age{2} ", rtn.Name, rtn.Gender, rtn.Age)); 75 } 76 catch (Exception ex) 77 { 78 Trace.WriteLine(ex.Message); 79 throw ex; 80 } 81 } 82 83 private bool EasyCertCheck(object sender, X509Certificate cert, 84 X509Chain chain, System.Net.Security.SslPolicyErrors error) 85 { 86 Debug.WriteLine("EasyCertCheck"); 87 return true; 88 } 89 } 90}

投稿2019/11/10 17:29

編集2019/11/11 17:57
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2019/11/10 18:05

ありがとうございます。 でも、ソースコードからSSL関連の部分を除去すると正常に動作するんですよねぇ。 SSLが絡んでくるとアドレス認識がシビアになるのかもしれないので、一度確認してみます。
firstlast

2019/11/10 18:56

localhostでなくIPアドレスを指定してみましたが、同じエラーが発生しました。残念
dodox86

2019/11/11 10:14 編集

こちらでも検証してみましたが、確かにlocalhostをIPアドレスやホスト名に変更してもダメでした。この点では回答は外していました。申し訳ありません。少々手強かったですが、少なくともWindows 10同一マシンでは繋がるようにはなったので追って回答に追記します。(若干の制限条件があります)
firstlast

2019/11/11 13:15

ご協力ありがとうございます。 私の方は、未だ試行錯誤地獄を彷徨っています...
firstlast

2019/11/12 01:35

>罪滅ぼし とんでもございません。ありがとうございます。 戴いた回答をこちらでも検証してみます。
firstlast

2019/11/12 05:07

<証明書の捺印を取得する方法について> Get-PfxCertificateは、捺印でなく違うものが返ってきていたようです。 ご指摘のようにWindows10のGUIツール(MMCやCERTLM)で取得できることを確認できました。 ご指摘ありがとうございます。
firstlast

2019/11/12 05:34

教えて頂いた方法でhttpsでデータのやり取りをすることができました。ありがとうございます。6.まとめでおっしゃっている通り、気になる点については私も同感です。
dodox86

2019/11/12 05:48

自己SSL証明書の方は現段階では仕方が無いと思いますが、匿名アカウントの件はクライアントからの証明書が使われているのかどうか分からない(<私には判断できなかった)ので、当初の目的を達せているか(質問と要望を満たせているか)疑問ですね。自己証明書を本物にしたらまた状況が変わったりするのかもしれませんが。私で検証できるのはここまででした。
firstlast

2019/11/12 06:40

大変感謝しております。 現時点で要望を満たしていなくても、今後の道筋を付けて頂いたように思います。最終的に私の要望自体が無理なことだった結論に至ることもあるかと思います。取り敢えず、今気になっているのは、makecertの ekuスイッチで、生成する証明書の種類(サーバー証明書、クライアント証明書、コード証明書、等)が指定できることです。コード証明書は、ソフトウェア等に電子署名をする際に必要なもののようです。サーバー証明書、クライアント証明書が、今やろうとしていることと、どう絡んでくるか絡まないのか調べて行こうと思っています。
firstlast

2019/11/12 08:19

https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/how-to-create-temporary-certificates-for-use-during-development これも気になっています。 ~~~引用開始~~~ 新しい SelfSignedCertificate コマンドレットによって生成される証明書は、テスト目的でのみ提供されます。 ~中略~ 自己署名証明書を信頼されたルート証明機関ストアに配置すると、展開環境をより厳密にシミュレートする開発環境を作成できます。 ~~~引用終了~~~
dodox86

2019/11/12 08:23 編集

情報提供ありがとうございます。興味深く思いますが、開発/テスト環境用に特別に設定できるとなると、更に条件が増えることになるので実運用への展開でまた少し苦労しそうですね。
firstlast

2019/11/14 03:53

回答していただいた内容で、この質問は解決したことにしようと思います。実際、HTTPSでの通信は達成できているのでそれが妥当かと思いました。いろいろ調べているうちに、セキュリティの知識がほとんどないことがわかったので、今後はその知識を充実していこうと思います。親身になって協力していただきありがとうございました。^^
firstlast

2019/11/14 06:16

binding.Security.Transport.ClientCredentialType の値を HttpClientCredentialType.Certificateから HttpClientCredentialType.Noneに変更すること の意味について考察 ・SSLを使うと、サーバーの認証とクライアントの認証を行うことができる。 ・クライアントの認証は必ずしも必要ではない。 ・クライアント認証をしないときは、binding.Security.Transport.ClientCredentialType にHttpClientCredentialType.Noneを指定すればよい。 ・クライアント認証をするときは、binding.Security.Transport.ClientCredentialType にHttpClientCredentialType.Certificateを指定すればよい。 という理解に至りました。
guest

0

セルフホストでSSL結構邪魔くさいですよ。

WCFの基本(念のためです)はこちらで
(docs.microsoft.com)チュートリアル: 基本的な Windows Communication Foundation サービスをホストして実行する

(!)注意
このようなサービスでは、リッスンするコンピューターに HTTP アドレスを登録するための適切なアクセス許可が必要です。 管理者アカウントにはこのアクセス許可がありますが、管理者以外のアカウントの場合は、HTTP 名前空間へのアクセス許可を付与する必要があります。 名前空間の予約を構成する方法については、「HTTP および HTTPS の構成」を参照してください。

ということで以下も参照ください。
(docs.microsoft.com)HTTP および HTTPS の構成

WCF サービスが自己ホスト型の場合は、コマンド ライン ツールを使用して HTTP または HTTPS の設定を構成します。

SSL 証明書の構成
・・・略・・・
手順については、次を参照してください。方法。SSL 証明書でポートを構成します。

ということでこちらも参照ください。
(docs.microsoft.com)方法: SSL 証明書を使用してポートを構成する

投稿2019/11/07 00:52

Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2019/11/14 06:38 編集

ここにあった内容は、質問本文に転記
Y.H.

2019/11/08 15:34

ここより多くの人の目に止まるので、質問に追記された方がよろしいかと思います。
firstlast

2019/11/08 15:42

Y.Hさん、アドバイスありがとうございます。質問の方に転記します。
firstlast

2019/11/12 07:00

遠回りでも、戴いた回答のリンク先にあるようなマイクロソフトのドキュメントをまず読むことが重要だと改めて認識しました。まだ全部読めてませんが...^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問