Ho un servizio Windows (in esecuzione come LocalSystem) che esegue l'auto-hosting di un servizio OWIN (SignalR) e deve essere accessibile tramite SSL.Registrare il certificato nella porta SSL
Posso impostare il binding SSL sul mio computer di sviluppo locale bene - e posso accedere al mio servizio su SSL su quella stessa macchina. Tuttavia, quando vado a un'altra macchina e cercare di eseguire il seguente comando ricevo un errore:
Comando:
netsh http add sslcert ipport=0.0.0.0:9389 appid={...guid here...} certhash=...cert hash here...
Errore:
SSL Certificate add failed, Error: 1312
A specified logon session does not exist. It may have already been terminated.
Il certificato che sto usando è completamente certificato firmato (non un certificato di sviluppo) e funziona sulla mia scatola di sviluppo locale. Ecco quello che sto facendo:
servizio di Windows viene avviato e registra il mio certificato utilizzando il seguente codice:
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
var path = AppDomain.CurrentDomain.BaseDirectory;
var cert = new X509Certificate2(path + @"\mycert.cer");
var existingCert = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false);
if (existingCert.Count == 0)
store.Add(cert);
store.Close();
ho quindi tentare di associare il certificato alla porta 9389 utilizzando netsh e il seguente codice:
var process = new Process {
StartInfo = new ProcessStartInfo {
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = "/c netsh http add sslcert ipport=0.0.0.0:9389 appid={12345678-db90-4b66-8b01-88f7af2e36bf} certhash=" + cert.thumbprint
}
};
process.Start();
Il codice sopra riportato installa correttamente il certificato nella cartella del certificato "Macchina locale - Certificati \ Certificazione radice attendibile \ Certificati", ma il comando netsh non viene eseguito con l'errore descritto sopra. Se prendo il comando netsh e lo eseguo in un prompt dei comandi come amministratore su quella casella, esso genera anche lo stesso errore - quindi non credo che sia un problema relativo al codice ...
Devo immaginare che questo è possibile realizzare - molte altre applicazioni creano servizi self-hosted e li ospitano su ssl - ma non riesco a farlo funzionare per niente ... qualcuno ha qualche suggerimento? Forse alternative programmatiche a netsh?
ho scoperto che se ho generare un certificato auto-firmato sulla macchina che sto avendo problemi con e usa netsh sull'identificazione personale del certificato che funziona - Mi chiedo se c'è un modo per generare un certificato auto-firmato nel codice? –
Si sta importando il certificato da un file .cer, che non include la chiave privata del certificato.Hai bisogno della sua chiave privata per collegarlo a una porta. Per far funzionare il tuo "certificato completamente firmato", devi esportarlo dalla macchina su cui lavora (il tuo computer di sviluppo) _alungo con la chiave privata_ in un file .pfx. Quindi importalo nella macchina su cui stai installando il servizio. Il motivo per cui un certificato autofirmato sulla macchina funziona è perché crea una chiave privata su quella macchina in cui viene generato il certificato. – Scott