Benar-benar berpikir saya telah memperbaiki masalah ini, tetapi itu hanya disamarkan sebelumnya.
Saya memiliki layanan WCF yang dihosting di IIS 7 menggunakan HTTPS. Saat saya menjelajah ke situs ini di Internet Explorer, ia bekerja seperti pesona, ini karena saya telah menambahkan sertifikat ke penyimpanan otoritas sertifikat akar lokal.
Saya mengembangkan di 1 mesin, jadi klien dan server adalah mesin yang sama. Sertifikat ditandatangani sendiri langsung dari snap in manajemen IIS 7.
Saya terus mendapatkan kesalahan ini sekarang ...
Tidak dapat membangun hubungan kepercayaan untuk saluran aman SSL / TLS dengan otoritas.
... saat dipanggil dari konsol klien.
Saya secara manual memberi diri saya izin dan layanan jaringan ke sertifikat, menggunakan findprivatekey
dan menggunakan cacls.exe
.
Saya mencoba menyambung ke layanan menggunakan SOAPUI, dan berhasil, jadi pasti ada masalah dalam aplikasi klien saya, yang merupakan kode berdasarkan apa yang digunakan untuk bekerja dengan http.
Di mana lagi saya bisa mencari, saya sepertinya sudah kehabisan semua kemungkinan mengapa saya tidak bisa terhubung?
sumber
Jawaban:
Sebagai solusinya, Anda dapat menambahkan penangan ke
ServicePointManager
'sServerCertificateValidationCallback
di sisi klien:System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; };
tetapi ketahuilah bahwa ini bukan praktik yang baik karena ini sepenuhnya mengabaikan sertifikat server dan memberi tahu manajer titik layanan bahwa sertifikat apa pun yang baik-baik saja yang dapat membahayakan keamanan klien secara serius. Anda dapat memperbaiki ini dan melakukan beberapa pemeriksaan khusus (untuk nama sertifikat, hash dll). setidaknya Anda dapat menghindari masalah selama pengembangan saat menggunakan sertifikat pengujian.
sumber
Ketika saya memiliki masalah ini, itu karena client.config memiliki titik akhir seperti:
https://myserver/myservice.svc
tapi sertifikatnya sudah menunggu
https://myserver.mydomain.com/myservice.svc
Mengubah titik akhir agar sesuai dengan FQDN server menyelesaikan masalah saya. Saya tahu ini bukan satu-satunya penyebab masalah ini.
sumber
Masalah Anda muncul karena Anda menggunakan kunci yang ditandatangani sendiri. Klien tidak mempercayai kunci ini, dan kunci itu sendiri tidak menyediakan rantai untuk divalidasi atau daftar pencabutan sertifikat.
Anda memiliki beberapa opsi - Anda bisa
matikan validasi sertifikat pada klien (langkah buruk, serangan man in the middle berlimpah)
gunakan makecert untuk membuat root CA dan membuat sertifikat dari itu (ok pindah, tapi masih belum ada CRL)
buat root CA internal menggunakan Windows Certificate Server atau solusi PKI lainnya lalu percayakan sertifikat root tersebut (agak sulit untuk dikelola)
membeli sertifikat SSL dari salah satu CA terpercaya (mahal)
sumber
dua yang pertama menggunakan lambda, yang ketiga menggunakan kode biasa ... semoga bermanfaat
//Trust all certificates System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); // trust sender System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); // validate cert by calling a function ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); // callback used to validate the certificate in an SSL conversation private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) { bool result = false; if (cert.Subject.ToUpper().Contains("YourServerName")) { result = true; } return result; }
sumber
Solusi satu baris. Tambahkan ini di mana saja sebelum memanggil server di sisi klien:
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
Ini sebaiknya hanya digunakan untuk tujuan pengujian karena klien akan melewati pemeriksaan keamanan SSL / TLS.
sumber
Saya mengalami masalah yang sama dan saya dapat mengatasinya dengan dua solusi: Pertama, saya menggunakan snap-in MMC "Sertifikat" untuk "Akun komputer" dan menyeret sertifikat yang ditandatangani sendiri ke folder "Otoritas Sertifikasi Root Terpercaya" . Ini berarti komputer lokal (yang menghasilkan sertifikat) sekarang akan mempercayai sertifikat itu. Kedua, saya perhatikan bahwa sertifikat dibuat untuk beberapa nama komputer internal, tetapi layanan web sedang diakses menggunakan nama lain. Ini menyebabkan ketidakcocokan saat memvalidasi sertifikat. Kami membuat sertifikat untuk computer.operations.local, tetapi mengakses layanan web menggunakan https://computer.internaldomain.companydomain.com . Saat kami mengalihkan URL ke yang digunakan untuk menghasilkan sertifikat, kami tidak lagi menemukan kesalahan.
Mungkin hanya mengganti URL akan berhasil, tetapi dengan membuat sertifikat dipercaya, Anda juga menghindari layar merah di Internet Explorer yang memberi tahu Anda bahwa ia tidak mempercayai sertifikat tersebut.
sumber
Jika Anda menggunakan .net core coba ini:
sumber
Harap lakukan langkah-langkah berikut:
Buka tautan layanan di IE.
Klik pada kesalahan sertifikat yang disebutkan di bilah alamat dan klik Lihat sertifikat.
Cek dikeluarkan untuk: nama.
Ambil nama yang dikeluarkan dan ganti penyebutan localhost dalam layanan dan nama alamat dasar titik akhir klien dengan nama domain yang memenuhi syarat penuh (FQDN).
Untuk Contoh: https: // localhost : 203 / SampleService.svc To https: // INL-126166-.groupinfra.com : 203 / SampleService.svc
sumber
Selain jawaban di atas, Anda mungkin mengalami kesalahan ini jika klien Anda menjalankan versi TLS yang salah, misalnya jika server hanya menjalankan TLS 1.2.
Anda dapat memperbaikinya dengan menggunakan:
// tested in .NET 4.5: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
sumber
Saya memiliki masalah yang sama. Saya juga telah menambahkan sertifikat CA di toko lokal, tetapi saya melakukannya dengan cara yang SALAH.
Menggunakan Konsol mmc (Mulai -> Jalankan -> mmc ) Anda harus menambahkan Sertifikat snap-in sebagai akun Layanan (memilih akun layanan IIS) atau akun Komputer (ditambahkan untuk setiap akun di mesin)
Berikut gambar dari apa yang saya bicarakan
Mulai sekarang, Anda dapat menambahkan sertifikat CA ( CA Root Tepercaya dan CA Menengah ), dan semuanya akan berfungsi dengan baik
sumber
Saya memiliki masalah serupa dengan sertifikat yang ditandatangani sendiri. Saya bisa mengatasinya dengan menggunakan nama sertifikat yang sama dengan FQDN server.
Idealnya, bagian SSL harus dikelola di sisi server. Klien tidak perlu memasang sertifikat apa pun untuk SSL. Selain itu, beberapa postingan menyebutkan tentang mengabaikan SSL dari kode klien. Tapi saya sangat tidak setuju dengan itu.
sumber
Saya baru saja menyeret sertifikat ke folder "Otoritas Sertifikasi Root Terpercaya" dan voila semuanya bekerja dengan baik.
Oh. Dan saya pertama kali menambahkan yang berikut ini dari Command Prompt Administrator:
netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV
Saya tidak yakin dengan nama yang Anda butuhkan untuk pengguna tersebut (nama saya adalah bahasa Norwegia seperti yang Anda lihat!)
user=NT-AUTHORITY/INTERACTIVE
:?Anda dapat melihat semua urlacl yang ada dengan mengeluarkan perintah:
netsh http show urlacl
sumber
Ini terjadi saat mencoba menyambung ke Layanan WCF melalui. IP misalnya
https://111.11.111.1:port/MyService.svc
saat menggunakan sertifikat yang terkait dengan nama misalnya mysite.com.Beralih ke
https://mysite.com:port/MyService.svc
menyelesaikannya.sumber
Ini terjadi saat mencoba menyambung ke Layanan WCF hanya dengan menggunakan nama host misalnya https: //host/MyService.svc saat menggunakan sertifikat yang terkait dengan nama misalnya host.mysite.com.
Beralih ke https://host.mysite.com/MyService.svc dan ini menyelesaikannya.
sumber
Baru saja memperbaiki masalah serupa.
Saya menyadari saya memiliki kumpulan aplikasi yang berjalan di bawah akun yang hanya memiliki izin membaca atas sertifikat yang digunakan.
Aplikasi .NET bisa dengan benar mengambil sertifikat tapi pengecualian itu dilemparkan hanya ketika GetRequestStream () dipanggil.
Izin sertifikat dapat dikelola melalui konsol MMC
sumber
Jika Anda menggunakan inti .net, maka selama pengembangan Anda dapat melewati validasi sertifikat dengan menggunakan arahan compiler. Dengan cara ini hanya akan memvalidasi sertifikat untuk rilis dan bukan untuk debug:
#if (DEBUG) client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None, RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck }; #endif
sumber
Saya hanya ingin menambahkan sesuatu ke jawaban @NMrt yang sudah menunjukkan:
Dengan Framework 4.7.2, jika Anda tidak secara eksplisit mengkonfigurasi kerangka target di web.config Anda seperti ini
<system.web> <compilation targetFramework="4.7" /> <httpRuntime targetFramework="4.7" /> </system.web>
protokol keamanan default sistem Anda akan diabaikan dan sesuatu yang "lebih rendah" mungkin digunakan sebagai gantinya. Dalam kasus saya Ssl3 / Tls, bukan Tls13.
Anda juga dapat memperbaiki ini dalam kode dengan mengatur SecurityProtocol (membuat protokol lain tetap berfungsi):
atau bahkan dengan menambahkan kunci registri untuk mengaktifkan atau menonaktifkan crypto yang kuat
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SchUseStrongCrypto"=dword:00000001
Posting blog ini mengarahkan saya ke arah yang benar dan menjelaskan latar belakang lebih baik dari yang saya bisa:
https://www.ryadel.com/en/asp-net-client-server-cannot-comunicate-because-they-possess-common-algorithm-how-to-fix-c-sharp/
sumber
Tambahkan ini ke kode klien Anda:
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback( delegate { return true; });
sumber