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

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

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

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

C#

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

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Q&A

解決済

1回答

806閲覧

Hyper-Vの仮想マシンからAzureのIISサーバに対してクライアント証明書を用いたHTTPS通信を行うことができない

SNB53857

総合スコア8

HTTPS

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

C#

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

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

0グッド

1クリップ

投稿2019/01/11 12:32

前提・実現したいこと

Hyper-Vで動作させている仮想マシン(windows7 Enterprise)上のソフトウェアから、
クライアント証明書を用いたHTTPS通信をAzure上のIISと行おうとするとIISのアク
セスログに「403 7」と記録されて通信を行うことができません。

この場合、どのように調査を行っていけばよいかご教示いただけないでしょうか。

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

記録された例外(WebException)のResponseを表示した際、「Forbidden」となります。 また、IISのログファイル(C:\inetpub\logs\LogFiles\W3SVC1直下のログ)に、当該PCからの 通信についてステータスコードが「403 7」が記録されています。

該当のソースコード

C#

1var request = (HttpWebRequest)WebRequest.Create(接続先URL); 2 3request.ContentType = "application/json; charset=utf-8"; 4request.Method = method;←POSTやPUTが入ります 5request.Timeout = requestTimeoput;←設定ファイルに設定したタイムアウト時間が入ります 6request.KeepAlive = true; 7 8request.ClientCertificates.Add(クライアント証明書オブジェクト); 9 10try{ 11 using (var streamWriter = new StreamWriter(request.GetRequestStream())) 12 { 13  streamWriter.Write(IISに送信するJSON形式のデータ); 14 } 15 var response = (HttpWebResponse)request.GetResponse();←ここで例外に飛んでいます 16} 17catch (System.Net.WebException webEx) 18{ 19 if (webEx.Status == System.Net.WebExceptionStatus.ProtocolError) 20 { 21  System.Net.HttpWebResponse errorCode = (System.Net.HttpWebResponse)webEx.Response; 22  logger_.ErrorFormat("Statucs code:{0}", errorCode.StatusCode); 23 } 24} 25

試したこと

・上記ソフトウェアは、定期的に収集したデータをIIS上のWebアプリにアップロードする機能があり、そこでHTTPS(クライアント証明書を用いた認証)を使用しています。
他の物理マシン(windows7 embedded)では正常にHTTPSで通信ができることは確認しています。

・クライアント証明書はIISサーバが属しているドメインで発行してもらったものを使用しています。利用の際はpfx形式のクライアント証明書を「mmc」の証明書スナップイン(ローカルコンピュータ)で個人ストアにインストールして使用しています。
後述のソースコードで個人ストア内の証明書をすべて取得したのち、設定ファイルに設定したサブジェクトと一致する証明書をhttepwebrequestオブジェクトにAddして使用しています

・HTTPS通信に失敗しているPCに別のクライアント証明書を使用するように設定して、HTTPS通信を行っても通信に失敗します。
逆に、HTTPS通信に失敗しているPCで使用していたクライアント証明書を物理マシンで使用すると特に問題なくHTTPS通信を行うことができます。

・IIS上のSSLの設定について、「クライアント証明書」の設定を「無視」もしくは「受理」に設定すると通信ができることは確認しています。

・クライアント証明書の発行元となったCAの証明書は信頼されたルート証明機関にインストール済みです。
IISサーバ及びHTTPS通信に失敗しているPC上の証明書ストアを「mmc」で開き、クライアント証明書をダブルクリックして証明書のパスを表示すると特に問題は見当たりませんでした。

・明示的にhttp1.1を使うように実装変更してみましたが効果がありませんでした。

・request.ClientCertificates.Add後に、request.ClientCertificates.Countを表示すると1でした。

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

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

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

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

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

hihijiji

2019/01/12 09:46

仮想PCにFiddlerをインストールして、キャプチャしてみてください。
SNB53857

2019/01/13 01:32

hihijiji様 早速の助言、誠にありがとうございます。 >仮想PCにFiddlerをインストールして、キャプチャしてみてください。 仮想PC側にFiddlerをインストールするのは少し難しい状況です。 といいますのは、今回クライアント証明書が必要なソフトウェアに入れ替えた仮想PCはすでにお客様に納入しているシステムの一部で、不適合があった際に持ち帰り・原因調査としているため、直接Fiddlerをインストールできません。 代わりに近い環境(LANや、スイッチなどお客様環境を完全に再現できるわけではありませんが)が近々使用できますのでそこでも403.7が発生すればFiddlerをインストールしてキャプチャしてみたいと思います。 以下、追加で確認しました。 ・IISのクライアント証明書マッピング機能で「1(ユーザ)対多(証明書)」でマッピングしてみました。 →クライアント証明書の利用組織は同じなので、それを条件に絞り込み →当該マシンからの通信だけマッピングしたユーザ名が表示されておらず、やはり「403.7」が記録されていました 以上、よろしくお願いいたします。
hihijiji

2019/01/14 01:22

通信経路でユーザ名が消える可能性はかなり低いので、客先の仮想マシンでユーザ名が取得できてない可能性が高くなりますね。 キャプチャできないなら、loggerにエラーだけでなく、WebRequestの内容も出力するようにしたら何か判るかもしれません。
SNB53857

2019/01/15 01:18

