Zum Hauptinhalt springen

SckStartTls

obj -> SckStartTls(int1[, alpha2]) : int

Ausführbar von Clients mit grafischer Oberfläche Ausführbar vom Server Ausführbar von Clients mit Programmierschnittstelle Ausführbar von der Web-Schnittstelle Ausführbar vom Druckprozessor Ausführbar von der ODBC-Schnittstelle Ausführbar vom SOA-Service

TLS-Verschlüsselung für Socket-Verbindung einleiten

Details

Mit dieser Funktion wird für eine mittels SckConnect () geöffnete Verbindung eine TLS-Verschlüsselung eingeleitet. In (obj) wird der Socket-Deskriptor übergeben.

Durch die Optionen (int1) _SckTlsMax, _SckTlsHigh, _SckTlsMed und _SckTlsLow wird der Sicherheitslevel der verschlüsselten Verbindung unter Verwendung der Transport Layer Security definiert. Der Aufruf von SckSTartTls(Obj, _SckTlsMed ) stellt eine verschlüsselte Verbindung zum Server unter Verwendung von SSL 3.0 oder TLS 1.x her, eine unverschlüsselte Verbindung oder die Verwendung von SSL 2.0-Verschlüsselungen wird abgelehnt.

Falls der Server keine akzeptierte Version oder überhaupt keine Verschlüsselung anbietet, liefert SckStartTls() den Fehler _ErrSckTlsConnect zurück. Der Fehlerwert kommt auch dann, wenn das TLS-Handshake mit dem Server fehlschlägt. Eine Überprüfung der Gültigkeit des Server-Zertifikats ist derzeit nicht möglich.

Falls der Server Probleme mit den TLS 1.x-Protokollen hat, kann die Option _SckNoTLSv1 mit _SckTlsMed oder _SckTlsLow kombiniert werden, um die Unterstützung auf das Protokoll SSL 3.0 zu beschränken.

Die verwendete TLS-Version kann mit SckInfo (..., _SckVersionTLS ) abgefragt werden.

Soll das serverseitig verwendete Zertifikat überprüft werden, muss die Angabe in (int3) mit _SckOptVerify kombiniert werden. Voraussetzung für eine erfolgreiche Prüfung von Zertifikaten ist eine Sammlung von Stammzertifikaten vertrauenswürdiger Organisationen (root CAs). Diese Sammlung wird als Datei common\ca-bundle.crt im CONZEPT 16-Datenverzeichnis abgelegt. Zur vollständigen Überprüfung muss zusätzlich der "Common Name" in dem Zertifikat mit dem Server-Namen verglichen werden. Der "CN" kann mit der Anweisung SckInfo (..., _SckCertificateCN ) ermittelt werden.

Tritt bei der Überprüfung des Zertifikats ein Fehler auf, liefert der Befehl _ErrSckTlsCertificateVerify zurück. Der Fehlerwert der Überprüfung befindet sich in der Eigenschaft CertificateError des System -Objekts.

Zusätzlich zu den Konstanten _SckTlsMax, _SckTlsHigh, _SckTlsMed und _SckTlsLow kann mit _SckTlsSNI beim Verbindungsaufbau die Server Name Indication (SNI) eingesetzt werden. Dafür muss der Name des Zielhosts im Argument (alpha2) angegeben werden.

Beispiel zur Kommunikation mit einem verschlüsseltem Server durch einen HTTP-Proxy

// Verschlüsselte Verbindung durch HTTP-Proxy aufbauen
sub ConnectProxy
(
aProxyName : alpha; // Name oder IP-Adresse des Proxy-Servers
aProxyPort : word; // Port des Proxy-Servers
aHostName : alpha; // Name oder IP-Adresse des Zielservers (bei SNI nur Name)
aHostPort : word; // Port des Zielservers
aURI : alpha(255); // Aufzurufender Pfad auf dem Server
)

local
{
tHostName : alpha(90);
tSck : handle;
tReq : handle;
tRsp : handle;
tLst : handle;
tFsi : handle;
}

{
tHostName # aHostName + ':' + CnvAI(aHostPort);

tSck # SckConnect(aProxyName,aProxyPort,0,500);
if (tSck > 0)
{
// Anfrage senden
tReq # HttpOpen(_HttpSendRequest,tSck);
tReq->spMethod # 'CONNECT';
tReq->spHostName # tHostName;

tLst # tReq->spHttpHeader;
tLst->CteInsertItem('Accept',0,'*/*');
tLst->CteInsertItem('Connection',0,'keep-alive');

tReq->HttpClose(0);

// Antwort empfangen
tRsp # HttpOpen(_HttpRecvResponse,tSck);
if (tRsp > 0)
{
// Ausgabe Header (Debugging)
tRsp->DbgHeader();

tRsp->HttpClose(0);
}

// Anfrage senden
tSck->SckStartTls(_SckTlsHigh | _SckTlsSNI, aHostName);
tReq # HttpOpen(_HttpSendRequest,tSck);
tReq->spHostName # tHostName;
tReq->spURI # aURI;

tLst # tReq->spHttpHeader;
tLst->CteInsertItem('Accept',0,'*/*');
tLst->CteInsertItem('Connection',0,'keep-alive');

tReq->HttpClose(0);

// Antwort empfangen
tRsp # HttpOpen(_HttpRecvResponse,tSck);
if (tRsp > 0)
{
// Ausgabe Header (Debugging)
tRsp->DbgHeader();

// Antwort verarbeiten
tFsi # FsiOpen(_Sys->spPathTemp + 'Response',_FsiStdWrite);
tRsp->HttpGetData(tFsi);
tFsi->FsiClose();

tRsp->HttpClose(_HttpCloseConnection);
}

tSck->SckClose();
}
else WinDialogBox(0,'Socket-Fehler',CnvAI(tSck),0,0,0);
}

// HTTP-Header im Debugger ausgeben
sub DbgHeader
(
aRsp : handle;
)

local
{
tLst : handle;
tHdr : handle;
}

{
tLst # aRsp->spHttpHeader;
if (tLst > 0)
{
for tHdr # tLst->CteRead(_CteFirst);
loop tHdr # tLst->CteRead(_CteNext,tHdr);
while (tHdr != 0)
{
DbgTrace(tHdr->spName + ' : ' + tHdr->spCustom);
}
}
}

Mögliche Laufzeitfehler:

  • _ErrHdlInvalid: Der angegebene Deskriptor (obj) ist ungültig oder verweist nicht auf eine Socket-Verbindung.