Anonymní profil Michal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Michal – Programujte.comAnonymní profil Michal – Programujte.com

 

Příspěvky odeslané z IP adresy 193.150.24.–

.NET › Certifikované časové razítko…
2. 9. 2016   #212544

Ahoj všem,
potřeboval bych poradit s vložením certifikovaného časového razítka do PDF.
Níže uvedený zdrojový kód, který spadne na řádku Array.Copy(pk, 0, outc, 0, pk.Length); protože outc.Length = 4096, ale pk.Length = 7541. Metoda DejCasoveRazitko funguje bez chyby.

        private const String ID_TIME_STAMP_TOKEN = "1.2.840.113549.1.9.16.2.14"; // RFC 3161 id-aa-timeStampToken

        public void PodepisPdfCer(string SouborPDF, string OtiskCertifikatu)
        {
            //http://www.dotnetportal.cz/blogy/15/Null-Reference-Exception/5250/Digitalni-podepisovani-PDF-souboru-v-C-cast-2

            //Get certificate
            //Open the currently logged-in user certificate store
            var store = new System.Security.Cryptography.X509Certificates.X509Store(System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser);
            store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);

            string thumbprint = OtiskCertifikatu.Replace(" ", "").ToUpperInvariant();
            if (thumbprint[0] == 8206)
            {
                thumbprint = thumbprint.Substring(1);
            }

            //Select a certificate from the certificate store
            var certs = store.Certificates.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint, thumbprint, true);
            store.Close();

            //Verify that a certificate exists
            if (certs.Count == 0)
            {
                MessageBox.Show("Nelze najít určený certifikát v Current user certificate store!", "Sign PDF", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //Open Pdf document
            byte[] pdfData = File.ReadAllBytes(SouborPDF);

            //Sign the PDF document
            using (MemoryStream stream = new MemoryStream())
            {
                var reader = new PdfReader(pdfData);
                var stp = PdfStamper.CreateSignature(reader, stream, '\0');
                var sap = stp.SignatureAppearance;

                //Protect certain features of the document
                stp.SetEncryption(null,
                    Guid.NewGuid().ToByteArray(), //random password
                    PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_SCREENREADERS,
                    PdfWriter.ENCRYPTION_AES_256);

                //Get certificate chain
                var cp = new Org.BouncyCastle.X509.X509CertificateParser();
                var certChain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(certs[0].RawData) };

                sap.SetCrypto(null, certChain, null, PdfSignatureAppearance.WINCER_SIGNED);

                //Set signature appearance
                BaseFont helvetica = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
                iTextSharp.text.Font font = new iTextSharp.text.Font(helvetica, 12, iTextSharp.text.Font.NORMAL);
                sap.Layer2Font = font;
                //sap.SetVisibleSignature(new iTextSharp.text.Rectangle(415, 100, 585, 40), 1, null);

                var dic = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
                //Set some stuff in the signature dictionary.
                dic.Date = new PdfDate(sap.SignDate);
                dic.Name = certs[0].Subject;    //Certificate name
                if (sap.Reason != null)
                {
                    dic.Reason = sap.Reason;
                }
                if (sap.Location != null)
                {
                    dic.Location = sap.Location;
                }

                //Set the crypto dictionary
                sap.CryptoDictionary = dic;

                //Set the size of the certificates and signature.
                int csize = 4096; //Size of the signature - 4K

                //Reserve some space for certs and signatures
                var reservedSpace = new Dictionary<PdfName, int>();
                reservedSpace[PdfName.CONTENTS] = csize * 2 + 2; //*2 because binary data is stored as hex strings. +2 for end of field
                sap.PreClose(reservedSpace);    //Actually reserve it

                //Build the signature
                System.Security.Cryptography.HashAlgorithm sha = new System.Security.Cryptography.SHA256CryptoServiceProvider();

                var sapStream = sap.GetRangeStream();
                int read = 0;
                byte[] buff = new byte[8192];
                while ((read = sapStream.Read(buff, 0, 8192)) > 0)
                {
                    sha.TransformBlock(buff, 0, read, buff, 0);
                }
                sha.TransformFinalBlock(buff, 0, 0);

                //Place message in a ContentInfo object. This is required to build a SignedCms object.
                System.Security.Cryptography.Pkcs.ContentInfo contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(sha.Hash);

                //Instantiate SignedCms object with the ContentInfo above.
                //Has default SubjectIdentifierType IssuerAndSerialNumber.
                System.Security.Cryptography.Pkcs.SignedCms signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, false);

                //Formulate a CmsSigner object for the signer.
                System.Security.Cryptography.Pkcs.CmsSigner cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certs[0]);  //First cert in the chain is the signer cert

                //Do the whole certificate chain. This way intermediate certificates get sent across as well.
                cmsSigner.IncludeOption = System.Security.Cryptography.X509Certificates.X509IncludeOption.ExcludeRoot;

                //Časové razítko z TSA
                if (!String.IsNullOrEmpty(textBox_ServerCasovehoRazitka.Text.Trim()))
                {
                    try
                    {
                        System.Security.Cryptography.AsnEncodedData timeData = new System.Security.Cryptography.Pkcs.Pkcs9AttributeObject(ID_TIME_STAMP_TOKEN,
                                                                                                                                          DejCasoveRazitko(stream.GetBuffer(), textBox_ServerCasovehoRazitka.Text)
                                                                                                                                         );
                        cmsSigner.UnsignedAttributes.Add(timeData);
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show("Chyba TSA!\n" + e.Message);
                    }
                }

                //Sign the CMS/PKCS #7 message. The second argument is needed to ask for the pin.
                signedCms.ComputeSignature(cmsSigner, false);

                //Encode the CMS/PKCS #7 message.
                byte[] pk = signedCms.Encode();

                //Put the certs and signature into the reserved buffer
                byte[] outc = new byte[csize];
                Array.Copy(pk, 0, outc, 0, pk.Length);

                //Put the reserved buffer into the reserved space
                PdfDictionary certificateDictionary = new PdfDictionary();
                //certificateDictionary.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));

                //Write the signature
                sap.Close(certificateDictionary);

                //Close the stamper and save it
                stp.Close();

                reader.Close();

                byte[] signedData = stream.GetBuffer();
                File.WriteAllBytes(SouborPDF, signedData);
            }
        }

        static protected byte[] DejCasoveRazitko(byte[] PDF, string ServerTSA)
        {
            System.Security.Cryptography.SHA256Managed hashString = new System.Security.Cryptography.SHA256Managed();
            string hex = "";

            var hashValue = hashString.ComputeHash(PDF);
            foreach (byte x in hashValue)
            {
                hex += String.Format("{0:x2}", x);
            }

            // VSTUPEM je hash dokumentu, pro který se razítko vyžaduje
            NotservisTSA.GetTimeStampRequest Request = new NotservisTSA.GetTimeStampRequest(new NotservisTSA.GetTimeStampRequestBody(hex, 0));

            NotservisTSA.Print2PDF_WebServiceSoap Soap = new NotservisTSA.Print2PDF_WebServiceSoapClient();

            ((NotservisTSA.Print2PDF_WebServiceSoapClient)Soap).Endpoint.Address = new System.ServiceModel.EndpointAddress(new Uri(ServerTSA + "/Default.asmx"));

            PodepsaniPDF.NotservisTSA.GetTimeStampResponse Response = Soap.GetTimeStamp(Request);
            
            // VÝSTUPEM je zakódované časové razítko (GetTimeStampResult - BASE-64 v kódované struktuře TimeStampResp, viz RFC 3161) a návratová hodnota s případným popisem chyby.
            byte[] responseBytes = Encoding.ASCII.GetBytes(Response.Body.GetTimeStampResult);

            if(!String.IsNullOrEmpty(Response.Body.Error))
                MessageBox.Show(Response.Body.Error, "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);

            string base64String = Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length);
            return Convert.FromBase64String(base64String);
        }
