
Ich muss den Server-Webdienst mit einem Client-Zertifikat aufrufen. Sie haben mir eine .crt-Datei bereitgestellt. Ich hoste mein Projekt in WindowsServer2008 IIS7.
Ich installiere .crt über die Eigenschaften mit der rechten Maustaste, da ich über die vollständige Zertifikatsanforderung kein Zertifikat zu den Serverzertifikaten hinzufügen kann. Ich habe den Fehler erhalten:
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
Ich habe gegoogelt und nichts darüber gefunden, wie man ein .crt-Client-Zertifikat installiert. Habe auch versucht, es zu installieren, wie erklärtHierauf Schritt 4
Und als ich so anrief
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
Ich habe den Fehler erhalten: System.IO.IOException: Der Handshake ist aufgrund eines unerwarteten Paketformats fehlgeschlagen. bei System.Net.Security.SslState.StartReadFrame (Byte[] Puffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) bei System.Net.Security.SslState.StartReceiveBlob (Byte[] Puffer, AsyncProtocolRequest asyncRequest) bei System.Net.Security.SslState.CheckCompletionBeforeNextReceive (ProtocolToken-Nachricht, AsyncProtocolRequest asyncRequest) bei System.Net.Security.SslState.StartSendBlob (Byte[] eingehend, Int32 Anzahl, AsyncProtocolRequest asyncRequest) bei System.Net.Security.SslState.ForceAuthentication (Boolean receiveFirst, Byte[] Puffer, AsyncProtocolRequest asyncRequest) bei System.Net.Security.SslState.ProcessAuthentication (LazyAsyncResult lazyResult) bei System.Net.TlsStream.CallProcessAuthentication (Objektstatus) bei System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, ContextCallback-Rückruf, Objektstatus, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback-Rückruf, Objektstatus, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback-Rückruf, Objektstatus) bei System.Net.TlsStream.ProcessAuthentication (LazyAsyncResult-Ergebnis) bei System.Net.TlsStream.Write (Byte[]-Puffer, Int32-Offset, Int32-Größe) bei System.Net.PooledStream.Write (Byte[]-Puffer, Int32-Offset, Int32-Größe) bei System.Net.ConnectStream.WriteHeaders (Boolean async) bei System.Web.Services.Protocols.WebClientProtocol.GetWebResponse (WebRequest-Anforderung) bei System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse (WebRequest-Anforderung) bei System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (String methodName, Object[]-Parameter) bei …..
Hat das etwas mit der Installation und dem Aufruf meines Zertifikats zu tun? Kann mir jemand sagen, wo ich einen Fehler gemacht habe?
Antwort1
Ich glaube, es hat mit Ihrer Berufung zu tun: den Schritten, die Sie befolgen sollten.
Um mit roher Gewalt zum Kern Ihres Problems vorzudringen, gehen Sie folgendermaßen vor:
Verwenden Sie ein völlig anderes neues Projekt, um Code zu erstellen, nur um den Teil zur Serverauthentifizierung mit den Schritten in Ihrem Link zu testen, auf den Sie als „hier“ verweisen. Auf diese Weise können Sie andere Probleme vermeiden, die Ihre Debugging-Fähigkeiten beeinträchtigen können.
Zur schnellen Überprüfung:
Erster Versuch Stellen Sie sicher, dass Sie nicht TLS anstelle von SSL benötigen, indem Sie stattdessen eine EXPLIZITE TLS-Verbindung verwenden:
Überprüfen Sie alle Methoden im Verbindungsobjekt, die TLS starten http://www.limilabs.com/blog/der-handshake-fehlgeschlagen-durch-ein-unerwartetes-paketformat
client.Connect("mail.example.com");
client.StartTLS();
Oder versuchen Sie dies https://social.msdn.microsoft.com/Forums/en-US/e8807c4c-72b6-4254-ae64-45c2743b181e/ssltls-der-Handshake-ist-aufgrund-eines-unerwarteten-Paketformats-Mercury-für-win32-pop3-fehlgeschlagen?forum=ncl
In Deiner Protokollierung scheinen vier Durchläufe zu sein (Prozesse 5068, 3984, 1628 und 7124)? Funktionieren die letzten drei? Hast Du etwas geändert?
Zumindest für 5068SindLesen einer Antwort nach dem Senden des STLS-Befehls, aber Sie sindnichtLesen der ersten „Ich lebe“-Zeile des Servers. Siehe z. B. in Wikipedia:
S: C: S: +OK POP3-Server bereit <[email geschützt]>
Sie müssen also diese Zeile lesen,VorSie senden den STLS-Befehl. Sie können in 5068 sehen, dass der SslStream die Antwort +OK B[egin SSL...] anstelle der SSL-Antwort erhält.
Später: Ich sehe jetzt, was passiert. In den anderen drei Läufen liest der Stream.Read-Vorgang beide Antwortzeilen! Es ist also reine Glückssache, ob es funktioniert oder nicht.
Beispielsweise habe ich in meinem vorherigen Beispiel nicht beide Zeilen gedruckt. Beim Drucken beider Zeilen sehe ich jetzt:
D:\Temp>SslStartTest.exe -client2 localhost 110 bzw.: +OK <[email geschützt]>, POP3-Server bereit. resp: +OK SSL/TLS-Verhandlung beginnen... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors TLS-Sitzung verbunden. :-) Chiffre: TripleDes Stärke 168 Hash: Sha1 Stärke 160 Schlüsselaustausch: RsaSign Stärke 1024 Protokoll: Tls Ist authentifiziert: True als Server? False IsSigned: True Ist verschlüsselt: True Zertifikatsperrliste geprüft: False Lokales Zertifikat ist null. Remote-Zertifikat wurde an CN=alanjmcf.example.com ausgestellt und ist gültig vom 03.04.2009 1 0:47:40 bis 29.03.2029 10:47:40. Kann lesen: True, schreiben True Kann Timeout: True ^C