2010-11-03 18 views
12

Herkese açık bir SOAP web hizmetine (WCF değil) https üzerinden erişmeye çalışıyorum ve daha önce hiç görmediğim bir hata alıyorum. İlk olarak, burada gerçekler:İstemci sertifikasını göndermek için WCF istemcisini nasıl zorlar?

  • Bu hizmet, istemci sertifikalarını gerektirir. Aynı CA tarafından sunucu sertifikasıyla imzalanan bir sertifikam var.
  • Internet Explorer'da vurabildiğim için URL'nin kullanılabilir olduğunu biliyorum. IE, "sertifika seç" penceresini açar ve eğer onu seçersem (ve sunucu-ana bilgisayar-isim-eşleşmiyor-sertifika-hatası) görmezden gelirse, bana bir HTTP 500 hatası verir.
  • Siteyi Chrome'da açtığımda, sertifikayı seçip hatayı aldıktan sonra WSA Action = null ile ilgili normal bir hata iletisi alıyorum.
  • Siteyi FireFox'ta açarsam, hatayı göz ardı ettikten sonra sunucunun sertifikamı nasıl doğrulayamadığı hakkında bir sayfa açarım. Hiç birini seçmemi istemedi, bu yüzden mükemmel bir anlam ifade ediyor. Şimdi

, istisna:

Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 

Ben WireShark'la ile etkileşimi takip ettik ama TLS protokolünde bir uzman değilim çünkü, ne olup bittiğini olarak ipuçları eksik olabilir . Ancak burada, ben görüyorum budur:

  1. C -> S Müşteri Merhaba
    • rastgele sayı, tarih/saat gibi şeyler içerir, cypher suit desteklenen vb
  2. S - > C Sunucu Merhaba Belgesi, Sertifika isteği, Sunucu Merhaba
    • sunucunun sertifikasını içerir hazırlanmış ve bir istemci sertifikası
  3. talebi
  4. C -> S Belgesi, Müşteri Anahtar Değişimi, Değişim Şifreleme Spec, Şifreli Tokalaşma Mesaj BURAYA
    • İLGİNÇ BÖLÜM IS - Bu pakette ilk bölümü yapardım istemci sertifikası varsayalım Sertifika el sıkışma, bir olmalı, ancak sertifika yok (Sertifika Uzunluğu: 0).
  5. S -> C Uyarısı (Seviye: Ölümcül, Açıklama: Kötü Belgesi)
    • Evet, gönderilen hiçbir sertifika yoktu.

Benim şöyle kurulur bağlayıcı şu şekildedir:

<binding name="https_binding"> 
    <textMessageEncoding /> 
    <httpsTransport useDefaultWebProxy="false" /> 
</binding> 

Davranışım kurulur:

<behavior name="clientcred"> 
    <clientCredentials> 
     <clientCertificate findValue="69b6fbbc615a20dc272a79caa201fe3f505664c3" storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" /> 
     <serviceCertificate> 
      <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
     </serviceCertificate> 
    </clientCredentials> 
    <messageInspector /> 
</behavior> 

Benim uç nokta kullanmak üzere ayarlandı hem bağlayıcı ve davranış. WCF neden https bağlantısı oluşturduğunda sertifikayı göndermeyi reddediyor?

cevap

9

Sorunu çözdüm, ancak bu yapılandırmanın neden değiştirildiğini anlamıyorum. Buna

<httpsTransport useDefaultWebProxy="false" /> 

: Bu çizgiyi değiştirdi

<httpsTransport useDefaultWebProxy="false" requireClientCertificate="true" /> 

ve sihirli o çalışmaya başladı. requireClientCertificate "topuzu" nun sunucu tarafında olduğunu anladım, bu yüzden onu çekmeme sırasında denemedim. Görünüşe göre yanılmışım.

+0

WCF'den çok nefret ediyorum. Bu çözüm benim için çalıştı, yığınlar sayesinde - ama hepsi çok beceriksiz. Şimdi beni öldür. – robnick

-1

Kullanılacak güvenlik protokolü üzerinde anlaşma yapmak bir sorun olabilir.Özellikle, sunucunun TLS 1.0'ı kullanmaya çalışan WCF'den hoşlanmayacağını düşünüyorum. bu durumda

Bu istemci kodunda veya IEndpointBehavior

+0

Bunu denedim ve sonuçları değiştirmedi. Sunucunun TLS 1.0'ı desteklediğini biliyorum (aslında sadece bir tane özel şifre, ama bu şifre, sunucuya el sıkışmasında gönderilen listedir). – Mark

+0

Değişim, ChangeCipherSpec iletisine kadar geldiyse olmaz. Bu, protokolle ilgili her şeyin kabul edildiği anlamına gelir. – EJP

2

Orada olmalıydı yerleştirerek ya eklenebilir

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 

hizmeti çağırmadan önce aşağıdakileri eklemeyi deneyin görmek için Sunucudan bir CertificateRequest, kabul edilebilir sertifika türleri ve CA'ları adlandırma. Sertifikanız eşleşmiyorsa gönderilmez.

+0

Bir sertifika isteği (bkz. # 2) vardı ve gerçekten de bir CA ve sertifika türü listesi içeriyordu. Gerçekten uygun bir sertifika sahibiyim ve davranışta belirtilenlerden biri. – Mark

+0

Tüm bunlar doğruysa, istemciden CertificateRequest sunucusundan sonra bir Sertifika mesajı olurdu. Kaçınılmaz sonuç, bazılarının doğru olmadığıdır. Herşeyi iki kez kontrol etmeniz gerekir: özellikle, (a) sertifikası uygulamanın kullanılabilir olması ve (b) CertificateRequest'te belirtilen tüm kısıtlamalara uygun olması. – EJP

+0

Doğrulanabilir ... WireShark yakalama hakkım var. Yine de problemi çözdüm, ama gerçekten neyi değiştirdiğimi anlamıyorum. Bunu ayrı bir cevapta yayınlayacağım. – Mark