|
Programmer ASP.NET MVC C# |
Programming
|
||
Предыдущий | Следующий | |
Для интеграции с одним из банком мне был предоставлен пример PHP кода. $ch = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->server_url); curl_setopt($curl, CURLOPT_HEADER, FALSE); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl,CURLOPT_USERAGENT, "User-Agent=Mozilla/5.0 Firefox/1.0.7"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_SSLCERT, $this->pem_file); //path_file.pem curl_setopt($curl, CURLOPT_SSLKEY, $this->key_file); //path_file.key curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($curl, CURLOPT_CAINFO, $this->chain_file); //path_file.crt curl_setopt($curl, CURLOPT_POSTFIELDS, $this->post); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); $result_curl = curl_exec($ch); curl_close($ch); echo $result_curl; Мое приложение работает на asp.net C# и по этому пришлось переделывать код. Я сгенерил запрос (два файла *.key и *.req) и отправил банк. В ответ я получил файлы *.pem и *.crt. Исходя из скрипта, у меня были все файл. Начал переделывать код, и столкнулся с проблемой, что C# не предусматривает передачу *.key файла. И это логично, ведь это закрытый ключ! Как работает php и так открыто передает ключ я лично не понимаю. Для моего кода нужно перегенерить файлы в формат *.pkcs12 или *.pfx (в защищенный паролем файл). Для создания такого файла от банка было получено еще пару *.crt. И с помощью программы openssl.exe было сделано преобразование openssl pkcs12 -export -inkey path_file.key -in path_file.pem -certfile path_file.crt -out path_file.pkcs12 -name name_file Теперь можно писать C# код. При нажатию например на кнопку, нужно выполнять вот такой код: var url = "https://bank.com/api"; ServicePointManager.ServerCertificateValidationCallback += OnValidateCertificate; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; X509Certificate2 Cert = new X509Certificate2("path_file.pkcs12", "password", X509KeyStorageFlags.MachineKeySet); request.ClientCertificates.Add(Cert); var postData = String.Format("data for post"); byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentLength = byteArray.Length; using (Stream writeStream = request.GetRequestStream()) { writeStream.Write(byteArray, 0, byteArray.Length); } string responseFromServer; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream readStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(readStream)) { responseFromServer = reader.ReadToEnd(); Console.WriteLine(responseFromServer); } } } Так же в этом коде используется: private bool OnValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { //Console.WriteLine("ServerCertificateValidation!"); HttpWebRequest requestV = sender as HttpWebRequest; if (requestV != null) { if (requestV.RequestUri.ToString() == url_bank) { if (sslPolicyErrors==(SslPolicyErrors.RemoteCertificateNameMismatch)) { return true; } } return false; } return false; } |