Autor Téma: Certifikát ako zdroj licenčných údajov  (Přečteno 888 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Certifikát ako zdroj licenčných údajov
« kdy: 20-06-2019, 11:06:46 »
Som v tom totálny laik. Preto taká otázka:
Vlastním TMS Cryptography Pack a Obsidium Lite. Problém je v tom, že v certifikáte vytvorenom v Obsidium je dostupných málo údajov. V TMS ich je podstatne viac.
Je možné tieto certifikáty vzájomne zameniť? Presnejšie certifikát TMS použiť pre "Obsidium", tak aby som mal prístup k všetkým údajom.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #1 kdy: 21-06-2019, 12:17:26 »
Už som to pochopil. Nemám čo meniť.
No vyskočil mi problém s diakritikou. Na vytvorenie certifikátu som použil free X509v3CertificateGenerator.exe zo stránky TMS. Že má pre AlternativeName1 až 6 prehodené poradie ma neštve.
Ale diakritika je problém. Ak to pri načítaní nechám v pôvodnom tvare (string), tak mám (klasicky šžť...) prázdne znaky. Ak použijem konverziu AnisString(), tak dostanem otázniky.
Text ŠŽ mám uložený ako $#008A$#008A.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #2 kdy: 21-06-2019, 22:07:45 »
Žiaden návrh? Všetky moje jednoduché pokusy zlyhali. Rôzne spôsoby pretypovania. Skoro vždy som dostával rovnaké výsledky. Nerád by som to mal bez diakritiky. Pôsobí to viac než divne.
Vôbec netuším, čo vlastne znamená $#008A.
  • $ = šestnástková sústava
  • # - netuším
  • 008A - Aha, našiel som Unicode Hex 0x8A
string je alias pre UnicodeString. Čo s tým treba urobiť aby to bolo správne?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #3 kdy: 22-06-2019, 06:00:28 »
Pravděpodobně tomu předáváš češtinu ve špatném kódování, tudíž se znaky převedou na "otazník ve čtverečku" na zvýraznění, že jde o neplatný znak. Začni tím, že uděláš certifikát bez českých (a slovenských) znaků, jestli se ti udělá správně, a teprve potom řeš češtinu. Očekávám, že zjistíš, že to chce vstup ne v ANSI, ale v UTF8 (použij UTF8Encode).

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 209
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #4 kdy: 22-06-2019, 06:05:36 »
...pokud ale na to generování nevolá externí exe, pak záleží na konkrétním způsobu volání. Třeba to může vyžadovat převod na OEM kódování.

Ale o tom si tu můžeme teoreticky tlachat, dokud nebudou poskytnuty konkrétní informace o způsobu generování.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #5 kdy: 22-06-2019, 08:57:28 »
Bez diakritiky to funguje.
Generoval som to pomocou *.exe aj programovo. Výsledok bol rovnaký. Vlastnosti generátora certifikátu sú string + vlastnosť Unicode je noUni. Pri programovom generovaní som tie texty zadal priamo do komponentu. Skúsim to čo píše pepak - upraviť vstup.
Kód: Delphi [Vybrat]
  1.     MyGenerator := TX509Certificate.Create;
  2.     MyGenerator.KeyFilePath := 'd:\Dokumenty\Delphi XE7\Component Testing\\mykey.key';
  3.     MyGenerator.CrtFilePath := 'd:\Dokumenty\Delphi XE7\Component Testing\\mycsr.csr';
  4.     MyGenerator.signatureAlgorithm := TSignAlgo.sa_sha256rsa;
  5.     MyGenerator.BitSizeEncryptionAlgorithm := 2048;
  6.     MyGenerator.countryName := 'SK';
  7.     MyGenerator.stateName := 'Nouvelle-Aquitaine';
  8.     MyGenerator.localityName := 'Bordeaux';
  9.     MyGenerator.OrganizationName := 'Cyberens';
  10.     MyGenerator.commonName := 'Jasot certificate';
  11.     MyGenerator.AltName1 := **('Name 1 8ščťžýáíé8');  // Tu to testujem
  12.     MyGenerator.GenerateSelfSigned;
**Skúsil som UTF8Encode, AnsiString, Utf8ToString. Bezvýsledne. Výsledok je rovnaký. Nastavenie kódovej stránky som nenašiel.

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #6 kdy: 22-06-2019, 12:47:36 »
Skúsim to čo píše pepak - upraviť vstup.
To by podle mela byt zalezitost implementace toho TX509Certificate. Co to vlastne je zac? V Delphi je standardne v DBXCommon stejnojmenna abstraktni trida, kterou pouziva napr. Indy v DBXCommonIndy...

Jinak kdyz zadam cestinu do OpenSsl.exe, tak ten ty NON-ASCII znaky koduje zrejme v ANSI, kazdy znak jako \xHH. Mozna ze i tvoje o $#008A je nejake unicode kodovani.
Kdyz si nechas vypsat obsah tech poli, tak co dostanes?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #7 kdy: 22-06-2019, 21:02:01 »
Citace
Kdyz si nechas vypsat obsah tech poli, tak co dostanes?
vstup
Kód: Delphi [Vybrat]
  1. MyGenerator.AltName1 := 'Name 1 6ščťžýáíé6';
Výstup
Kód: Delphi [Vybrat]
  1. Name 1 6蝞ýáíé6
Pri krokovaní viď obrázok.
« Poslední změna: 22-06-2019, 21:04:51 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #8 kdy: 23-06-2019, 08:33:12 »
Citace
Kdyz si nechas vypsat obsah tech poli, tak co dostanes?
vstup
Kód: Delphi [Vybrat]
  1. MyGenerator.AltName1 := 'Name 1 6ščťžýáíé6';
Výstup
Kód: Delphi [Vybrat]
  1. Name 1 6蝞ýáíé6
Pri krokovaní viď obrázok.
No je otazka, co je ve skutecnosti uvnitr. Ale v kazdem pripade budes muset nastudovat to, cim se ten certifikat snazis vytvorit, to nema obecnou platnost a existuje hafo moznosti.

Treba kdyz u OpenSSL dam parameter -nameopt utf8 a ty texty dodam v kodovani UTF-8, tak pak je uvnitr certifikatu tohle>
CN=Name 1 6\xC5\xA1\xC4\x8D\xC5\xA5\xC5\xBE\xC3\xBD\xC3\xA1\xC3\xAD\xC3\xA96

A pri cteni v programu bych to musel znak po znaku projit, jakmile bych narazil na neescapovane '\', tak bych hodnoty xHH musel prevest z hexa do bytu a ten pridat na konec to UTF8 stringu
no pak jednoduse prest UTF8String na UnicodeString.

Je otazka, co tam skutecne mas v tom certifikatu, protoze tam urcite nebudes mit Delphi zapis #$HHHH jak ti to ukazuje debugger a to je treba zjistit, s OpenSSL bych na to pouzil prikaz
openssl x509 -in cert.pem -text -noout

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #9 kdy: 23-06-2019, 09:00:47 »
Práve som ukončil laické prechádzanie zdrojákov. Tu je môj upravený výsledok. Ako som najlepšie vedel. Vyhodil som všetko čo podľa mňa sa netýka predmetu otázky. Či to niekto bude čítať...
Kód: Delphi [Vybrat]
  1. unit MiscObj;
  2. type
  3.   TConvertType = (base64, hexa, base64url, base32, raw);
  4.   TUnicode = (noUni, yesUni);
  5.  
  6.  
  7.     property Unicode: TUnicode read FUni write FUni default yesUni;
  8.  
  9.  
  10. unit X509Obj;
  11.   TX509CSR = class(TTMSCryptBase)
  12.   private
  13.     FUni: TUnicode;
  14.     FAltName1: string;
  15.   published
  16.     property AltName1: string read FAltName1 write FAltName1;
  17.  
  18.  
  19. procedure TX509Certificate.GenerateSelfSigned;
  20. var
  21.   prime1, prime2, dp, dq, qinv: TRSAarray;
  22.   KeyFilePathChar, CertFilePathChar, modulus, privateExponent, publicExponent,
  23.     publicKey, PrivateKey: PAnsiChar;
  24.   conv: TConvert;
  25.   err: Integer;
  26.   information: _CERTINFSTRUCT;
  27.   S: TStringList;
  28. begin
  29.   conv := TConvert.Create;
  30.   information.NBAN := 0;
  31.   information.AN := GetMemory(6);
  32.   try
  33.     information.CouN := conv.StringToBufferA(FSubjectCountryName, FUni);...
  34.     if FAltName1 <> '' then
  35.     begin
  36.       information.NBAN := information.NBAN + 1;
  37.       information.AN[information.NBAN - 1] := conv.StringToBufferA(FAltName1, FUni);
  38.     end;...
  39. end;
  40.  
  41.  
  42. unit MiscObj;
  43. function TConvert.StringToBuffer(str: string; u: TUnicode; var msgLen: Integer): PByte;
  44. var
  45.   t: TArray<Byte>;
  46. {$IFEND}
  47. begin
  48. {$IF (defined(MSWINDOWS) or defined(MACOS)) and (not defined(IOS))}
  49.   if u = yesUni then
  50.   begin
  51.     Result := UnicodeToPAnsiChar(str);
  52.     msgLen := PAnsiCharFromUnicodeLength(str);
  53.   end
  54.   else
  55.   begin
  56.     Result := StringToPAnsiChar(str);
  57.     msgLen := Length(str);
  58.   end;
  59. end;
  60.  
  61.  
  62. function TConvert.StringToPAnsiChar(str: string): PAnsiChar;
  63. var
  64.   t: TArray<Byte>;
  65. begin
  66.   t := StringToByteArray(str);
  67.   Result := GetMemory((Length(t) + 1) * SizeOf(AnsiChar));
  68.   Move(t[Low(t)], Result^, Length(t));
  69.   Result[High(t) + 1] := #0;
  70. end;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #10 kdy: 23-06-2019, 11:56:44 »
No a jeste si najdi, co s tim dela, kdyz to cte zpatky, aby ses podival na presne kodovan  a z toho to dostal zpatky do stringu.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #11 kdy: 23-06-2019, 18:25:08 »
Tak som sa na to pozrel. Výsledok je v prílohe (152 riadkov). Pre mňa to je španielska dedina :'(
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #12 kdy: 24-06-2019, 11:35:37 »
Skúšam čo viem, ale nemám šancu:
Kód: Delphi [Vybrat]
  1. MyCertifikate.Unicode := noUni;
  2.           ('Name 1 XľščťžýáíéX')                  Name 1 X¾šèžýáíéX
  3.  
  4.  
  5. AnsiString('Name 1 XľščťžýáíéX')                  Name 1 X¾šèžýáíéX
  6. UTF8
  7. AnsiToUtf8('Name 1 XľščťžýáíéX')                  Name 1 X¾šèžýáíéX
  8. UTF8ToUnicodeString('Name 1 XľščťžýáíéX')         Name 1 X???????X
  9. UTF8Decode('Name 1 XľščťžýáíéX')                  Name 1 X???????X
  10.  
  11.  
  12. Utf8ToAnsi('Name 1 XľščťžýáíéX')                  Name 1 X???????X
  13. Utf8ToAnsi('Name 1 XľščťžýáíéX')  AnsiString()    Name 1 X???????X
  14.  
  15.  
  16. UTF8Encode('Name 1 XľščťžýáíéX')                  Name 1 X¾šèžýáíéX
  17. UTF8Encode('Name 1 XľščťžýáíéX')  UTF8Decode()    Name 1 X3?e??����X
  18. UTF8Encode('Name 1 XľščťžýáíéX')  UTF8ToString()  Name 1 X3?e??����X
  19. UTF8Encode('Name 1 XľščťžýáíéX')  Utf8ToAnsi()    Name 1 X3?e??����X
  20.  
  21.  
  22. MyCertifikate.Unicode := yesUni;
  23. ('Name 1 XľščťžýáíéX')                           Name 1 XľščťžýáíéX
  24. AnsiString('Name 1 XľščťžýáíéX')                 Name 1 XľščťžýáíéX
  25.  
  26.  
  27. AnsiToUtf8('Name 1 XľščťžýáíéX')                 Name 1 XľščťžýáíéX
  28. UTF8ToUnicodeString('Name 1 XľščťžýáíéX')        Name 1 X��蝞����X
  29. UTF8Decode('Name 1 XľščťžýáíéX')                 Name 1 X��蝞����X
  30.  
  31.  
  32. Utf8ToAnsi('Name 1 XľščťžýáíéX')                 Name 1 X��蝞����X
  33. Utf8ToAnsi('Name 1 XľščťžýáíéX')  AnsiString()   Name 1 Xi?1i?1e??i?1i?1i?1i?1X
  34.  
  35.  
  36. UTF8Encode('Name 1 XľščťžýáíéX')                 Name 1 XľščťžýáíéX
  37. UTF8Encode('Name 1 XľščťžýáíéX')  UTF8Decode()   Name 1 X�3A!�?AYA3A1A!A�A�X
Taký istý problém som mal(mám) pri TAdvRichEditor. Tam ma odbili, že používam zlú kódovú stránku ??? :o  Ak im napíšem, tak predpokladám takú istú reakciu. Ja mám podozrenie, že skôr kašlú na naše kódové stránky.
Prikladám to aj v txt. Tam to vyzerá trochu ináč.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #13 kdy: 24-06-2019, 16:05:39 »
Skúšam čo viem, ale nemám šancu
Jen jsem to zbezne probehnul a zda se mi, ze to prevadeji na posloupnost bytu a zpatky, takze bych zkusil neco takoveho:
Kód: Delphi [Vybrat]
  1. var
  2.   unicode: UnicodeString;
  3.   utf8: UTF8string;
  4. begin
  5.   unicode := 'Name 1 6ščťžýáíé6';
  6.   utf8 := Utf8Encode(unicode);
  7.   cert.Unicode := noUnit;
  8.   cert.AltName1 := utf8;
  9.   ...
  10.   utf8 := AltName1;
  11.   unicode := Utf8ToString(utf8);
  12.  
A kdyz to nepomuze, tak jedine ladit a divat se, co presne za data tam leze.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 519
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Certifikát ako zdroj licenčných údajov
« Odpověď #14 kdy: 24-06-2019, 18:39:54 »
Neviem, či je to práve vhodné v danom prípade.
Ale ak má programátor na starosti vstup aj výstup, potom je možné obísť rôzne interné kódovania tak, že sa rovno podstrčí text vo formáte bytes. Teda unicodeString sa vopred prevedie na TBytes (Unicode na Bytes, textové funkcie nenosím v hlave, keď riešim iné).
Vo formáte bytes sa text vloží napríklad do komprimátora. Rozbalený sa zase vráti ako bytes. No a užívateľ si opačnou funkciu upraví text na čitateľný unicode.
Nejde to všade, ale ak to ide, je to spoľahlivá cesta, ktorá nesklame.
Výhoda je samozrejme, keď sú texty krátke, potom nepríde k veľkým konverziám.
Ale ak sa certifikáty riešia pre tretiu stranu, tak toto riešenie nebude vhodné. Nemôžu tam vyskočiť hieroglify.
Problém certifikátov ma ešte len čaká. Budem poctivo sledovať vývoj.