質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTTPS

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

C#

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

1964閲覧

AWS EC2 に構築したASP.NETシステムから、他社サービスのAPIをHTTPS通信で実行しようとするとエラーが発生する

ta1_2498

総合スコア19

HTTPS

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

C#

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/11/06 16:17

編集2020/11/07 16:04

前提・実現したいこと

ASP.Net MVCでのシステムを構築しています。このシステムで、他社サービスのAPIを実行する部分がありまして、そのAPIを実行するには固定IPアドレスの値を申請する必要がありました。

開発PCは固定IPでなく動的であるので、デバッグのためAmazon EC2にてWindows Server2019を構築、固定IPを割り当て、開発中のシステムを発行しリモートデバッグとまではうまくできているのですが、肝心の他社サービスAPIを実行する部分で下記のエラーが発生しています。

発生している問題・エラーメッセージ

The request was aborted: Could not create SSL/TLS secure channel.

該当のソースコード

コードの概要は下記の通りです。

C#

1// 下記はAPI実行に必要な設定 2x509Certificate2 = new X509Certificate2("pfxファイルを読み込んだバイト配列", "パスワード", X509KeyStorageFlags.PersistKeySet); 3WebRequestHandler handler = new WebRequestHandler(); 4handler.ClientCertificates.Add(x509Certificate2); 5handler.ServerCertificateValidationCallback = delegate { return true; }; 6 7using (var client = new HttpClient(handler)) 8{ 9 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 10 HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://他社サービスのAPIエンドポイント"); 11 request.Headers.Add("Authorization", "APIに必要なトークン"); 12 request.Content = new StringContent("ボディリクエスト文字列", new UTF8Encoding(), "application/x-www-form-urlencoded"); 13 14 // ☆↓がエラーが発生している箇所 15 response = client.SendAsync(request).Result; 16}

試したこと

Fiddler(やりとりされるHTTPリクエストやレスポンスを確認できるツール。HTTPS通信もキャッチするように設定済み)にて、トラフィックを確認しましたが、キャッチされず、そもそものリクエストが送信できていないようです。

エラーメッセージからhttps通信の設定の問題かと考え、EC2のセキュリティグループを確認、IISマネージャでの証明書、SSL設定を追加したのですが状況が変わりませんでした。

開発用PC(動的IP)でデバッグ実行するとFiddlerでキャッチされますし、他社APIのエラーメッセージが返っております。そのエラー内容も「許可されていないIPアドレスである」旨であるため、通信自体は上記のコードで合っており、EC2の設定の問題なのかと思っています。

ただ、EC2「から他サーバへの」HTTPS通信について調べようとしても、たいていはEC2に構築したWebサーバーにHTTPS通信する内容が多く見つかります。正直、このHTTPS通信、SSL/TLSに関して自分の理解は浅いです。
今回行いたい「EC2(のIIS)から他サービスへHTTPS通信をさせる」のと、多く情報がある「EC2へHTTPS通信する」ことは、設定自体は同じ話になるのでしょうか?

コードで解消できる話題なのか、AWSの設定で解消できる話なのか、ご助力いただきたく存じます。よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/11/07 05:53 編集

ASP.NET Web アプリからでなく、単純にコンソールアプリからアクセスした場合はどうなるかは試してみたでしょうか? 質問の本題とは関係ないことですが、質問のコードのように using 句で HttpClient の生成・廃棄を繰り返すと、そのたびにソケットが生成され、それは廃棄されないので、ソケットの枯渇につながるという問題があります。(Microsoft のドキュメント https://docs.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient?view=netframework-4.8 に書いてあります) そのため、シングルトンにしてアプリで使いまわすということを行いますが、要求のたびにスレッドプールからスレッドを得て要求を処理して返すという操作を行う ASP.NET Web アプリで、一つの HttpClient を複数のスレッドで同時に使うということをして問題が無いかは分かりません。 .NET 版でなく、Core 2.1 以降を使うのであれば以下のような手段があるそうですが・・・ ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1
退会済みユーザー

退会済みユーザー

2020/11/07 01:55 編集

タグが MVC4 となっていますが間違いでは? 新規開発なら MVC4 ではなくて MVC5 だと思うのですが。間違いならタグを付け直してください。他に ASP.NET, ASP.NET MVC Framework というタグがあります。
ta1_2498

2020/11/07 16:11

失礼しました。ASP.NET MVC 5ではタグが無かったようなので、思わず4をつけてしまいましたが、ASP.NET MVC Framework に付け替えました。 HttpClientは1度だけのインスタンス化にするんですね。情報ありがとうございます。こちらは書き方を修正します。 なお、肝心の問題のほうは解決しましたので、方法についてはそちらに記載させていただきます。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/11/08 00:14

> HttpClientは1度だけのインスタンス化にするんですね。情報ありがとうございます。こちらは書き方を修正します。 以下の記事をご参考に紹介します。 Improper Instantiation antipattern https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/ How to fix the problem のセクションに解決したという方法が書いてあります。コントローラーに、 private static readonly HttpClient httpClient; というフィールドを追加して、コントローラーのコンストラクタで、 httpClient = new HttpClient(); とすると書いてあります。 ただ、コントローラのコンストラクタはクライアントから要求を受けるたびに呼び出されるのですが、要求を受けるたびに HttpClient のインスタンスを新たに作るということになってしまうはずで、それでホントにうまくいくのか分かりませんが。 Microsoft のドキュメントでもありますし、検証したようでもありますし、もし問題が起きたら Microsoft のせいということにできるかもしれませんので(半分冗談)、使ってみるのも手かもしれません。
guest

回答2

0

ご回答ありがとうございました。
問題の現象について解決できましたので、下記に記載します。
0. ファイアウォールの設定:EC2セキュリティグループのアウトバウンドばかり気にしており、EC2マシン自体のファイアウォールを確認できていませんでした。

  1. コード最初のX509Certificateコンストラクタの第3引数を、"X509KeyStorageFlags.MachineKeySet"に変更

C#

1x509Certificate2 = new X509Certificate2("pfxファイルを読み込んだバイト配列", "パスワード", X509KeyStorageFlags.PersistKeySet); 23x509Certificate2 = new X509Certificate2("pfxファイルを読み込んだバイト配列", "パスワード", X509KeyStorageFlags.MachineKeySet);

2番めの内容について、MSDNを確認して勉強します。

投稿2020/11/07 16:20

ta1_2498

総合スコア19

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

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

0

ベストアンサー

EC2上のWindows Server2019のファイアウォールでアウトバウンドを拒否してないでしょうか。
デフォルトだとファイアウォールがそこそこ通信を弾くようになってるので、必要な通信を明示的に許可してください。
セキュリティグループとは別で設定する必要があります。

投稿2020/11/07 00:03

yu_1985

総合スコア7445

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

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

ta1_2498

2020/11/07 16:13

EC2上のマシン自体のファイアウォールは完全に見逃しておりました。ご指摘いただき、ありがとうございます。 結果的にはそれだけでは無かったのですが、解決することができました。ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問