ฉันประสบปัญหาเดียวกันเมื่อทำงานกับใบรับรองที่ลงนามด้วยตนเองและการรับรองความถูกต้องของไคลเอนต์บนคอนเทนเนอร์. ทุกอย่างทำงานได้ดีบนเครื่อง dev Windows ของฉัน แต่ใน Docker ฉันพบข้อผิดพลาดดังกล่าว:
System.Security.Authentication.AuthenticationException: ใบรับรองระยะไกลไม่ถูกต้องตามขั้นตอนการตรวจสอบความถูกต้อง
โชคดีที่ใบรับรองถูกสร้างขึ้นโดยใช้โซ่ แน่นอนคุณสามารถเพิกเฉยต่อโซลูชันนี้และใช้วิธีแก้ไขปัญหาข้างต้นได้ตลอดเวลา
นี่คือทางออกของฉัน:
ฉันบันทึกใบรับรองโดยใช้ Chrome บนคอมพิวเตอร์ในรูปแบบP7B
แปลงใบรับรองเป็นรูปแบบ PEM โดยใช้คำสั่งนี้:
openssl pkcs7 -inform DER -outform PEM -in <cert>.p7b -print_certs > ca_bundle.crt
เปิดไฟล์ ca_bundle.crt และลบการบันทึกเรื่องทั้งหมดออกจากไฟล์ที่สะอาด ตัวอย่างด้านล่าง:
-----BEGIN CERTIFICATE-----
_BASE64 DATA_
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
_BASE64 DATA_
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
_BASE64 DATA_
-----END CERTIFICATE-----
- ใส่บรรทัดเหล่านี้ใน Dockerfile (ในขั้นตอนสุดท้าย):
# Update system and install curl and ca-certificates
RUN apt-get update && apt-get install -y curl && apt-get install -y ca-certificates
# Copy your bundle file to the system trusted storage
COPY ./ca_bundle.crt /usr/local/share/ca-certificates/ca_bundle.crt
# During docker build, after this line you will get such output: 1 added, 0 removed; done.
RUN update-ca-certificates
- ในแอป:
var address = new EndpointAddress("https://serviceUrl");
var binding = new BasicHttpsBinding
{
CloseTimeout = new TimeSpan(0, 1, 0),
OpenTimeout = new TimeSpan(0, 1, 0),
ReceiveTimeout = new TimeSpan(0, 1, 0),
SendTimeout = new TimeSpan(0, 1, 0),
MaxBufferPoolSize = 524288,
MaxBufferSize = 65536,
MaxReceivedMessageSize = 65536,
TextEncoding = Encoding.UTF8,
TransferMode = TransferMode.Buffered,
UseDefaultWebProxy = true,
AllowCookies = false,
BypassProxyOnLocal = false,
ReaderQuotas = XmlDictionaryReaderQuotas.Max,
Security =
{
Mode = BasicHttpsSecurityMode.Transport,
Transport = new HttpTransportSecurity
{
ClientCredentialType = HttpClientCredentialType.Certificate,
ProxyCredentialType = HttpProxyCredentialType.None
}
}
};
var client = new MyWSClient(binding, address);
client.ClientCredentials.ClientCertificate.Certificate = GetClientCertificate("clientCert.pfx", "passwordForClientCert");
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication
{
CertificateValidationMode = X509CertificateValidationMode.ChainTrust,
TrustedStoreLocation = StoreLocation.LocalMachine,
RevocationMode = X509RevocationMode.NoCheck
};
เมธอด GetClientCertificate:
private static X509Certificate2 GetClientCertificate(string clientCertName, string password)
{
byte[] rawData = null;
using (var f = new FileStream(Path.Combine(AppContext.BaseDirectory, clientCertName), FileMode.Open, FileAccess.Read))
{
var size = (int)f.Length;
var rawData = new byte[size];
f.Read(rawData, 0, size);
f.Close();
}
return new X509Certificate2(rawData, password);
}