Czytanie Private Key

1

-- CO CHCE ZROBIC --
chce podpisac kluczem prywatnym dokument pdf uzywajac C#. private key powinien byc RSA w formacie PEM. Uzywam iTextSharp ktory uzywa bountyCastle

-- JAK TO ROBIE --

[System.InvalidCastException] = {"Unable to cast object of type 'Org.BouncyCastle.Asn1.DerUnknownTag' to type 'Org.BouncyCastle.Asn1.Asn1Sequence'."}

  • poszukalem w google okazalo sie ze trzeba te RSA z headerow pliku usunac niestety manipulacja plikiem nie pomogla. Doprowadzilem plik do takiego stanu http://pastebin.com/ezMv2LJT i nadal nie dziala
  • po dalszym researchu zauwazylem ze p12 to jest store dla wszystkich key
  • poszedlem inna droga i chcialem zrobic po prostu jeden certyfikat http://pastebin.com/ahWugPSe lecz to tez nie dziala (moge sprawdzic jaki blad dokladnie...). Szukanie po komunikacie bledu nic nie dala
  • zaczalem szukac jaki to format kluczu w firmie jest uzyty RSA PEM i ten wygenerowany wydaje sie byc tez RSA PEM
  • ta bibloteka ktora uzywam nie wspiera o tak sobie RSA PEM i trzebabylo to objesc
  • wiec poszukalem i znalazlem to http://stackoverflow.com/questions/243646/how-to-read-a-pem-rsa-private-key-from-net ale kod http://pastebin.com/k9b0ZXZw nie dziala keyPair jest nullem
  • przekopalem troche google i nic nie moge znalezc

-- PROBLEM --
odczytac RSA PEM i stworzyc certyfikat w C# (poki co... pozniej pewnie bedzie wiecej...)

jakby ktos potrzebowal haslo do klucza to 123

0

A da się w ogóle wygenerować X509Certificate dla klucza prywatnego bo wydaje mi się że nie.

0

zapewne pozniej (dopiero jak skoncze caly ten feature) opisze jak sobie z tym radze.

Ogolnie wygenerowany klucz przez puttygen jest "zly" i nie da sie go tak latwo odczytac w C#
Inny wygenerowany klucz X509 (ktory zawiera klucz prywatny) dziala.

Jak doprowadze kod i feature do porzadku to opisze wiecej ;)

1

Najpierw jezeli chodzi o klucze i certyfikaty.

Przede wszystkim klucze ktore zostaly wygenerowane przez puttygen w tym wypadku byly zle. Po prostu nie szlo ich odczytac (zapewne jest jakis sposob... ale nie o tym)

Wiec najpierw potrzebujemy wygenerowac Windowsowska(pfx) lub Macowska(p12) kolekcje kluczy wraz z kluczami
Dla Maca jak ktosby chcial moge opisac kiedy indziej. Robilem to pare razy i jest to dosc prosta sprawa. Opisze tylko to co tutaj zrobilem

Pierwsze co sie przyda to jedna drobne upsrawnienie dla cmd (sam to odkrylem dzis, mimo ze twierdza ludzie ze to podstawy dla vs)
odpalamy cmd a tam robimy takie cos
"%VS120COMNTOOLS%\vsvars32.bat"
w tej chwili wszystkie programy visual studio w wersji 12 dzialaja w cmd (a bedzie to potrzebne). Jezeli ktos ma inna wersje to liczbe 120 zamienic na odpowiedznia wersje (110 dla 11.0)
Robimy wszystko zgodnie z tym linkiem
http://www.codeproject.com/Articles/25677/Simple-WCF-X-Certificate

UWAGI

  • certyfikaty zostana utworzone tam gdzie cmd ma aktualny path ustawiony (wiec najlepiej zrobic sobie osobny folder, zrobic w nim to makro ktore wpisalem i wtedy zaczynac od step1)
  • w step 3 sie troszke zmienil. dodaje sie certificates a pozniej po prostu computer Account i tyle (dla mnie tak zadzialalo)
  • Jezeli mamy to co jest pod step4 (w sensie jest widoczny nas certyfikat) to jestesmy na dobrej drodze
  • po step4 uruchamiamy komende
    pvk2pfx.exe -pvk TempCA.pvk -spc TempCA.cer
    Wazne zeby byc tam gdzie znajduja sie certyfikaty

ok jest certyfikat ktory mozna bez problemu odczytac

Opisze mniej wiecej co sie dzieje

        private void button3_Click()
        {
            //Sign from certificate in a pfx or a p12 file
            string PfxFileName = _keyLocation; // tutaj dac sciezke do pfx
            string PfxPassword = _password; // tutaj haslo DO PFX
            X509Certificate2 cert = new X509Certificate2(PfxFileName, PfxPassword);
            SignWithThisCert(cert);
        } 

tutaj jest podpisywanie za pomoca iTextSharp

        private void SignWithThisCert(X509Certificate2 cert)
        {
            string SourcePdfFileName = _pathSelected; // sciezka pdfa 
            string DestPdfFileName = _pathSelected + "-Signed.pdf"; // sciezka output dla podpisanego pdfa
            Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(cert.RawData) };
            IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
            PdfReader pdfReader = new PdfReader(SourcePdfFileName);
            FileStream signedPdf = new FileStream(DestPdfFileName, FileMode.Create);  //the output pdf file
            PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
            PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
            //here set signatureAppearance at your will
            signatureAppearance.Reason = "Because I can";
            signatureAppearance.Location = "My location";
            signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
            MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
            //MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CADES);
            MessageBox.Show("Done");
        } 

dziala. Dokument podpisany jest wygenerowany

1 użytkowników online, w tym zalogowanych: 0, gości: 1