|
|
Programmer ASP.NET MVC C# |
Programming
|
||
| Previous | Next | |
|
Для интеграции с одним из банком мне был предоставлен пример 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;
}
|
||