Ответ 1
Я считаю, что все это сейчас работает на меня. Ниже приведен пример шагов, которые я предпринял для того, чтобы заставить вещи течь:
ЗАМЕЧАНИЯ SSL
SSL и SignalR (Owin WebApplication) требуют привязки сертификата к порту.
- Используйте IIS для создания самозаверяющего сертификата, это должно поместить сертификат в папку LOCAL COMPUTER > Personal > Certificates в CERTMGR
- В списке CERTMGR + перетащите сертификат в локальный компьютеp > доверенные корневые центры сертификации > папка сертификатов, в которой должна быть сделана его копия.
-
Выполните следующую команду, чтобы привязать сертификат SSL к 0.0.0.0:8080
netsh http add sslcert ipport=0.0.0.0:8080 certhash=123456f6790a35f4b017b55d09e28f7ebe001bd appid={12345678-db90-4b66-8b01-88f7af2e36bf} netsh http show urlacl > D:\urlacl.txt
Вывод:
Reserved URL : https://*:8080/ User: SOMEWHERE\Administrator Listen: Yes Delegate: No SDDL: D:(A;;GX;;;S-1-5-21-138209071-46972887-2260295844-1106)
-
Запустите следующую команду NETSH, чтобы зарезервировать все IP-адреса для порта 8080 для идентификатора приложения и службы сервиса My Service
netsh http add urlacl url=https://*:8080/ user=SOMEWHERE\Administrator listen=yes netsh http show sslcert > D:\sslcert.txt
Вывод:
IP:port : 0.0.0.0:8080 Certificate Hash : 123456f6790a35f4b017b55d09e28f7ebe001bd Application ID : {12345678-db90-4b66-8b01-88f7af2e36bf} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
-
Обновите файл MyServices.exe.config для использования протокола https (это клавиши appSetting, используемые для динамического установления протокола и порта SignalR при запуске My Service)
<add key="SrProtocol" value="https" /> <add key="SrPort" value="8080" />
-
Запустите My Service, используя команду NETSTAT START
-
Запустите следующую команду NETSH, чтобы показать, что состояние службы занимает зарегистрированный URL
netsh http show servicestate > D:\servicestate.txt
Вывод:
Server session ID: C300000320000039 Version: 2.0 State: Active Properties: Max bandwidth: 4294967295 Timeouts: Entity body timeout (secs): 120 Drain entity body timeout (secs): 120 Request queue timeout (secs): 120 Idle connection timeout (secs): 120 Header wait timeout (secs): 120 Minimum send rate (bytes/sec): 150 URL groups: URL group ID: C600000340000138 State: Active Request queue name: Request queue is unnamed. Properties: Max bandwidth: inherited Max connections: inherited Timeouts: Timeout values inherited Number of registered URLs: 1 Registered URLs: HTTPS://*:8080/
Мое приложение НЕ зависит от IIS, но как только я использовал IIS для временного создания привязки порта к моему SSL-сертификату, мое приложение начало работать, и я смог проверить сервис-службу NETSH, чтобы узнать, как это работает IIS. С тех пор я сменил привязку IIS и прошел через заметки о настройке и все еще имею успех.
My Owing startup выглядит примерно так:
private void configureMessaging()
{
string registerUrl = string.Format("{0}://*:{1}", Service.Server.SrProtocol, Service.Server.SrPort);
try
{
#if DEBUG
//System.Diagnostics.Debugger.Launch();
#endif
// Starts an owin web application to host SignalR, using the protocol and port defined.
WebApp.Start<StartUp>(registerUrl);
}
catch (Exception ex)
{
Logger.Logs.Log(string.Format("Failed to configure messaging. Exception: {0}", ex.RecurseInnerException()), LogType.Error);
if (ex is HttpListenerException || ex.InnerException is HttpListenerException)
{
try
{
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "netsh.exe";
p.StartInfo.Arguments = string.Format("netsh http delete urlacl url={0}"
, registerUrl
);
p.Start();
p.StandardOutput.ReadToEnd();
p.WaitForExit();
}
catch (Exception exP)
{
Logger.Logs.Log(string.Format("Failed to delete urlacl {0}. Exception: {1}"
, registerUrl
, exP.RecurseInnerException()
)
, LogType.Error
)
;
retries = 5;
}
}
if (retries < 5)
{
retries++;
Logger.Logs.Log(string.Format("Attempting to configure messaging again. Attempt No. {0}", retries), LogType.Warn);
Thread.Sleep(1000);
configureMessaging();
}
else
Logger.Logs.Log(string.Format("Exceeded total number of retries to configure messaging.", retries), LogType.Error);
}
}
И самообслуживаемые экземпляры HubConnetion выглядят следующим образом:
public IHubProxy MyHubProxy
{
get
{
if (this._MyHubProxy == null)
{
var connection = new HubConnection(string.Format("{0}://{1}:{2}/"
, Settings.GetSetting(Settings.Setting.SrProtocol)
, MyHub.GetLocalhostFqdn(null)
, Settings.GetSetting(Settings.Setting.SrPort)
)
)
;
this._MyHubProxy = connection.CreateHubProxy("MyHub");
if (File.Exists("My.cer")
&& Settings.GetSetting(Settings.Setting.SrProtocol).Equals("https", StringComparison.InvariantCultureIgnoreCase))
connection.AddClientCertificate(X509Certificate.CreateFromCertFile("My.cer"));
connection.Start().Wait();
}
return this._MyHubProxy;
}
}
Здесь есть немного больше кода, чем релевантно, но, надеюсь, он может помочь!