Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android - SSL-Verschlüsselung (https://www.delphipraxis.net/209448-android-ssl-verschluesselung.html)

AuronTLG 8. Dez 2021 08:46

Android - SSL-Verschlüsselung
 
Hallo,
ich wollte bei einer App einen verschlüsselten FTP-Zugriff implementieren und hatte eigentlich erwartet, dass ich das problemlos mit OpenSSL machen kann, so wie in der VCL, wo man dem IDFTP einfach einen entsprechend SSL-IOHandler verpasst.
Dies scheint aber nicht der Fall zu sein, da OpenSSL anscheinend schon seit Android 6 nicht mehr seitens Embarcadero dafür unterstützt wird.
Ich versuche gerade herauszufinden, was nun die einfachste Möglichkeit ist, das auf Android hinzubekommen, bin aber momentan eher verwirrt von dem, was ich dazu finde. Daher wollte ich mal hier diesbezüglich nachfragen, da ich doch bestimmt nicht der einzige bin, der sowas implementieren will...

philipp.hofmann 8. Dez 2021 10:19

AW: Android - SLL-Verschlüsselung
 
Was genau willst du implementieren? SFTP oder FTPS?
Mit Indy geht zumindest meines Wissens kein SFTP und FTPS ist nicht wirklich sicher.
Für SFTP nutze ich Chillkat, da habe ich aber nur mit deren Delphi DLLs Erfahrung, die dir hier nicht weiterhelfen.

AuronTLG 8. Dez 2021 10:24

AW: Android - SLL-Verschlüsselung
 
Ich wollte FTPS per Indy implementieren, was ja in der VCL ziemlich problemlos ging.

philipp.hofmann 8. Dez 2021 10:34

AW: Android - SLL-Verschlüsselung
 
Ok, also ich nutze in meinem Projekt weiterhin OpenSSL auf Android zum Versenden von Mails, dies ist also kein generelles Problem. Die Version ist dabei OpenSSL 1.0.2q 20 Nov 2018.
Geht dies bei dir nicht?

AuronTLG 8. Dez 2021 11:16

AW: Android - SLL-Verschlüsselung
 
Ich habe bis jetzt kein eigens installiertes OpenSSL genutzt, da man in der VCL ja einfach nur die TiDSSLIOHandlerSocketOpenSSL-Komponente nutzen musste.

Wäre das der einzige Weg, um FTPS auf Android hinzubekommen?

philipp.hofmann 8. Dez 2021 11:46

AW: Android - SLL-Verschlüsselung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich wäre auch davon ausgegangen, dass du dafür schon die OpenSSL-DLLs beilegen musst. Aber da kenne ich mich nicht aus.
Ich nutze für die Mails


und folgendermaßen initialisiere ich OpenSSL
Delphi-Quellcode:
 
object IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL
    MaxLineAction = maException
    Port = 0
    DefaultPort = 0
    SSLOptions.Method = sslvTLSv1_2
    SSLOptions.SSLVersions = [sslvTLSv1_2]
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 1096
    Top = 152
  end
und folgendermaßen initialisiere ich dies:
Delphi-Quellcode:
procedure TicTrainerF.initSSL();
{$IFNDEF IOS}
var help2: String;
{$ENDIF}
begin
  if (not sslInited) then
  begin
    sslInited:=true;
    {$IFDEF ANDROID}
      IdOpenSSLSetLibPath(String.Empty);
    {$ENDIF}
    {$IFDEF IOS}
    {$ELSE}
      {$IFDEF MACOS}
        IdOpenSSLSetCanLoadSymLinks(false);
        IdOpenSSLSetLoadSymLinksFirst(false);
        IdOpenSSLSetLibPath(TPath.GetDirectoryName(ParamStr(0)));
        mlog.info('InitSSL from ' + TPath.GetDirectoryName(ParamStr(0)));
      {$ENDIF}
    {$ENDIF}
    {$IFDEF MSWINDOWS}
      IdOpenSSLSetLibPath(TPath.GetDirectoryName(ParamStr(0)));
      mlog.info('InitSSL from ' + TPath.GetDirectoryName(ParamStr(0)));
    {$ENDIF}

    IdSSLOpenSSLHeaders.Load();
    {$IFDEF ANDROID}
      help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
      if (length(help2) > 0) then
      begin
        IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetLibraryPath));
        IdSSLOpenSSLHeaders.Load();
        help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
        if (length(help2) > 0) then
        begin
          IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath));
          IdSSLOpenSSLHeaders.Load();
          mlog.info('SSL-Version(3): ' + OpenSSLVersion);
          help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
          if (length(help2) > 0) then
          begin
            mlog.info('SSL-Errors: ' + help2);
          end;
        end else begin
          mlog.info('SSL-Version(2): ' + OpenSSLVersion);
        end;
      end else begin
        mlog.info('SSL-Version(1): ' + OpenSSLVersion);
      end;
    {$ELSE}
      mlog.info('SSL-Version: ' + OpenSSLVersion);
      {$IFNDEF IOS}
        help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
        if (length(help2) > 0) then
          mlog.info('SSL-Errors : ' + help2);
      {$ENDIF}
    {$ENDIF}
  end;
