Wpis z mikrobloga

@krzyhu7: wkradł się błąd w 1 poście jaki umieściłem (ok. 15 min. temu) poprawny kod powinniem wyglądać tak

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = new X509Certificate2("cert.crt");
handler.ClientCertificates.Add(certificate);

string URI = "[https://test-e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";](https://test-e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";)

string result = string.Empty;
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.ContentType] = "application/xml";
result = wc.UploadString(URI, File.ReadAllText("initupload-enveloping.xades.xml"));
}
@mmm234: używam tu restsharpa ale może to Ci się do czegoś przyda
public InitUploadObject InitUploadSigned(XmlDocument xml)
{
string url = "https://e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";
var client = new RestClient(url);

ServicePointManager.ServerCertificateValidationCallback += (
sender, certificate1, chain, sslPolicyErrors) => true;

var requestInitUploadSigned = new RestRequest(Method.POST);
requestInitUploadSigned.AddParameter("text/xml", xml.OuterXml, ParameterType.RequestBody);

IRestResponse response = client.Execute(requestInitUploadSigned);
}
Uzyłem RestSharp i na tescie poszlo dalej:
public string PostXMLData(string destinationUrl, string requestXmlFile)
{
XmlDocument requestXml = new XmlDocument();
requestXml.Load(requestXmlFile);

string url = destinationUrl;
var client = new RestClient(url);

ServicePointManager.ServerCertificateValidationCallback += (
sender, certificate1, chain, sslPolicyErrors) => true;

var requestInitUploadSigned = new RestRequest(Method.POST);
requestInitUploadSigned.AddParameter("application/xml encoding='utf-8'", requestXml.OuterXml, ParameterType.RequestBody);

IRestResponse response = client.Execute(requestInitUploadSigned);
}

teraz mam inny błąd:

{"Message":"Referencje w podpisie zostały negatywnie zweryfikowane. Dane prawdopodobnie zostały zmodyfikowane","Code":130,"RequestId":"5x/SvY8X+kA="}

Jak wysyłam ten sam plik przez
@Gibonowski: dzięki za podpowiedź, lecz szukam dalej
na Twoim kodzie dla serwera testowego i produkcyjnego otrzymuje kod 120 (podpis nie został prawidłowo zweryfikowany)
na moim wcześniejszym kodzie z WebRequestHandler dla serwera testowego otrzymuje prawidłową odpowiedź 200 a na produkcyjnym odpowiedź 400.
szukam dalej, być może jeszcze trzeba coś ustawić w kliencie RestClient

mimo wszystko jeszcze raz dzięki za jakiś trop
@mmm234: Wydaje mi się że certyfikat służy tylko do zestawienia połączenia ssl. Jak już bramka odpowiada jsonem to jest ok. Moim zdaniem zawartość xml jest zmieniana podczas wysyłania i bramka weryfikując podpis stwierdza że ktoś modyfikował plik. Może to być problem np z kodowaniem.
@krzyhu7: ok jutro się temu przyjrzę bliżej. Coś faktycznie musi być ponieważ przykładowy request na testową bramkę poszedł mi ok a na produkcyjną błąd tym razem 135 (nieważny certyfikat...). Dzięki wszystkim za podpowiedzi w końcu w kupie siła :) pozdrawiam
@Gibonowski: a więc tak poniżej kod jakiego użyłem (przykładowy xml ze strony mf)

static void Main(string[] args)
{
string url = "[https://e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";](https://e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";)
var client = new RestClient(url);

XmlDocument xml = new XmlDocument();
xml.Load("initupload-enveloping.xades.xml");

ServicePointManager.ServerCertificateValidationCallback += (
sender, certificate1, chain, sslPolicyErrors) => true;

var requestInitUploadSigned = new RestRequest(Method.POST);
requestInitUploadSigned.AddParameter("text/xml", xml.OuterXml, ParameterType.RequestBody);

IRestResponse response = client.Execute(requestInitUploadSigned);

string result = response.Content;
}

treść błędu:
{"Message":"Dokument z nieważnym podpisem kwalifikowanym","Code":135,"RequestId":"+84mXqjLW/0="}

dla pliku (initupload-enveloped.xades.xml) także ze
do uzupełnienia dodam 2 wcześniejszą moją metodę:

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = new X509Certificate2("test-e-dokumenty.mf.gov.pl_ssl.crt");
handler.ClientCertificates.Add(certificate);

string URI = "[https://test-e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";](https://test-e-dokumenty.mf.gov.pl/api/Storage/InitUploadSigned";)

string result = string.Empty;
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.ContentType] = "application/xml";
result = wc.UploadString(URI, File.ReadAllText("initupload-enveloped.xades.xml"));
}

na testowym serwerze zarówno do pliku initupload-enveloping.xades.xml jak i initupload-enveloped.xades.xml jest OK
natomiast wysyłając to samo na serwer produkcyjny w obu przypadkach wyjątek
Przebrnąłem przez błąd 130 :)
Przy zapisywaniu xml tego którego mamy podpisać i wysłac dajemy opcję SaveOptions.DisableFormatting - powoduje to zapisanie bez białych znaków pomiędzy tagami. Obie ponizsze metody zwracają poprawną odpowiedź.

public string PostXMLData2(string destinationUrl, string requestXmlFile)
{

XmlDocument requestXml = new XmlDocument();
requestXml.Load(requestXmlFile);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(requestXml.OuterXml);
request.ContentType = "application/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";

using (Stream requestStream = request.GetRequestStream())
requestStream.Write(bytes, 0, bytes.Length);

try
@krzyhu7: nie żebym się czepiał, lecz nie mogę niestety tego potwierdzić na przykładowych xml ze strony mf. Mam aplikację w .NET 4.0

static string PostXMLData1(string destinationUrl, string requestXmlFile)
{
XmlDocument requestXml = new XmlDocument();
requestXml.Load(requestXmlFile);

string url = destinationUrl;
var client = new RestClient(url);

var requestInitUploadSigned = new RestRequest(Method.POST);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(requestXml.OuterXml);
requestInitUploadSigned.AddParameter("application/xml encoding='utf-8'", bytes, ParameterType.RequestBody);

IRestResponse response = client.Execute(requestInitUploadSigned);

return response.Content;
}

static string PostXMLData2(string destinationUrl, string requestXmlFile)
{