.NET কোর ২.২ এবং ডকার লিনাক্স পাত্রে স্ব-স্বাক্ষরিত শংসাপত্র এবং ক্লায়েন্ট শংসাপত্রের লেখক নিয়ে কাজ করার সময় আমি একই সমস্যার মুখোমুখি হয়েছি। আমার ডেভ উইন্ডোজ মেশিনে সবকিছু ঠিকঠাক কাজ করেছে, তবে ডকারে আমি এ জাতীয় ত্রুটি পেয়েছি:
সিস্টেম.সিকিউরিটি.অথ্যান্টিকেশন.অথেন্টিফিকেশন এক্সসেপশন: রিমোট শংসাপত্র বৈধকরণ পদ্ধতি অনুসারে অবৈধ
ভাগ্যক্রমে, শৃঙ্খলাটি একটি চেইন ব্যবহার করে তৈরি করা হয়েছিল। অবশ্যই, আপনি সর্বদা এই সমাধানটিকে উপেক্ষা করতে এবং উপরের সমাধানগুলি ব্যবহার করতে পারেন।
সুতরাং এখানে আমার সমাধান:
আমি 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-----
- এই লাইনগুলি ডকফাইফাইলের (চূড়ান্ত পদক্ষেপে) রাখুন:
# 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
};
গেটক্লিয়েন্ট সার্টিফিকেট পদ্ধতি:
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);
}