Hoi Allen,
Ik zit hier nu enkele dagen met een probleem waarmee ik totaal niet verder kom. Ik doe dit alles op 1 Windows XP machine.
Ik probeer vanuit een ASP.NET applicatie een webservice aan te roepen die een client-certificaat
in het SOAP bericht verwacht. Dit ging in eerste instantie allemaal goed tijdens het ontwikkelen.
Ik maakte daarbij gebruik van de ingebouwde ASP.NET Development Server.
Nu wilde ik aan mijn interne collega's een kleine demo geven, dus ik publish ,mijn project op een interne
(IIS)webserver. Als ik daarop de webservice aanspreek krijg ik telkens de melding HTTP 403 FORBIDDEN.
Ik ben gaan zoeken en zoeken en overal kwam ik antwoorden tegen dat het certificaat niet gelezen kon worden
door een rechten probleem (ASPNET user zou geen rechten hebben op de certificaten store). Nadat ik de oplossing van vele
gebruikt heb om de rechten te corrigeren werkt het helaas nog niet.
Het test certificaat dat ik van de eigenaar van de webservice heb gehad was een PKI certificaat in de vorm van een p12 bestand met bijhorend wachtwoord.
In het SOAP bericht moet ik een X509 certificaat stoppen. Ik heb ondertussen drie manier gevonden om te zorgen dat het certificaat in het bericht gestopt
word. Het is trouwens de bedoeling dat alle client certificaten op de webserver blijven liggen, en op basis van gegevens van de ingelogde gegeven dat
het juiste certificaat geladen gaat worden.
Manier1:
Met de hand het PKI bestand importeren en vervolgens exporteren naar een X509 .cert file op de hardeschijf (dus niet in een user of machine store).
Bij het aanroepen van de webservice gebruik ik dan de volgende code:
Manier2:
Het PKI bestand importeren in de LocalMachine\My Store. Vervolgens rechten uitdelen voor het ASP.NET account met het 'winhttpcertcfg' tool.
Importeren:
winhttpcertcfg -i "c:\2\Certificates\3-7-2006_04500008.P12" -c LOCAL_MACHINE\My -p "******"
Rechten
winhttpcertcfg -g -c LOCAL_MACHINE\My -s "RDW Acceptatietest" -a "ASPNET"
Manier3:
Niet eerst importen of exporten in de store of naar een .cert bestand, maar direct het PKI certificaat laden en deze vanuit code te exporteren.
Verder vond ik ook nog wat tips dat mensen zeiden dat het met de credentials of proxy te maken had. Daarom heb ik de volgende regels ook maar opgenomen, helaas ook zonder resultaat.
Weet misschien iemand hier wat ik nu fout doe of vergeet waardoor mijn code wel werkt vanuit de ASP.NET Development Server en niet vanuit IIS.
Ik zit hier nu enkele dagen met een probleem waarmee ik totaal niet verder kom. Ik doe dit alles op 1 Windows XP machine.
Ik probeer vanuit een ASP.NET applicatie een webservice aan te roepen die een client-certificaat
in het SOAP bericht verwacht. Dit ging in eerste instantie allemaal goed tijdens het ontwikkelen.
Ik maakte daarbij gebruik van de ingebouwde ASP.NET Development Server.
Nu wilde ik aan mijn interne collega's een kleine demo geven, dus ik publish ,mijn project op een interne
(IIS)webserver. Als ik daarop de webservice aanspreek krijg ik telkens de melding HTTP 403 FORBIDDEN.
Ik ben gaan zoeken en zoeken en overal kwam ik antwoorden tegen dat het certificaat niet gelezen kon worden
door een rechten probleem (ASPNET user zou geen rechten hebben op de certificaten store). Nadat ik de oplossing van vele
gebruikt heb om de rechten te corrigeren werkt het helaas nog niet.
Het test certificaat dat ik van de eigenaar van de webservice heb gehad was een PKI certificaat in de vorm van een p12 bestand met bijhorend wachtwoord.
In het SOAP bericht moet ik een X509 certificaat stoppen. Ik heb ondertussen drie manier gevonden om te zorgen dat het certificaat in het bericht gestopt
word. Het is trouwens de bedoeling dat alle client certificaten op de webserver blijven liggen, en op basis van gegevens van de ingelogde gegeven dat
het juiste certificaat geladen gaat worden.
Manier1:
Met de hand het PKI bestand importeren en vervolgens exporteren naar een X509 .cert file op de hardeschijf (dus niet in een user of machine store).
Bij het aanroepen van de webservice gebruik ik dan de volgende code:
code:
1
| objORB.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certificatePath + departmentWebservices.Xmlmode_rdw_certificaat)) |
Manier2:
Het PKI bestand importeren in de LocalMachine\My Store. Vervolgens rechten uitdelen voor het ASP.NET account met het 'winhttpcertcfg' tool.
Importeren:
winhttpcertcfg -i "c:\2\Certificates\3-7-2006_04500008.P12" -c LOCAL_MACHINE\My -p "******"
Rechten
winhttpcertcfg -g -c LOCAL_MACHINE\My -s "RDW Acceptatietest" -a "ASPNET"
code:
1
2
3
4
5
6
7
8
| X509Store storeMachine = new X509Store(StoreLocation.LocalMachine);
storeMachine.Open(OpenFlags.MaxAllowed);
X509CertificateCollection x509CertCollectMachine = storeMachine.Certificates.Find(X509FindType.FindBySerialNumber, @"00 d5 ec 88 14 65 9d 3b bf b2 9d b3 ff 23 d1 6c f7", false);
for (int i = 0; i < x509CertCollectMachine.Count; i++)
objORB.ClientCertificates.Add(x509CertCollectMachine[i]);
storeMachine.Close(); |
Manier3:
Niet eerst importen of exporten in de store of naar een .cert bestand, maar direct het PKI certificaat laden en deze vanuit code te exporteren.
code:
1
2
3
| X509Certificate clientCertificate = new X509Certificate(); clientCertificate.Import(@"c:\2\Certificates\3-7-2006_04500008.P12", "******", X509KeyStorageFlags.DefaultKeySet); objORB.ClientCertificates.Add(clientCertificate); |
Verder vond ik ook nog wat tips dat mensen zeiden dat het met de credentials of proxy te maken had. Daarom heb ik de volgende regels ook maar opgenomen, helaas ook zonder resultaat.
code:
1
2
3
| objORB.Proxy = System.Net.WebRequest.DefaultWebProxy; objORB.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; objORB.Credentials = System.Net.CredentialCache.DefaultCredentials; |
Weet misschien iemand hier wat ik nu fout doe of vergeet waardoor mijn code wel werkt vanuit de ASP.NET Development Server en niet vanuit IIS.
Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.