Michal
JavaScript, AJAX, jQuery › Datepicker, po vyběru nastav…
2. 6. 2016   #211102

#5 NeregistrovanyHookyns

ale každopádně díky moc, hodně mi to pomohlo

Michal
JavaScript, AJAX, jQuery › Datepicker, po vyběru nastav…
2. 6. 2016   #211101

#4 NeregistrovanyHookyns

nn, je to perfektní, díky moc, určitě to použiju. Už jen kvuli čistotě kodu.

Stejně se zaseknu na tomto :-) když se ručně zadá datum, co už bylo, tak celá ta vychytávka přestane pracovat. Už si hraju s validátorem, ale zas to vidím na 15000x pokusů :-)

Michal
JavaScript, AJAX, jQuery › Datepicker, po vyběru nastav…
2. 6. 2016   #211097

#2 Michal

tak to vypadá, že jsem to vyřešil, když jsem si oddychl, vypsal se tady a vrátil se ke zdrojáku, který nebyl tak šílený, jak co jsem zde vložil, tak nakonec jsem udělal pár úprav a jede to :-)

takže díky :-)))

Michal
JavaScript, AJAX, jQuery › Datepicker, po vyběru nastav…
2. 6. 2016   #211095

#1 Michal
sakra a ještě kod:

    jQuery( ".datepickerOd" ).datepicker({
    dateFormat: 'dd.mm.yy',
      minDate: 0,
      maxDate: "+2y",
      onClose: function (selectedDate, inst) {
               if (selectedDate != "") {

                 jQuery('.datepickerDo').datepicker('option', 'minDate', selectedDate );
                        var arrDate = selectedDate.split('.');
                        var temp = parseInt(arrDate[2]);
                        temp = temp + 2;
                        arrDate[2] = temp.toString();
                        var DatumPlus2Roky = arrDate[0].concat(".",arrDate[1],".",arrDate[2]);


                      jQuery('.datepickerDo').datepicker('option', 'maxDate', DatumPlus2Roky );
                      jQuery('.datepickerDo').datepicker('setDate', DatumPlus2Roky);
               }
          }

    });

           jQuery( ".datepickerDo" ).datepicker({
      minDate: 0,
      maxDate: "+2y",

    });

