2012-11-16 71 views
9

Moja aplikacja C# .net korzysta z usługi internetowej HTTPS. Ponieważ cerificate ma wkrótce wygaśnie, próbuję zaktualizować go o nowy, który dostałem (plik .jks, który przekonwertowałem na .p12 przy użyciu keytool javasdks). Myślałem, że to będzie łatwe, ponieważ wiem, jak to zrobić, ale po prostu nie będzie współpracować.Usługa SSL Webservice: Nie można utworzyć bezpiecznego kanału SSL/TLS

Co zrobiłem do tej pory:

  • Importowany certyfikat do CURRENT_USER \ Osobiste
  • Importowany certyfikat do LOCAL_MACHINE \ Prywatny
  • uwagi na prawidłowe użytkownik (apppoolidentity) dostęp do klucza prywatnego certyfikatu poprzez narzędzie winhttpcertcfg. Poniżej znajduje się lista praw dla certyfikatu.
  • za pomocą narzędzia findprivatekey, znalazłem również rzeczywisty plik klucza i biorąc pod uwagę dostęp do niego. (W desperacjii).

    C: Program Files \ (x86) \ Windows Resource Kits \ Tools> winhttpcertcfg -l -c LOCAL_MACHINE \ Moje -s "9000 - blabla" Microsoft (R) WinHTTP Configuration Tool Certyfikat Copyright (C) Microsoft Corporation 2001.

    certyfikat Dopasowanie: CN = 9000 - blabla C = NR L = "C/O blaBla AS Blablaaddress" OU = 957839827 OID.1.2.240.111111.1.9.8 = 12345678 OID. 1.2.240.111111.1.9.2 = Test Blabla O = BlaBla AS OU = MULTI-ALLOWED

    Dodatkowe konta i grupy mające dostęp do klucza prywatnego należą: BUILTIN \ Administratorzy NT \ SYSTEM IIS APPPOOL \ ASP.NET v4.0 WBUDOWANE \ Users NT \ NETWORK SERVICE DIGITROLLDMZ \ IIS_WPG

url mam dostępu wygląda mniej więcej tak:

https://test.blabla.com/blabla-5.0/services/Blabla?wsdl 

... Jeśli mam do niego dostęp z serwerów przeglądarki internetowej, I dostać się wybrać certyfikat, ja wybrać nowy, i mówi, że to jest w porządku, zielony i SSL w porządku i wszystko, ale mój kod aplikacji, który wygląda tak:

public static blabla.service.NettforhandlerService getNettforhandlerService(string applicationPath) 
    { 
    blabla.service.NettforhandlerService service = new blabla.service.NettforhandlerService(); 
    if (System.Configuration.ConfigurationManager.AppSettings["CertificateSerialNumber"] != null && System.Configuration.ConfigurationManager.AppSettings["CertificateSerialNumber"].Length > 0) 
    { 
     string serviceurl = service.Url; 
     X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly); 
     X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySerialNumber, System.Configuration.ConfigurationManager.AppSettings["CertificateSerialNumber"], true); 

     ServicePointManager.Expect100Continue = true; 
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 
     ServicePointManager.CertificatePolicy = new TrustHBSCertificatePolicy(); 

     service.ClientCertificates.Add(col[0]); 

    } 
    return service; 
    } 

Tylko wyprowadza ten błąd:

The request was aborted: Could not create SSL/TLS secure channel. 

... Dodałem kilka informacji śledzenia/debug do pliku web.config, a co się dowiedziałem z błędem było to:

[Public Key] 
    Algorithm: RSA 
    Length: 2048 
    Key Blob: 30 82 01 0a 02 82 01 01 00 8e a6 72 c2 e1 67 16 e2 be be c3 30 89 8d bb 57 0b 48 f8 1d 09 b1 e3 26 42 c9 45 9e 02 b2 43 49 16 81 94 1b 18 d6 6d ef .... 
