2013-08-05 17 views
5

İstemci sertifikası kimlik doğrulaması kullanarak bir web hizmetine SSL üzerinden bağlanmak için bir .p12 dosyası verdim. Bunu cURL kullanarak PHP'de başarılı bir şekilde çalışıyorum. isteği gerçekleştirirken Bunlar kullanıyorum seçenekleri şunlardır: Ben şimdi C# ve .NET kullanarak aynı görevi yapmaya çalışıyorumİstemci Sertifikası kimlik doğrulaması kullanarak bir Web Hizmetine bağlanma

$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); 

ama hata "SSL için güvenli bir kanal kurulamadı almaya devam/TLS ile yetki ':'.

Anahtarı bulma konusunda bir sorunum yok gibi görünüyor ve herhangi bir güven sorunu görünmüyor. Yine de, bir şey doğru değil, hatta bir yerlerde.

Bir deneme programı yaptım, böylece temel bir aramanın çalışacağını test edebilirim.

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

ben Güncel Kullanıcı için Kişisel/Sertifikalar sertifikayı görüntülemek

, bu güven konusunda da sorunları bildirmez. Sertifika bilgisinde, aşağıdaki amaçlara yönelik olarak sertifikanın verildiğini belirtir: Tüm verme politikaları ve tüm uygulama politikaları. Sertifika Yolunun yalnızca bir girişi vardır ve Sertifika durumu "Bu sertifika Tamam" mesajını verir.

Sorun nedir? PHP çağrısı için PEER ve HOST doğrulama kapalı olduğundan belki bir güven sorunu vardır. C# için bir seçenek olup olmadığından emin değilim.


Güncelleme: (2013 Ağustos 9) Ben System.Net'teki ve System.Net.Socket için bazı ayrıntılı izleme kurdu. Bu, çıkışın başlangıcı.

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 

System.Net Information: 0 : [16124] TlsStream#29695768::.ctor(host=dsl-wholesale-testing.iinet.net.au, #certs=0) hiçbir sertifikalar ben client.ClientCredentials.ClientCertificate için sertifika bağlı olsanız bile, kullanım için aldı ama bu oluyor ya nasıl neden emin değilim edilmiş olduğunu göstermektedir çizgi yapmasını sağla. Sertifikanın herhangi bir özelliği, bağlandığım ana bilgisayar adıyla eşleşmeli mi?

cevap

4

Sunucu TLS'yi anlamadı.

ben "clientCredentialType = ... ulaşım" benim için çalıştı yorum olarak bahsedilen @ajeh gibi

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3; 
+0

İlginç. Aynı kodu ve aynı TLS cert # 0 ile aynı hatayı alıyorum, ancak sunucunun TLS 1.2'yi desteklediğini biliyorum. Ben aklımın ucundayım. – ajeh

+0

System.Net.ServicePointManager.SecurityProtocol bir bayraktır, bu yüzden ek bir SecurityProtocolTypes öğesini bitsel bir OR yoluyla belirtebilirsiniz. Eğer sadece Ssl13'ünüz varsa, Tls'le ilgili herhangi bir şey göz ardı edilecektir (PHP Curl'e değil, C# koduna atıfta bulunduğunuzu varsayarak). – Reuben

+1

Web hizmeti bağlayıcısının güvenlik öğesi, eksik olan '' adlı bir ek öğeye ihtiyaç duyuyordu. Ekledim ve her şey çalıştı. – ajeh

0

aracılığıyla, SSLv3 belirtmek zorunda kaldı!

<binding name="....."> 
    <security mode="Transport" > 
     <transport clientCredentialType="Certificate"></transport> 
    </security> 
</binding> 

Ayrıca, IIS uygulama havuzu kullanıcı sertifikanın özel anahtarı okuma iznine sahip olduğundan emin olmak gerekir.

İlgili konular