Dostarczono plik .p12 w celu połączenia się z usługą internetową za pośrednictwem protokołu SSL przy użyciu uwierzytelniania za pomocą certyfikatu klienta. Mam to pomyślnie działa w PHP, przy użyciu cURL. Są to opcje używam podczas wykonywania żądania:Łączenie się z usługą sieci Web przy użyciu uwierzytelniania certyfikatem klienta
$headers = array(
'Method: POST',
'Connection: Keep-Alive',
'User-Agent: PHP-SOAP-CURL',
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: "'.$action.'"',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $location);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_SSLCERT, $this->clientcert);
curl_setopt($ch, CURLOPT_SSLKEYTYPE, $this->clientcerttype);
curl_setopt($ch, CURLOPT_SSLKEY, $this->keyfile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $this->keypassword);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
$response = curl_exec($ch);
Jestem teraz próbuje zrobić to samo zadanie przy użyciu C# i .NET, ale wciąż otrzymuję błąd „nie można ustanowić bezpiecznego kanału SSL/TLS z uprawnieniem ":". ".
Nie wydaje mi się, żebym miał problem z lokalizacją klucza, i nie wydaje się, aby istniały jakiekolwiek problemy z zaufaniem. Jednak coś jest nie tak, gdzieś po drodze.
Zrobiłem program testowy, po prostu mogę przetestować, że podstawowe połączenie zadziała.
public void StartviaWSHttp()
{
var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
binding.Security.Message.NegotiateServiceCredential = false;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
var baseAddress = new Uri("https://<host>:<port>/LineEndpoint1");
var endpointAddress = new EndpointAddress(baseAddress);
var client = new LinePortTypeClient(binding, endpointAddress);
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySerialNumber, "00d48a233bf4b77523");
Debug.Assert(client.ClientCredentials.ClientCertificate.Certificate.SerialNumber.ToLower() == "00d48a233bf4b77523");
var header = new ctSoapHeaderMsg();
var response = new object();
client.Open();
var responseCode = client.PerformFunction(ref header, "0893411111", out response);
client.Close();
Console.WriteLine("Response Code :" + responseCode);
Console.WriteLine("Response :" + response);
}
Kiedy przeglądam certyfikat w osobistych/certyfikatach dla bieżącego użytkownika, nie zgłaszam żadnych problemów związanych z zaufaniem. W informacji o certyfikacie jest napisane, że certyfikat jest przeznaczony do następujących celów: Wszystkie zasady wystawiania i wszystkie zasady dotyczące aplikacji. Ścieżka certyfikacji ma tylko jeden wpis, a status certyfikatu informuje, że "Ten certyfikat jest OK".
Brakuje mi informacji o problemie. Być może jest problem zaufania, ponieważ mam weryfikację PEER i HOST dla wywołania PHP. Nie jestem pewien, czy jest to opcja dla C#.
Aktualizacja: (9 sierpnia 2013), skonfigurować trochę rozwlekły śledzenie System.Net i System.Net.Socket. To jest początek wyjścia.
System.Net Verbose: 0 : [16124] WebRequest::Create(https://dsl-wholesale-testing.iinet.net.au:50500/LineEndpoint1)
System.Net Verbose: 0 : [16124] HttpWebRequest#58508234::HttpWebRequest(https://dsl-wholesale-testing.iinet.net.au:50500/LineEndpoint1#128335743)
System.Net Information: 0 : [16124] Current OS installation type is 'Client'.
System.Net Information: 0 : [16124] RAS supported: True
System.Net Verbose: 0 : [16124] Exiting HttpWebRequest#58508234::HttpWebRequest()
System.Net Verbose: 0 : [16124] Exiting WebRequest::Create() -> HttpWebRequest#58508234
System.Net Verbose: 0 : [16124] ServicePoint#36898364::ServicePoint(dsl-wholesale-testing.iinet.net.au:50500)
System.Net Information: 0 : [16124] Associating HttpWebRequest#58508234 with ServicePoint#36898364
System.Net Verbose: 0 : [16124] HttpWebRequest#58508234::GetRequestStream()
System.Net Information: 0 : [16124] Associating Connection#47995487 with HttpWebRequest#58508234
System.Net.Sockets Verbose: 0 : [16124] Socket#31002555::Socket(AddressFamily#2)
System.Net.Sockets Verbose: 0 : [16124] Exiting Socket#31002555::Socket()
System.Net.Sockets Verbose: 0 : [16124] Socket#6243847::Socket(AddressFamily#23)
System.Net.Sockets Verbose: 0 : [16124] Exiting Socket#6243847::Socket()
System.Net.Sockets Verbose: 0 : [16124] DNS::TryInternalResolve(dsl-wholesale-testing.iinet.net.au)
System.Net.Sockets Verbose: 0 : [16124] Socket#31002555::Connect(203.173.51.130:50500#-2110560113)
System.Net.Sockets Information: 0 : [16124] Socket#31002555 - Created connection from 192.168.190.202:55397 to 203.173.51.130:50500.
System.Net.Sockets Verbose: 0 : [16124] Exiting Socket#31002555::Connect()
System.Net.Sockets Verbose: 0 : [16124] Socket#6243847::Close()
System.Net.Sockets Verbose: 0 : [16124] Socket#6243847::Dispose()
System.Net.Sockets Verbose: 0 : [16124] Exiting Socket#6243847::Close()
System.Net Information: 0 : [16124] Connection#47995487 - Created connection from 192.168.190.202:55397 to 203.173.51.130:50500.
System.Net Information: 0 : [16124] TlsStream#29695768::.ctor(host=dsl-wholesale-testing.iinet.net.au, #certs=0)
System.Net Information: 0 : [16124] Associating HttpWebRequest#58508234 with ConnectStream#25001628
System.Net Verbose: 0 : [16124] Exiting HttpWebRequest#58508234::GetRequestStream() -> ConnectStream#25001628
System.Net Verbose: 0 : [16124] ConnectStream#25001628::Write()
System.Net Verbose: 0 : [16124] Data from ConnectStream#25001628::Write
System.Net Verbose: 0 : [16124] (printing 1024 out of 1206)
System.Net Verbose: 0 : [16124] 00000000 : 3C 73 3A 45 6E 76 65 6C-6F 70 65 20 78 6D 6C 6E : <s:Envelope xmln
Linia System.Net Information: 0 : [16124] TlsStream#29695768::.ctor(host=dsl-wholesale-testing.iinet.net.au, #certs=0)
sugeruje, że żadne certyfikaty zostały podniósł do użytku, mimo że został dołączony certyfikat na client.ClientCredentials.ClientCertificate, ale nie jestem pewien, dlaczego tak się dzieje i jak spraw, by się trzymał. Czy wszystkie właściwości certyfikatu muszą pasować do nazwy hosta, z którą się łączę?
Interesujące. Otrzymuję dokładnie ten sam błąd z tym samym kodem i tym samym certyfikatem TLS nr 0 w śledzeniu, ale wiem na pewno, że serwer obsługuje TLS 1.2. Jestem na końcu rozumu. – ajeh
System.Net.ServicePointManager.SecurityProtocol jest flagą, więc można określić dodatkowe SecurityProtocolTypes za pomocą bitowego operatora LUB. Jeśli masz tylko Ssl13, wtedy wszystkie Tls będą ignorowane (zakładając, że odnosisz się do kodu C#, a nie do Curl PHP). – Reuben
W elemencie zabezpieczającym powiązania usługi WWW potrzebny był dodatkowy element ' ", którego brakowało. Dodano i wszystko działało. –
ajeh