web-dev-qa-db-fra.com

Service Web SSL: impossible de créer un canal sécurisé SSL/TLS

Mon application C # .net utilise un service Web HTTPS. Alors que le certificat est sur le point d'expirer, j'essaie de le mettre à jour avec un nouveau qui m'a été attribué (un fichier .jks que j'ai converti en .p12 à l'aide du logiciel keytool de javasdks). Je pensais que ce serait facile, car je sais comment le faire, mais cela ne veut tout simplement pas coopérer.

Ce que j'ai fait jusqu'à présent:

  • Certificat importé dans CURRENT_USER\Personal
  • Certificat importé dans LOCAL_MACHINE\Personal
  • Compte tenu du bon utilisateur (apppoolidentity), accès à la clé privée du certificat via l’outil winhttpcertcfg. Vous trouverez ci-dessous une liste des droits Pour le certificat.
  • en utilisant l’outil findprivatekey, j’ai également localisé le fichier de clé et lui a donné l’accès à apppoolidentity. (En désespoir de cause).

    C:\Program Files (x86)\Kits de ressources Windows\Tools> winhttpcertcfg -l -c LOCAL_MACHINE\My -s "9000 - Blabla" Outil de configuration de certificat Microsoft (R) WinHTTP Copyright ( C) Microsoft Corporation 2001.

    Certificat correspondant: CN = 9000 - Blabla C = NON 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-AUTORISÉ

    Les comptes et groupes supplémentaires ayant accès à la clé privée incluent: BUILTIN\Administrators NT AUTHORITY\SYSTEM IIS APPPOOL\ASP.NET v4.0 BUILTIN\Utilisateurs NT AUTHORITY\NETWORK SERVICE DIGITROLLDMZ\IIS_WPG

L'URL que j'accède ressemble à ceci:

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

... Si j'y accède à partir du navigateur Web des serveurs, je sélectionne un certificat, je sélectionne le nouveau, et le message indique que tout va bien, vert et SSL dans l'ordre, mais mon code d'application, qui ressemble à ceci:

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;
    }

N'émet que cette erreur:

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

... J'ai ajouté des informations de trace/débogage à web.config, et j'ai découvert l'erreur:

[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] 

Je sais que cela donne l'impression que le bon utilisateur/identité n'a pas accès au certificat (à partir de winhttpcertcfg), mais je suis sûr que c'est le cas, c'est pourquoi je suis perdu ici,

en espérant que quelqu'un avec quelques compétences sérieuses en https-certificate/web-service puisse m'aider ici :-)

Merci.

Cordialement, Jørgen E.

edit1: modification du titre en quelque chose de plus précis. edit2: Nouvelle information:

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
9
Jørgen Eide

Problème résolu, un certificat intermédiaire semblait manquant, importé dans des certificats intermédiaires dans MMC, et tout allait bien :-)

3
Jørgen Eide

Peu de choses peuvent être extraites du journal, mais ...

Google-fu donne le résultat suivant: 0x80090010 est très probablement une erreur d'accès au certificat.

À partir de là, avec une forte probabilité, je conclus que vous devez définir des autorisations pour votre clé privée de certificat SSL - afin que IIS puisse y accéder. Voir: http : //www.dotnetnoob.com/2011/01/how-to-give-iis-access-to-private-keys.html

Question similaire avec une autre option: La demande a été abandonnée: impossible de créer le canal sécurisé SSL/TLS

12
DarkWanderer

Réponse tardive, mais je me suis retrouvé coincé dans le même problème et la modification suivante a corrigé le problème pour moi. Essayez de modifier la ligne ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; Avec le mot un en dessous - ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072;

P.S - J'utilise .Net Framework 3.5 dans mon application.

0
skhan247386