IIS6 上の WCF で https 通信をさせる (失敗)

WCF機能 トランスポート セキュリティ にある説明を見る限り、特別な問題があるようには見えなかったのだが、半日戦って全く糸口がつかめなかった。

まず最初に IIS6 上のの WCF ホスティングで http (SSLなし) + basicHttpBindings では通信ができている状況から開始した。

作業中に発生したエラーは

  1. クライアント側のエラーメッセージで「uri のメソッドとして http は無効です」または「uriのメソッドとして https は無効です」
  2. クライアント側のエラーメッセージで 「https://sv.example.com:10444/exampleService.svc というエンドポイントでリッスンしていません」というメッセージが出る
  3. IISで Internal Server Error が発生する。この場合はイベントログにエラー内容が記録される

(1.) については、メッセージの通りで、「トランスポートセキュリティを有効にした場合は、エンドポイントのuriとして https を指定する」(逆に無効にした場合は http を指定する) というルールに違反したことを示している。これは言われたままであるので対応はその場で可能だった。

(2.) の示しているメッセージが問題で、少なくとも表示されたUriをInternet Exploror からアクセスするとデバッグ用のメッセージが正しく表示される状態、ただしそのデバッグ用のメッセージ内に含まれた Uri は「https://マシンに設定された名前:10444/exampleService.svc」になっている。今回NLBに類する状況での運用となるので

  • マシンに設定された名前は外部からアクセスされる名前とは異なる
  • しかも証明書はワイルドカード証明書

当初はサーバ側の設定でもエンドポイントのアドレスを指定していたが、途中から address 属性は削除した。address属性に不正な値を入れた場合はサーバ側ですぐに InternalError 発生するし、そうでない場合は (2) のエラーになるという具合。また ListenUri に目的の https://sv.example.com:10444/exampleService.svc を指定してみたが状況は変わらなかった。Uri を指定する属性は今のところ他に見つかっていない。

IIS6 自体の設定としては WCF Step by Step を参考にして、作業中に以下のような変更をした。

  • 暗号化を必須とするというチェックボックスをオンに変更
  • Windows 認証のチェックボックスをオフに変更
  • .NET Framework 3.0 のコマンド ServiceModelReg.exe /i /x を利用してWCFサービス環境の登録。(httpで通信できていたので関係ないはずだが)

この他 WCF の設定項目として試してみたのは

  • basicHttpBindingのみ
  • basicHttpBinding + Transparentセキュリティ
  • wsHttpBindings + Transparentセキュリティ
  • wsHttpBindings + Messagingセキュリティ (Uriは http) + EstablishSecurityContext

認証なしで通信しようとしているのでざっと見たところでは他に設定項目は無いと思うのだが。

全く分からないので当面はあきらめて Windows サービス かコンソールプログラムでWCFのホストをする予定。WCFのホスティングはIIS6なんぞ使わず Windows 2008 を使うべきなのだろうか。

しかしそもそもの目的が「旧システムに通信口を開ける」なんであまりうれしくない。旧システムらしく asmx なWebサービスで書いた方がよかったのかなあ。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。