Omlouvám se, za tolik proměnných atd., ale přepisoval jsem tento kod asi 1000x a jen pro ukázku nemá cenu kod čistit

Michal
JavaScript, AJAX, jQuery › Datepicker, po vyběru nastav…
2. 6. 2016   #211094

Zdravím, potřebuju radu

 Ale mám toto:

2x datepicker, jeden od, druhý do. Po výběru toho prvního se má nastavit i druhého:

1/ minDate na aktuální výběr prvního datepickeru

2/maxDate: vyběr prvního + 2 roky 

3/ nastavit do druhého datepickeru výběr toho prvního + 2 roky, v podstatě maxDate a aktuální datum bude to samo (myšleno, že se ta hodnota má vypsat přímo v inputu a nastavit v datepickeru)

Za nic na světě nemůžu přijít na bod 3, když už to funguje, tak mi to nastaví rok správně, měsíc správně, ale datum mi to dá dnešní (příklad: dnes je 2.6.2016, v první datepickeru vyberu 17.7.2016, v druhém se mi nastaví 2.7.2018)

Michal
Oracle › nelze spustit net configurat…
14. 4. 2015   #201381

#1 Michal
Vyřešeno. OS je 64bit a Oracle 32bit. Stačí nakopírova adresář oracle z c:\program files (x86)\ do c:\program files a opravit cesty v netca.cl a bude to chodit

Michal
Oracle › nelze spustit net configurat…
14. 4. 2015   #201380

Zdravím, neřešil někdo problém se spouštěním net configuration assistant na Win2003 serveru? Program se vůbec nespustí. Stejně se chovají i ostatní utility, které se spouští přes launch.exe.

Díky za radu.

M.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý