Cisco Web Dialer API を使った電話をかけるアプリケーションを以前作った。
Cisco Call Manager(CCM)から Cisco Unified Communications Manager(CUCM)にアップグレードしたことにより、
API も URL や、プロトコル(http → https)が変更になったため、いくつか改修する必要があった。
その際の備忘録。

API URLの変更

Web Service API のURLが変更になっているため、Web参照URLを変更する。

  • 旧:http://CCM_HOST/wdsoap/servlet/rpcrouter
  • 新:https://CUCM_HOST:8443/webdialer/services/WebdialerSoapService

ちなみにWSDLは、下記のように変更されている。

  • 旧:http://CCM_HOST/webdialer/wsdl/WebdialerSoap.wsdl
  • 新:https://CUCM_HOST:8443/webdialer/services/WebdialerSoapService?wsdl

信頼されない証明書の検証を回避する

このままではWebサービス呼び出し時に、SSLの証明書が自己証明書であるため、下記のようなエラーメッセージとともに WebException が発生してしまう。

基礎になる接続が閉じられました:SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした

これを回避するために、WebdialerSoap をインスタンス化する前に、下記を追加する。

// 証明書検証コールバックで常に true を返すようにする
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

System.Net.ServicePointManager.Expect100Continue = false;
System.Net.ServicePointManager.CheckCertificateRevocationList = false;
System.Net.ServicePointManager.DnsRefreshTimeout = 2000;

// WebdialerSoap のインスタンス化
WebdialerSoap wsWebdialerSoap = new WebdialerSoap();

インターネットに接続された環境では、以上で問題なく動作する。
イントラネット内などでインターネットに接続できない場合は、このままは問題がある。

インターネットに接続できない環境の場合

C#アプリケーション(.Netアプリケーション?)における自己証明書によるSSLのWebサービスの利用は、呼び出しの際にルート証明書をMicrosoftのサイトに取得しにいってしまう。インターネットに接続できない環境では、当然SYN_SENTで止まってしまう。 具体的には「wsWebdialerSoap.makeCallSoap()」を呼び出す際に、「www.download.windowsupdate.com」へ接続してしまい、タイムアウトするまで(場合によっては15秒以上)「wsWebdialerSoap.makeCallSoap()」が実行されない。

イベントログには下記のようなエラーが出力される。

ソース:crypt32
イベントID:8
説明:
<http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt>からの
サードパーティのルート一覧シーケンス番号の取得を自動更新できませんでした。エラー:タイムアウト期間が経過したため、
この操作は終了しました。

対処方法としては、CUCMのCA証明書をアプリケーションを実行する側の「信頼されたルート証明機関」に登録すればよい。 CUCMの証明書は https://CUCM_HOST/cmplatform/certificateFindList.do から tomcat.pem をダウンロードし、 CUCM.cer などに名前を変更し、登録すればよい。ドメイン環境であれば、グループポリシーを使うのが楽。

参考サイト