.NET कोर 2.2 और डॉक लाइनर कंटेनरों पर स्व-हस्ताक्षरित सीट्स और क्लाइंट सर्टिफिकेट के साथ काम करते समय मुझे उसी समस्या का सामना करना पड़ा। मेरे देव विंडोज मशीन पर सब कुछ ठीक रहा, लेकिन डॉकटर में मुझे ऐसी त्रुटि मिली:
System.Security.Authentication.AuthenticationException: सत्यापन प्रक्रिया के अनुसार दूरस्थ प्रमाणपत्र अमान्य है
सौभाग्य से, प्रमाण पत्र एक श्रृंखला का उपयोग करके उत्पन्न किया गया था। बेशक, आप हमेशा इस समाधान को अनदेखा कर सकते हैं और उपरोक्त समाधानों का उपयोग कर सकते हैं।
तो यहाँ मेरा समाधान है:
मैंने P7B प्रारूप में अपने कंप्यूटर पर Chrome का उपयोग करके प्रमाणपत्र सहेजा है ।
इस आदेश का उपयोग करके 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);
}