end;
und natürlich legen ich der App alle notwendigen Libs bei und die habe ich von hier:
https://git.fairkom.net/chat/faircha...sl/android-arm
https://git.fairkom.net/chat/faircha...android-arm64/

AuronTLG 8. Dez 2021 13:11

AW: Android - SLL-Verschlüsselung
 
Hm faszinierend.

Ich hatte es fast genauso probiert. Anscheinend hatte ich einfach die falschen Bibliotheken. Mit denen hier funktioniert es problemlos.
Vielen Dank!

AuronTLG 8. Dez 2021 13:19

AW: Android - SLL-Verschlüsselung
 
Da ich gerade dabei bin: Welche Bibliotheken sollte man dann für dasselbe in IOS nehmen? Der Link von Embarcadero scheint hoffnungslos veraltet zu sein.

philipp.hofmann 8. Dez 2021 13:26

AW: Android - SLL-Verschlüsselung
 
Schick mir deine E-Mail-Adresse, dann sende ich dir die iOS-Libs. Da habe ich mir nicht notiert, woher ich sie habe.

AuronTLG 13. Dez 2021 08:15

AW: Android - SSL-Verschlüsselung
 
Hm, ist bei IOS noch irgendwas zu beachten?
Ich bekomme da beim SSL-Verbinden eine Zugriffsverletzung, die ich nicht weg bekomme.
Laut Embarcadero soll man die Libraries einfach in den Debug/Release-Ordner schmeißen, jedoch ist sind die ganzen Angaben von denen so veraltet, dass ich dem etwas misstraue.

philipp.hofmann 13. Dez 2021 12:02

AW: Android - SSL-Verschlüsselung
 
Das mit dem in den Debug/Release-Pfad packen, ist soweit richtig.
Manchmal braucht man für iOS noch bestimmte Capabilities im developer.apple.com-Account, damit etwas geht.
Bei mir funktioniert es unter iOS auf jeden Fall und der auf iOS reduzierte Initialisierungscode ist ja denkbar knapp:

Delphi-Quellcode:
procedure TicTrainerF.initSSL();
begin
  if (not sslInited) then
  begin
    sslInited:=true;
    IdSSLOpenSSLHeaders.Load();
    mlog.info('SSL-Version: ' + OpenSSLVersion);
  end;