System.Net Information: 0 : [15624] SecureChannel#32061089 - Certificate is of type X509Certificate2 and contains the private key. 
System.Net Information: 0 : [15624] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc  = System.Net.SecureCredential) 
System.Net Error: 0 : [15624] AcquireCredentialsHandle() failed with error 0X8009030D. 
System.Net Information: 0 : [15624] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc  = System.Net.SecureCredential) 
System.Net Error: 0 : [15624] AcquireCredentialsHandle() failed with error 0X8009030D. 
System.Net.Sockets Verbose: 0 : [15624] Socket#38259205::Dispose() 
System.Net Error: 0 : [15624] Exception in the HttpWebRequest#54558071:: - The request was aborted: Could not create SSL/TLS secure channel. 
System.Net Error: 0 : [15624] Exception in the HttpWebRequest#54558071::GetResponse - The request was aborted: Could not create SSL/TLS secure channel. 
System.Net Verbose: 0 : [15624] 

wiem, że to wygląda prawidłowa user/tożsamość hasn dostał ac na certyfikacie (z winhttpcertcfg), ale jestem pewna, że ​​tak, dlatego jestem tu na uboczu,

mając nadzieję, że ktoś z poważnym certyfikatem https/web-service-skills może mi pomóc tutaj :-)

Dzięki.

Pozdrawiam, Jørgen E.

Edit1: zmienił tytuł na bardziej precyzyjne. Edit2: Nowe informacje:

In EventViewer/Windows Logs/Security there is an event "Audit Failure" connected to this: 

Cryptographic operation. 

Subject: 
    Security ID:  IIS APPPOOL\ASP.NET v4.0 
    Account Name:  ASP.NET v4.0 
    Account Domain:  IIS APPPOOL 
    Logon ID:  0x32498 

Cryptographic Parameters: 
    Provider Name: Microsoft Software Key Storage Provider 
    Algorithm Name: Not Available. 
    Key Name: {00E1A3F5-7400-41CA-8290-02983473AEAF} 
    Key Type: Machine key. 

Cryptographic Operation: 
    Operation: Open Key. 
    Return Code: 0x80090010 

Odpowiedz

3

Problem rozwiązany, wydaje certyfikat pośredni brakowało, Sprowadzone go do certyfikatów pośrednich w MMC, i wszystko było dobre :-)

12

Niewiele można wyekstrahować z dziennika, ale ...

Google-fu daje następujący wynik: 0x80090010 jest najprawdopodobniej błąd dostępu certyfikat.

Na tej podstawie, z wysokim prawdopodobieństwem stwierdzam, że trzeba ustawić uprawnienia dla klucza prywatnego certyfikatu SSL, aby usługi IIS mogły uzyskać do niego dostęp. Patrz: http://www.dotnetnoob.com/2011/01/how-to-give-iis-access-to-private-keys.html

Podobne pytanie z innej opcji: The request was aborted: Could not create SSL/TLS secure channel

+3

Cześć, i dzięki za odpowiedź :-) .. Ive obecnie znajduje się plik w tym folderze: C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys ... nazwa pliku jest a23e3996925c33fec814f8ce35e4b1d9_57324829-0d1c-4ae4-ae60-1e2849f7749a ... Jeśli dodam do tego pliku dostęp READ dla aplikacjipozytywnej, to działa !! .. Ale nie jestem w stanie określić, jaki to jest certyfikat, więc mogę dodać dostęp za pomocą odpowiednich środków (winhttpcertcfg) :-(.. Ktoś wie, jak to zidentyfikować? A może wystarczy tylko ręczne dodanie tego dostępu ? –

+1

Możesz użyć narzędzia firmy Microsoft, FindPrivateKey.exe lub po prostu usunąć swój klucz, zapisać listę obecnych plików i ponownie zaimportować certyfikat/klucz (jeśli masz PFX), zauważając, że utworzono nowy plik. Ref: http://msdn.microsoft.com/ru-ru/library/ms732026.aspx (FindPrivateKey) – DarkWanderer

+0

FindPrivateKey i technika, którą określiłeś, są przeciwieństwem tego, co chcę osiągnąć :-) Znam nazwę pliku machinekeys -file i chcę wiedzieć, do jakiego certyfikatu jest dołączony ten plik, ponieważ nie jest to certyfikat, którego używam, zidentyfikowałem certyfikat, którego używam z findprivatekey. –

Powiązane problemy