hihijiji様 助言いただきありがとうございます。 一度Requestをログ出力してみます。 以下、追加情報です。 ・当該仮想PCはほとんどWindowsUpdateが実行できていない  仮想PCで動作させているソフトウェア(今回のものとは別)の動作保証のため、  WindowsUpdateが長らく実施されていないようです
SNB53857

2019/01/16 00:58

いくつかのログ出力を追加してみました。 Request.headers:Content-Type: application/json; charset=utf-8 Request.AuthenticationLevel:MutualAuthRequested Request.ClientCertificates[0].Subject:想定されたクライアント証明書のサブジェクト Request.ClientCertificates[0].GetEffectiveDateString():想定されたクライアント証明書の開始時間 Request.ClientCertificates[0].GetExpirationDateString():想定されたクライアント証明書の終了時間 →秘密鍵を正しく取り出せているかは不明(検証方法がわかりません)
SNB53857

2019/01/16 01:00

以下は、webExの内部を表示したものです <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> <title>403 - Forbidden: Access is denied.</title> <style type="text/css"> <!-- body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;} fieldset{padding:0 15px 10px 15px;} h1{font-size:2.4em;margin:0;color:#FFF;} h2{font-size:1.7em;margin:0;color:#CC0000;} h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} #header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF; background-color:#555555;} #content{margin:0 0 0 2%;position:relative;} .content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;} --> </style> </head> <body> <div id="header"><h1>Server Error</h1></div> <div id="content"> <div class="content-container"><fieldset> <h2>403 - Forbidden: Access is denied.</h2> <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3> </fieldset></div> </div> </body> </html>
SNB53857

2019/01/16 02:46

現在非常に気になっているので以下のことを調べています。 ・Windows7で扱うことができるクライアント証明書の署名アルゴリズム   当該仮想PCは事情があり長らくアップデートされていない状態です   そのうえで、発行されているクライアント証明書は署名アルゴリズムがSHA512ですので、   そこが原因となっていないか    使用している.netframeworkは4.6ですが、httpwebrequestで使用する証明書を取り出すとき、    Windows7のアップデート状況に引っ張られたりしないか?
SNB53857

2019/01/17 07:03

hihijiji様 情報を共有いただき誠にありがとうございます。 以下を実施してみます。 ・仮想PCに上記アップデートが適用されているか確認 ・物理マシンに未アップデートのWindows7を用意し、当該ソフトを動作させる   403.7となるなら上記アップデートを適用しどうなるかを確認
SNB53857

2019/02/12 02:43

しばらく別件で立て込んでいたため、更新が遅れてしまい申し訳ございませんでした。 ・仮想PCに上記アップデートが適用されているか確認  →未適用状態でした   Update自体は、本件を解決できると確信された時点でインストールできるようになります ・物理マシンに未アップデートのWindows7を用意し、当該ソフトを動作させる   403.7となるなら上記アップデートを適用しどうなるかを確認  →ほとんど何も当たっていない状態のWindows7Embeddedが準備できましたので、   .netframework4.6と当該ソフトのみをインストールし、動作させてみましたが   特に問題なくサーバとクライアント証明書を使って通信ができているようです
hihijiji

2019/02/12 04:04

問題の起きている仮想マシンのイメージを複製して、別のVMで件のパッチを当ててみるとか… PS.修正依頼欄で話すのもなんですが、回答と言えるほどのレスでもないんですよね…
SNB53857

2019/02/13 07:06

>・物理マシンに未アップデートのWindows7を用意し、当該ソフトを動作させる >  403.7となるなら上記アップデートを適用しどうなるかを確認 > →ほとんど何も当たっていない状態のWindows7Embeddedが準備できましたので、 >  .netframework4.6と当該ソフトのみをインストールし、動作させてみましたが >  特に問題なくサーバとクライアント証明書を使って通信ができているようです 上記を確認した際に、IIS側のSSL設定でクライアント証明書の使用を必須に変更することを忘れておりました。 先ほど確認したところ、403.7エラーが発生して通信を行うことができないことを確認できました。  接続先はWindowsServer2016   別のサーバ(WindowsServer2012)に接続を行った際は通信を行うことができました WindowsServer2016+クライアント証明書必須設定+sha2のクライアント証明書をWindowsUpdateがされていないWindows7で使用 =403.7エラーが発生しているようでした
hihijiji

2019/02/14 03:10

原因が特定できたみたいでよかったですね。 お疲れさまでした。 解決したら回答欄に書いて自己解決でお願いします。
guest

回答1

0

自己解決

本件について、原因及び解決方法を記載します。

・原因
クライアント認証を用いて、httpsでサーバへ接続を行うWindows7マシンについて、
WindowsUpdateが実施されていないこと
また、使用しているクライアント証明書について署名アルゴリズムが「RSA512」であったこと
→比較的新しい署名アルゴリズムが使用されていると問題が発生するようです
→本件は、仮想PC・物理PCの違いは無いようでした

・解決方法
通常のWindowsUpdateを実行

もしくは、以下の順で手動アップデートを実行
→都度再起動が要求されますが、最期に再起動すれば問題ないことを確認しています
1.KB2973337インストール

2.KB3035131インストール

3.KB3033929インストール

解決方法の投稿が遅くなり申し訳ございませんでした
hihijiji様 本件について解決にご助力いただき誠にありがとうございました

投稿2019/08/06 08:11

SNB53857

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問