2016-05-04 3 views
1

私の質問の最短バージョンは、ServerManager.Binding.Removeを呼び出すと、IISからバインディングが削除されたように見えますが、HTTP.sysまたはSSLバインディングが設定され、私のコードのレイヤーはさらに下がっています。Bindings.Removeを呼び出すとHTTP.sysからSSL証明書が削除されない

私は、SNIを使用してSSLを使用して複数のホスト名をサポートするAzure Cloud Serviceを実行しています。効果的に私がやっているのは、OnStartでServerManager.Binding.Remove(binding)を使ってデフォルトのバインディングを削除し、ServerManager.Binding.Add(binding)を使って自分のバインディングを追加することです。だから、例えば:ポートは、IISバインディングのリストから削除されたバインディングが、私はnetsh http show sslcertを呼び出すとき、それはまだSSLバインディングのリストに表示さ:

ServerManager serverManager = new ServerManager(); 
Site site = serverManager.Sites[0]; 

// Add my site bindings. 
foreach (string host in listOfHostsToBind) 
{ 
    X509Certificate2 cert = LookupCertificate(host.sslThumbprint); 
    var binding = site.Bindings.Add(":443:" + host, cert.GetCertHash(), "My"); 
    binding.SetAttributeValue("sslFlags", 1); //Set SNI flag 
} 

// Remove the default binding 
var bindingsToRemove = new List<Binding>(); 
foreach (Binding binding in site.Bindings) 
{ 
    if (binding.Protocol == "https" && Convert.ToInt64(binding.Attributes["sslFlags"].Value) != 1) 
    { 
     bindingsToRemove.Add(binding); 
    } 
} 

foreach (Binding binding in bindingsToRemove) 
{ 
    site.Bindings.Remove(binding); 
    serverManager.CommitChanges(); 
} 

serverManager.CommitChanges(); 

何が起こってしまい、デフォルトのIPということです。

たとえば、PowershellのGet-WebBindingを呼び出した出力は次のとおりです。ポートバインディングがない:私はnetsh http show sslcertを実行する場合、私は、次を取得しているため、

protocol  bindingInformation      sslFlags 
--------  ------------------      -------- 
http   10.20.30.40:80:       0 
https  :443:myfirstaddedhost.com    1 
https  :443:mysecondaddedhost.com    1 

はよさそうだが、それはまだ動作しません:

IP:port      : 10.20.30.40:443 
Certificate Hash    : xxx 
Application ID    : {00000000-0000-0000-0000-000000000000} 
Certificate Store Name  : MY 
... 

Hostname:port    : myfirstaddedhost.com:443 
Certificate Hash    : xxx 
Application ID    : {4dc3e181-e14b-4a21-b022-59fc669b0914} 
Certificate Store Name  : My 
... 

Hostname:port    : mysecondaddedhost.com:443 
Certificate Hash    : xxx 
Application ID    : {4dc3e181-e14b-4a21-b022-59fc669b0914} 
Certificate Store Name  : My 
... 

なぜだろうデフォルトIPがあることに注意してくださいServerManagerを使用してIISからのバインディングを正常に削除した場合、SSL証明書バインディングはまだそこにありますか?

答えて

0

Azure Portalからリモートデスクトップの役割を設定すると、バインディングが追加されていました。具体的には、ロールの証明書の設定(RDPの設定の一部として行われる)を更新することにより、ロールの証明書の設定が更新されます。これは、RDP経由で、それが失敗し始めた時点で作業していたかどうかをチェックするまで働いていました。もちろん、私は天才だと体系的になり、毎回同じ順序でやることをしていました。つまり、実際にリクエストを試みる前にリモートデスクトップを構成していたので、最初から失敗していたように見えました。 RDPを構成する前に実行していた要求(RDPを実行する前に実行していた要求)を試してみると、それが動作するようになりました。

netsh http delete sslcertを使用してバインディングを削除することはできますが、そのインスタンスへのRDP経由でのログインには影響しません。

あなたがRDPを設定するとき、それはRoleEnvironment.ChangingRoleEnvironment.Changedイベントを呼び出しますが、これらのイベントが呼び出され、残念ながらとき結合がまだ作成されていないので、あなたはコードでバインディングを削除するnetsh http delete sslcertを使用することができ明白な場所はありません。

これは正確に「回答」であるかどうかわかりません。つまり、AzureインスタンスをRDPに設定するか、または証明書設定を変更するとSNIバインディングが破損するという問題がまだ発生しています。 RDPを設定するのに十分な権限を持つ人が2人しかいないため、RDPを使用する必要がある場合は、新しいバインディングを明示的に削除するように訓練することができます。私がこれを完全に防ぐ方法を見つけたら、私はここでフォローアップします。

関連する問題