end;
Am Besten fragst du mal im englischen Forum nach (https://en.delphipraxis.net/), dort liest sowohl der Indy-Entwickler Remy mit, als auch Dave Nottage.

AuronTLG 14. Dez 2021 11:29

AW: Android - SSL-Verschlüsselung
 
Das mit dem englischen Delphipraxis werde ich machen, sobald ich das mit dem Account rübernehmen hinbekommen habe... hab mein Passwort wie gefordert resetted, aber es kommt keine Email an, auch nicht im Spam...

In der Zwischenzeit habe ich mal per Debugger geschaut, wo es denn eigentlich knallt.
Ergebnis: das Connect vom IDFTP löst es oberflächlich aus, ist aber eigentlich tief drin, genauer gesagt in der Unit "IdSSLOpenSSL" in der Methode "LoadOpenSSLLibrary" beim Aufruf von "OpenSSL_add_all_ciphers", was eine library-Methode ist.

Meine Vermutung wäre ja, dass noch irgendetwas beim statischen Laden der libssl.a und libcrypto.a schiefgeht oder eventuell irgendein Versionsschwachsinn.
Ich verwende momentan Delphi 10.4.2 und einer IOS 14.5 SDK.

AuronTLG 4. Apr 2022 16:53

AW: Android - SSL-Verschlüsselung
 
Ich hatte das Thema erstmal beiseite gelegt, da ich anderes zu tun hatte, habe es jetzt aber wieder aufgegriffen.

Ich bin mittlerweile auf Delphi 11 hoch und das Problem tritt leider immer noch genauso auf wie im obigen Post beschrieben.

Deswegen wollte ich hier nochmal nachfragen, ob irgendwer vielleicht einen entscheidenden Hinweis dafür hat, wie ich die SSL-Verschlüsselung auf IOS zum Laufen bekomme.
Ich bin mir bewusst, dass es andere Drittanbieter-Komponenten gibt, die das problemlos erledigen, nur wäre es mir am liebsten, wenn ich durchgängig den IDFTP dafür verwenden könnte, insbesondere, da es auf Android problemlos funktioniert...

oakley 19. Apr 2022 19:18

AW: Android - SSL-Verschlüsselung
 
Hallo,

sorry dass ich mich hier einklinke aber ich habe das gleiche Problem unter Android in Delphi 11.

Die libssl.so und libcrypto.so habe ich ins Android/Release Verzeichnis gepackt und stelle beide Dateien im Verzeichnis library\lib\armeabi-v7a\ bereit.

Die Prozedur initssl habe ich auf das Notwendigste für Android gekürzt. Wenn ich jetzt zur dementsprechenden https Adresse posten möchte, bekomme ich, dass die SSL Bibliothek nicht geladen werden konnte.

Delphi-Quellcode:
var help2: String;
begin
  if (not sslInited) then
  begin
    sslInited:=true;
    IdOpenSSLSetLibPath(String.Empty);
    IdSSLOpenSSLHeaders.Load();
    help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
    if (length(help2) > 0) then
    begin
      IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetLibraryPath));
      IdSSLOpenSSLHeaders.Load();
      help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
      if (length(help2) > 0) then
      begin
        IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath));
        IdSSLOpenSSLHeaders.Load();
        help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
      end;
    end;
  end;
end;
Delphi-Quellcode:
var H: TIdHttp;
    SS: TStringStream;
    IdSSL : TIdSSLIOHandlerSocketOpenSSL;
begin
  initssl;
  H := TIdHttp.Create(nil);
  idSSL := TIdSSLIOHandlerSocketOpenSSL.Create(H);
  idSSL.SSLOptions.Method := sslvTLSv1_2;
  idSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
  idSSL.SSLOptions.Mode := sslmUnassigned;
  idSSL.SSLOptions.VerifyMode := [];
  idSSL.SSLOptions.VerifyDepth := 0;
  H.IOHandler := IdSSL;

  try
    SS := TStringStream.Create;
    try
      H.Post(--> hier kommt die https URL,SS);
      ShowMessage(SS.DataString);
    finally SS.Free;
    end;
  finally H.Free;
  end;

philipp.hofmann 19. Apr 2022 20:20

AW: Android - SSL-Verschlüsselung
 
Bist du dir denn sicher, dass du es unter Android-32-bit nutzt? Ich frage, weil du die Libs in library\lib\armeabi-v7a\ packst.
Für Android-64-bit ist der richtige Remote-Path library\lib\arm64-v8a\

oakley 19. Apr 2022 20:33

AW: Android - SSL-Verschlüsselung
 
Hallo Phillipp,

ja ist definitiv 32 bit.

LG

Mirko

oakley 20. Apr 2022 12:27

AW: Android - SSL-Verschlüsselung
 
Hallo nochmal,

ich habe die libssl.so und libcrypto.so mal testweise in assets\internal\ bereit gestellt und den Pfad so definitert IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(T Path.GetDocumentsPath)) .

Die 32-bit DAteien habe ich auch hier hertuner geladen.
https://git.fairkom.net/chat/faircha...sl/android-arm

Wenn ich mit den Wert von help2 anzeigen lasse bekomme ich immer, dass die Datei libcrypto.so nicht geladen werden kann.
Habe ich evtl. die falschen .so Dateien?

Habe noch vergessen zu schreiben, dass ich mittlerweile auch auf Delphi 11 bin.

LG

Mirko


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz