У меня есть такой код:
string certificateFilePath = @"C:\Users\Administrator\Documents\Certificate.pfx";
string certificateFilePassword = "Some Password Here";
X509Certificate clientCertificate = new X509Certificate(certificateFilePath, certificateFilePassword);
TcpClient client = new TcpClient(host, port);
SslStream stream = new SslStream(client.GetStream(), false, (sender, certificate, chain, errors) => true);
X509CertificateCollection clientCertificates = new X509CertificateCollection {clientCertificate};
stream.AuthenticateAsClient(host, clientCertificates, SslProtocols.Tls, false);
Когда я запускаю код в консольном приложении, все работает нормально, stream.IsAuthenticated
и stream.IsMutuallyAuthenticated
возвращают true
, а stream.LocalCertificate
содержит правильный объект сертификата.
Однако при выполнении того же самого кода в Windows Service (as LOCAL SYSTEM user)
, хотя stream.IsAuthenticated
возвращает true
, stream.IsMutuallyAuthenticated
возвращает false
, а stream.LocalCertificate
возвращает null
.
Это происходит, когда в обоих сценариях после запуска первой строки clientCertificate
загружаются правильные данные сертификации и содержится правильная информация для Subject
и Issuer
сертификата.
Я также попытался заставить SslStream выбрать сертификат, используя этот код:
string certificateFilePath = @"C:\Users\Administrator\Documents\Certificate.pfx";
string certificateFilePassword = "Some Password Here";
X509Certificate clientCertificate = new X509Certificate(certificateFilePath, certificateFilePassword);
TcpClient client = new TcpClient(host, port);
SslStream stream = new SslStream(client.GetStream(), false, (sender, certificate, chain, errors) => true, (sender, host, certificates, certificate, issuers) => clientCertificate);
X509CertificateCollection clientCertificates = new X509CertificateCollection {clientCertificate};
stream.AuthenticateAsClient(host, clientCertificates, SslProtocols.Tls, false);
Однако код по-прежнему не работает, и stream.IsMutuallyAuthenticated
возвращает false
, а stream.LocalCertificate
возвращает null
.
Я изучаю это уже несколько дней и не могу понять. Любая помощь высоко ценится.
Изменить: после попытки получить сертификат с помощью инструмента WinHttpCertCfg оказалось, что в отличие от аналогичный вопрос (ы), учетная запись LOCAL SYSTEM уже имеет доступ к закрытому ключу для целевого сертификата, как вы можете видеть на рисунке ниже: Таким образом, проблема остается нерешенной.
NETWORK SERVICE
илиLOCAL SERVICE
вместоLOCAL SYSTEM
? - person Camilo Terevinto   schedule 10.07.2017NETWORK SERVICE
,LOCAL SERVICE
иLOCAL SYSTEM
@CamiloTerevinto - person Rojan Gh.   schedule 10.07.2017