SSLEngine Klasse

Definition

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

[Android.Runtime.Register("javax/net/ssl/SSLEngine", DoNotGenerateAcw=true)]
public abstract class SSLEngine : Java.Lang.Object
[<Android.Runtime.Register("javax/net/ssl/SSLEngine", DoNotGenerateAcw=true)>]
type SSLEngine = class
    inherit Object
Vererbung
SSLEngine
Attribute

Hinweise

Eine Klasse, die eine sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

Zu den sicheren Kommunikationsmodi gehören: <UL>

<LI><em>Integrity Protection</em>. SSL/TLS schützt vor der Änderung von Nachrichten durch einen aktiven Abhörer.

<LI><em>Authentication</em>. In den meisten Modi bietet SSL/TLS die Peerauthentifizierung. Server werden in der Regel authentifiziert, und Clients können wie von Servern angefordert authentifiziert werden.

<LI><em>Vertraulichkeit (Datenschutz)</em>. In den meisten Modi verschlüsselt SSL/TLS Daten, die zwischen Client und Server gesendet werden. Dies schützt die Vertraulichkeit von Daten, sodass passive Abhörer keine vertraulichen Daten wie Finanzinformationen oder persönliche Informationen von vielen Arten sehen.

</UL>

Diese Arten des Schutzes werden durch eine "Cipher Suite" angegeben, die eine Kombination von kryptografischen Algorithmen ist, die von einer bestimmten SSL-Verbindung verwendet werden. Während des Aushandlungsprozesses müssen sich die beiden Endpunkte auf eine Verschlüsselungssuite einigen, die in beiden Umgebungen verfügbar ist. Wenn es keine gemeinsame Suite gibt, kann keine SSL-Verbindung hergestellt und keine Daten ausgetauscht werden.

Die verwendete Verschlüsselungssuite wird durch einen Verhandlungsprozess namens "Handshaking" eingerichtet. Das Ziel dieses Prozesses besteht darin, eine "Sitzung" zu erstellen oder erneut zu besuchen, wodurch viele Verbindungen im Laufe der Zeit geschützt werden können. Nachdem das Handshaking abgeschlossen ist, können Sie mit der #getSession() -Methode auf Sitzungsattribute zugreifen.

Die SSLSocket -Klasse bietet einen Großteil der gleichen Sicherheitsfunktionen, aber alle eingehenden und ausgehenden Daten werden automatisch mit dem zugrunde liegenden java.net.Socket Sockettransportiert, der standardmäßig ein blockierende Modell verwendet. Obwohl dies für viele Anwendungen geeignet ist, bietet dieses Modell nicht die Skalierbarkeit, die für große Server erforderlich ist.

Der Hauptunterschied von einem SSLEngine besteht darin, dass es mit eingehenden und ausgehenden Byteströmen unabhängig vom Transportmechanismus arbeitet. Es liegt in der Verantwortung des SSLEngine Benutzers, einen zuverlässigen E/A-Transport zum Peer zu veranlassen. Durch Trennen der SSL/TLS-Abstraktion vom E/A-Transportmechanismus kann die SSLEngine für eine Vielzahl von E/A-Typen verwendet werden, z java.nio.channels.spi.AbstractSelectableChannel#configureBlocking(boolean) non-blocking I/O (polling). B. , java.nio.channels.Selector selectable non-blocking I/Ound java.net.Socket Socket die herkömmlichen Input/OutputStreams, lokale java.nio.ByteBuffer ByteBuffers oder Bytearrays, zukünftige asynchrone E/A-Modelle usw.

Auf hoher Ebene erscheint die SSLEngine so:

app data

                           |           ^
                           |     |     |
                           v     |     |
                      +----+-----|-----+----+
                      |          |          |
                      |       SSL|Engine    |
              wrap()  |          |          |  unwrap()
                      | OUTBOUND | INBOUND  |
                      |          |          |
                      +----+-----|-----+----+
                           |     |     ^
                           |     |     |
                           v           |

                              net data

Anwendungsdaten (auch als Klartext oder Klartext bezeichnet) sind Daten, die von einer Anwendung erzeugt oder genutzt werden. Sein Pendant sind Netzwerkdaten, die entweder aus Handshaking- und/oder Chiffretextdaten (verschlüsselt) bestehen und über einen E/A-Mechanismus transportiert werden sollen. Eingehende Daten sind Daten, die vom Peer empfangen wurden, und ausgehende Daten sind für den Peer bestimmt.

(Im Kontext eines SSLEnginebedeutet der Begriff "Handshakedaten" alle Daten, die zum Herstellen und Steuern einer sicheren Verbindung ausgetauscht werden. Handshakedaten enthalten die SSL/TLS-Nachrichten "Warnung", "change_cipher_spec" und "Handshake".)

Es gibt fünf verschiedene Phasen für ein SSLEngine.

<OL><li> Creation: Die SSLEngine wurde erstellt und initialisiert, wurde aber noch nicht verwendet. Während dieser Phase kann eine Anwendung alle SSLEngine-spezifischen Einstellungen festlegen (aktivierte Verschlüsselungssammlungen, unabhängig davon, ob die SSLEngine im Client- oder Servermodus handshaken soll usw.). Sobald das Handshaking begonnen hat, werden jedoch alle neuen Einstellungen (mit Ausnahme des Client-/Servermodus, siehe unten) für den nächsten Handshake verwendet.

<li> Initial Handshake: Der anfängliche Handshake ist ein Verfahren, mit dem die beiden Peers Kommunikationsparameter austauschen, bis eine SSLSession eingerichtet ist. In dieser Phase können keine Anwendungsdaten gesendet werden.

<li-Anwendungsdaten> : Sobald die Kommunikationsparameter eingerichtet wurden und der Handshake abgeschlossen ist, können Anwendungsdaten durch die SSLEnginefließen. Ausgehende Anwendungsnachrichten werden verschlüsselt und integritätsgeschützt, und eingehende Nachrichten kehren den Prozess um.

<li> Rehandshaking: Beide Seiten können während der Phase der Anwendungsdaten jederzeit eine Neuverhandlung der Sitzung anfordern. Neue Handshakingdaten können zwischen den Anwendungsdaten gemischt werden. Vor Beginn der Rehandshake-Phase kann die Anwendung die SSL/TLS-Kommunikationsparameter wie die Liste der aktivierten Verschlüsselungssuiten und die Verwendung der Clientauthentifizierung zurücksetzen, kann aber nicht zwischen Client-/Servermodi wechseln. Wie bereits zuvor werden nach dem Handshaken keine neuen SSLEngine Konfigurationseinstellungen mehr bis zum nächsten Handshake verwendet.

<li> Closing: Wenn die Verbindung nicht mehr benötigt wird, sollte die Anwendung schließen SSLEngine und alle verbleibenden Nachrichten an den Peer senden/empfangen, bevor sie den zugrunde liegenden Transportmechanismus schließt. Sobald eine Engine geschlossen wurde, ist sie nicht wiederverwendbar: Es muss ein neues SSLEngine erstellt werden. </OL> Ein SSLEngine wird erstellt, indem von einem initialisierten SSLContextaufgerufen SSLContext#createSSLEngine() wird. Alle Konfigurationsparameter sollten festgelegt werden, bevor Sie den ersten Aufruf von wrap(), unwrap()oder beginHandshake()ausführen. Diese Methoden lösen alle den ersten Handshake aus.

Daten werden durch die Engine verschoben, indem bzw#unwrap(ByteBuffer, ByteBuffer) unwrap(). ausgehende oder eingehende Daten aufgerufen #wrap(ByteBuffer, ByteBuffer) wrap() werden. Abhängig vom Zustand von SSLEnginekann ein wrap() Aufruf Anwendungsdaten aus dem Quellpuffer nutzen und Netzwerkdaten im Zielpuffer erzeugen. Die ausgehenden Daten können Anwendungs- und/oder Handshakedaten enthalten. Ein Aufruf von unwrap() untersucht den Quellpuffer und kann den Handshake voranbringen, wenn es sich bei den Daten um Handshakinginformationen handelt, oder Anwendungsdaten im Zielpuffer platzieren, wenn es sich bei den Daten um Eine Anwendung handelt. Der Zustand des zugrunde liegenden SSL/TLS-Algorithmus bestimmt, wann Daten genutzt und erzeugt werden.

wrap() Aufrufe von und unwrap() geben eine SSLEngineResult zurück, die die status des Vorgangs und (optional) die Interaktion mit der Engine angibt, um Fortschritte zu erzielen.

Erzeugt SSLEngine /verarbeitet nur vollständige SSL/TLS-Pakete und speichert keine Anwendungsdaten intern zwischen Aufrufen von wrap()/unwrap(). Daher müssen Eingabe- und Ausgabe-s ByteBufferentsprechend dimensionieren sein, um den maximalen Datensatz zu enthalten, der erstellt werden kann. Aufrufe von SSLSession#getPacketBufferSize() und SSLSession#getApplicationBufferSize() sollten verwendet werden, um die geeigneten Puffergrößen zu bestimmen. Die Größe des Datenpuffers für ausgehende Anwendungen spielt in der Regel keine Rolle. Wenn Pufferbedingungen die ordnungsgemäße Nutzung/Produktion von Daten nicht zulassen, muss die Anwendung (über SSLEngineResult) ermitteln und das Problem beheben und dann den Aufruf erneut versuchen.

Gibt beispielsweise ein SSLEngineResult.Status#BUFFER_OVERFLOW Ergebnis zurück, wenn die Engine feststellt, unwrap() dass nicht genügend Zielpufferspeicher verfügbar ist. Anwendungen sollten diesen Wert aufrufen SSLSession#getApplicationBufferSize() und mit dem im Zielpuffer verfügbaren Speicherplatz vergleichen und ggf. den Puffer vergrößern. Analog dazu sollte SSLSession#getPacketBufferSize() die Anwendung aufrufen, wenn unwrap() ein SSLEngineResult.Status#BUFFER_UNDERFLOWzurückgegeben wird, um sicherzustellen, dass der Quellpuffer über genügend Platz zum Aufnehmen eines Datensatzes verfügt (ggf. vergrößern), und dann mehr eingehende Daten abrufen.

{@code
              SSLEngineResult r = engine.unwrap(src, dst);
              switch (r.getStatus()) {
              BUFFER_OVERFLOW:
                  // Could attempt to drain the dst buffer of any already obtained
                  // data, but we'll just increase it to the size needed.
                  int appSize = engine.getSession().getApplicationBufferSize();
                  ByteBuffer b = ByteBuffer.allocate(appSize + dst.position());
                  dst.flip();
                  b.put(dst);
                  dst = b;
                  // retry the operation.
                  break;
              BUFFER_UNDERFLOW:
                  int netSize = engine.getSession().getPacketBufferSize();
                  // Resize buffer if needed.
                  if (netSize > dst.capacity()) {
                      ByteBuffer b = ByteBuffer.allocate(netSize);
                      src.flip();
                      b.put(src);
                      src = b;
                  }
                  // Obtain more inbound network data for src,
                  // then retry the operation.
                  break;
              // other cases: CLOSED, OK.
              }
            }

Im Gegensatz zu SSLSocketsind alle Methoden von SSLEngine nicht blockierend. SSLEngine Implementierungen erfordern möglicherweise die Ergebnisse von Aufgaben, die einen längeren Zeitraum in Anspruch nehmen oder sogar blockieren. Beispielsweise muss ein TrustManager möglicherweise eine Verbindung mit einem Remotezertifikatüberprüfungsdienst herstellen, oder ein KeyManager muss einen Benutzer auffordern, zu bestimmen, welches Zertifikat als Teil der Clientauthentifizierung verwendet werden soll. Darüber hinaus kann das Erstellen und Überprüfen kryptografischer Signaturen langsam und scheinbar blockierend sein.

Für jeden Vorgang, der möglicherweise blockiert wird, erstellt eine SSLEnginejava.lang.Runnable delegierte Aufgabe. Wenn SSLEngineResult angibt, dass ein delegiertes Vorgangsergebnis erforderlich ist, muss die Anwendung aufrufen #getDelegatedTask() , um eine ausstehende delegierte Aufgabe zu erhalten und deren java.lang.Runnable#run() run() Methode aufzurufen (möglicherweise mit einem anderen Thread, abhängig von der Computestrategie). Die Anwendung sollte weiterhin delegierte Aufgaben abrufen, bis keine weiteren vorhanden sind, und den ursprünglichen Vorgang erneut versuchen.

Am Ende einer Kommunikationssitzung sollten Anwendungen die SSL/TLS-Verbindung ordnungsgemäß schließen. Die SSL/TLS-Protokolle verfügen über Handshakenachrichten, die geschlossen werden, und diese Nachrichten sollten an den Peer übermittelt werden, bevor sie den SSLEngine zugrunde liegenden Transportmechanismus freigeben und schließen. Ein Schließen kann durch eine der Folgenden initiiert werden: eine SSLException, eine eingehende Handshakenachricht oder eine der Close-Methoden. In allen Fällen werden Schließen-Handshake-Nachrichten von der Engine generiert und wrap() sollten wiederholt aufgerufen werden, bis der resultierende SSLEngineResultstatus "CLOSED" zurückgibt oder #isOutboundDone() true zurückgibt. Alle von der -Methode abgerufenen wrap() Daten sollten an den Peer gesendet werden.

#closeOutbound() wird verwendet, um der Engine zu signalisieren, dass die Anwendung keine weiteren Daten sendet.

Ein Peer signalisiert seine Absicht, zu schließen, indem er eine eigene Abschluss-Handshake-Nachricht sendet. Nachdem diese Nachricht vom Aufruf des lokalen SSLEngineunwrap() Benutzers empfangen und verarbeitet wurde, kann die Anwendung das schließen erkennen, indem sie aufruft unwrap() und nach einem SSLEngineResult mit status "CLOSED" sucht, oder wenn #isInboundDone() true zurückgegeben wird. Wenn der Peer aus irgendeinem Grund die Kommunikationsverbindung schließt, ohne die richtige SSL/TLS-Abschlussmeldung zu senden, kann die Anwendung das Datenstromende erkennen und der Engine #closeInbound() signalisieren, dass keine eingehenden Nachrichten mehr verarbeitet werden. Einige Anwendungen können sich für das geordnete Herunterfahren von Nachrichten von einem Peer entscheiden. In diesem Fall können sie überprüfen, ob der Abschluss durch eine Handshakenachricht und nicht durch eine Bedingung zum Ende des Datenstroms generiert wurde.

Es gibt zwei Gruppen von Verschlüsselungssammlungen, die Sie beim Verwalten von Verschlüsselungssammlungen kennen müssen:

<UL LI em Supported/em cipher suites( UL><LI><em>Supported</em> cipher suites): alle Suites, die von der SSL-Implementierung unterstützt werden. Diese Liste wird mithilfe #getSupportedCipherSuites()von gemeldet.

<LI><em>Enabled</em-Verschlüsselungssammlungen> , die möglicherweise kleiner sind als der vollständige Satz unterstützter Suites. Diese Gruppe wird mithilfe der #setEnabledCipherSuites(String []) -Methode festgelegt und mit der #getEnabledCipherSuites() -Methode abgefragt. Zunächst wird ein Standardsatz von Verschlüsselungssammlungen für eine neue Engine aktiviert, die die empfohlene Mindestkonfiguration darstellt. </UL>

Implementierungsstandards erfordern, dass standardmäßig nur Verschlüsselungssammlungen aktiviert werden, die Server authentifizieren und Vertraulichkeit bereitstellen. Nur wenn beide Seiten explizit einer nicht authentifizierten und/oder nicht privaten (unverschlüsselten) Kommunikation zustimmen, wird eine solche Verschlüsselungssammlung ausgewählt.

Jede SSL/TLS-Verbindung muss über einen Client und einen Server verfügen, sodass jeder Endpunkt entscheiden muss, welche Rolle er übernehmen soll. Diese Auswahl bestimmt, wer den Handshaking-Prozess beginnt und welche Art von Nachrichten von jeder Partei gesendet werden soll. Die -Methode #setUseClientMode(boolean) konfiguriert den Modus. Nachdem das anfängliche Handshaking gestartet wurde, kann ein SSLEngine nicht zwischen Client- und Servermodus wechseln, auch wenn Neuverhandlungen durchgeführt werden.

Anwendungen können delegierte Aufgaben in verschiedenen Threads verarbeiten. Wenn eine SSLEngine erstellt wird, wird die aktuelle java.security.AccessControlContext gespeichert. Alle zukünftigen delegierten Aufgaben werden mithilfe dieses Kontexts verarbeitet: Das heißt, alle Entscheidungen zur Zugriffssteuerung werden mithilfe des Kontexts getroffen, der bei der Erstellung der Engine erfasst wurde.

<HR>

<B>Parallelitätshinweise</B>: Es gibt zwei Parallelitätsprobleme, die beachtet werden müssen:

<OL><li>Die wrap() Methoden und unwrap() können gleichzeitig ausgeführt werden.

<li> Die SSL/TLS-Protokolle verwenden geordnete Pakete. Anwendungen müssen sicherstellen, dass generierte Pakete nacheinander übermittelt werden. Wenn Pakete in einer nicht ordnungsgemäßen Reihenfolge eingehen, können unerwartete oder schwerwiegende Ergebnisse auftreten.

Beispiel:

synchronized (outboundLock) {
                             sslEngine.wrap(src, dst);
                             outboundQueue.put(dst);
                         }

Als Folge dürfen zwei Threads nicht versuchen, dieselbe Methode (entweder oder wrap()unwrap()) gleichzeitig aufzurufen, da es keine Möglichkeit gibt, die letztliche Paketreihenfolge zu garantieren. </OL>

<h3>Standardkonfiguration für verschiedene Android-Versionen</h3>

SSLEngine Instanzen, die von der Standardeinstellung SSLContext abgerufen werden, werden wie folgt konfiguriert:

<style type="text/css"> tr.deprecated { background-color: #ccc; color: #999; font-style: italic; }</Stil>

<h4>Protocols</h4><table><thead><tr><th>Protocol</th<>th>Supported (API Levels)</th><th th>Enabled by default (API Levels)</th<>/tr></thead><tbody<>tr class="deprecated"><td>SSLv3</td td><>1– 25</td><td>1– 22</td<>/tr<>td><>TLSv1</td td><>1+</td<>td>1+</td<>/tr<>tr><td>TLSv1.1</td td>><20+</t d<>td>20+</td></tr><tr<>td>TLSv1.2</td<>td>20+</td><td>20+</td></tr<>tr><td>TLSv1.3</Td><td>29+</td<>td>29+</td></tr<>/tbody></table>

<h4>Cipher suites</h4><table><thead><tr><th>Cipher suite</th><th>Supported (API Levels)</th><th th>Enabled by default (API Levels)</th<>/tr></thead><tbody><tr class="deprecated"<>td>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td<>td>9-22</td td<>>9-19</td></tr><tr class="veraltet"><td>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td<>td>9-22</td><td>9-19</td<>/tr><tr class="deprecated"><td>SSL_DHE_DSS_WITH_DES_CBC_SHA</td><td>9-22</td><td>9-19</td></tr><tr class="deprecated"<>td>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td><td>9-22</td td><>9-19</td<>/tr<>tr class="deprecated"><td>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td<>td>9-22</td<>td>9-19</td></tr><tr class="deprecated"<>td>SSL_DHE_RSA_WITH_DES_CBC_SHA</td><td>9-22</td><td td>9-19</td<>/tr<>tr class="deprecated"><td>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</td><td>9-22</td td><<>/td<>/tr<>tr class="deprecated"<>td>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</td><td>9-22</td td></td<><<>> tr class="deprecated"><td>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</td td><>9-22</Td><td></td></tr><tr class="deprecated"><td>SSL_DH_anon_WITH_DES_CBC_SHA</td<>td>9-22</td td<>td></td<>>< tr tr class="deprecated"><td>SSL_DH_anon_WITH_RC4_128_MD5</td td><>9-22</td td><td></td></tr><tr class="deprecated"><td SSL_RSA_EXPORT_><WITH_DES40_CBC_SHA/td><td>9-22</td<>td>9-19</td<>/tr><tr class="deprecated"<>td>SSL_RSA_EXPORT_WITH_RC4_40_MD5</td><td>9-22</td><td>9-19</td></tr><tr trd><>SSL_RSA_WITH_3DES_EDE_CBC_SHA</td td><td>9+</td><td>9-19</Td></tr>tr class="deprecated"><td>SSL_RSA_WITH_DES_CBC_SHA</td><td>9-22</td<>td td>9-19</td></tr<>tr class="deprecated"<>td>SSL_RSA_WITH_NULL_MD5</td<>td>9-22</td td<>td></td><>< tr class="deprecated"<>td>SSL_RSA_WITH_NULL_SHA</td><<td>9-22</td><td></td<>/tr<>tr class="deprecated"<>td>SSL_RSA_WITH_RC4_128_MD5</td><td>9-25</td<>td>9-19</td></tr><tr="deprecated"><td>SSL_RSA_WITH_RC4_128_SHA</td td>><9-25</td<>td>9-23</td></tr><Tr><td>TLS_AES_128_GCM_SHA256</td<>td>29+</td><td>29+</td<>/tr<>tr><td>TLS_AES_256_GCM_SHA384</td><td>29+</td<>td>29+</td<>/tr<>tr td>><TLS_CHACHA20_POLY1305_SHA256</td><td>29+</td td 29+</td><> td></Tr><tr class="deprecated">td>TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td<>td>1-8</td><td>1-8</td<>/tr<>tr class="deprecated"<>td>TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td<>td>1-8</td><td>1-8</td<>/tr<>tr class="deprecated"><td TLS_DHE_DSS_WITH_AES_128_><<CBC_SHA/td<>td>9-22</td<>td>9-22</td<>/tr<>tr class="deprecated"<>td>TLS_DHE_DSS_WITH_AES_128_CBC_SHA256</td><td>20-22</td td><td></><td<> tr class="deprecated"<>td>TLS_DHE_DSS_WITH_AES_128_GCM_SHA256</td td>><20-22</td td><td></Td></tr>tr class="deprecated"><td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA</td<>td>9-22</td<>td td>20-22</td></tr<>tr tr class="deprecated"<>td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA256</td><td>20-22</td td><></td<>/tr<>tr class="deprecated"><td TLS_DHE_DSS_WITH_><<AES_256_GCM_SHA384/td<>td>20-22</td td><></td<>>< tr tr class="deprecated"><td>TLS_DHE_DSS_WITH_DES_CBC_SHA</td<>td>1-8</td><td>1-8</td></tr<>tr class="deprecated"<>td>TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td td>><1-8</td td><>1-8</td></tr<>tr class="deprecated"><td>TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td<>td>1-8</td<>/tr<>tr class="deprecated"><td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</td<>td>9-25</td td><>9-25</td<>/tr><tr class="deprecated" ><td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA256</td><td>20-25</td td<><>/td><>< tr class="deprecated"<>td>TLS_DHE_RSA_WITH_AES_128_GCM_SHA256</td><td>20-25</td<>td>20-25</td></tr<>tr class="deprecated"><td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA</td><td>9-25</td<>td>20-25</td<>/tr><tr class="deprecated"><td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</td<>td>20-25</td td></td><<>>< tr class="deprecated"><td>TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</td><td>20-25</td<>td>20-25</td></tr><tr class="deprecated"><td>TLS_DHE_RSA_WITH_DES_CBC_SHA</td<>td>1-8</td<>td>1-8</td<>/tr<>tr class="deprecated"><td>TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA</td><td>1-8</td td><td></td<>>< tr tr class="deprecated"><td TLS_DH_DSS_><WITH_3DES_EDE_CBC_SHA/td<>td>1-8</td td><></td<>>< tr tr class="deprecated"><td>TLS_DH_DSS_WITH_DES_CBC_SHA</td<>td>1-8</td td<>td></td<>>< tr class="deprecated"td>TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA<<>/td td><>1-8</td td><td></td></tr><tr class="deprecated"><td>TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td td><td></td<><> tr tr class="deprecated"<>td>TLS_DH_RSA_WITH_DES_CBC_SHA</td><td>1-8</td td<>></td<<>> tr="deprecated"><td TLS_DH_anon_EXPORT_WITH_><DES40_CBC_SHA/td><td>1-8</td td></td>><<<> tr tr class="deprecated"<>td>TLS_DH_anon_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td td></td>><</tr><tr class="deprecated"><td>TLS_DH_anon_WITH_AES_128_CBC_SHA</td><td>9-22</td td<>td></td></Tr><tr class="deprecated">td>TLS_DH_anon_WITH_AES_128_CBC_SHA256</td><td>20-22</td td><td></td<><> tr tr class="deprecated"><td>TLS_DH_anon_WITH_AES_128_GCM_SHA256</td<>td>20-22</td td><></td<><> tr="deprecated"><td>TLS_DH_anon_WITH_AES_256_CBC_SHA/<< td><td>9-22</td<>td></td<>/tr<>tr class="deprecated"<>td>TLS_DH_anon_WITH_AES_256_CBC_SHA256</td><td>20-22</td td></td>><</tr><tr class="deprecated"<>td>TLS_DH_anon_WITH_AES_256_GCM_SHA384</td td>><20-22</td td/td<>/td><></tr><tr class="deprecated"><td>TLS_DH_anon_WITH_DES_CBC_SHA</td<>td>1-8</td td>><</td></tr><tr tr class="deprecated"<>td>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</td<>td>20-22</td td></td td></td<>/tr<>tr td>><TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</td><td>20+</td><td>20+</td></tr><tr class="deprecated"><td>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</td<>td>20-28</td td></td><></tr<>tr<>td>TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</td<>td>20+</td><td>20+</td/>< tr><tr><td>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA</td<>td>20+</td<>td>20+</td></tr<>tr class="deprecated"<>td>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384</td<>td>20-28</td td<>/td td<>></tr<>tr td<>>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384/< td><td>20+</td><td>20+</td<>/tr<>tr><td>TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256</td><td td>24+</<<>>td<>td>< tr class="deprecated"<>td>TLS_ECDHE_ECDSA_WITH_NULL_SHA</td td><>20-22</td td><td/>< td></tr><tr class="deprecated"><td>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</td><td>20-25</td<>td td>20-23</td<>/tr<>tr<>td>TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA</td><td>21+</td><td>21+</td<>/tr tr>><<Td><TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA/td><td>21+</td<>td>21+</td></tr<>tr tr><td>TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256</td<>td>24+</td><td>24+</td<>/tr<>tr class="deprecated"<>td>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td td>><</td<>/tr<>tr<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</td><td>20+</td<>td>20+</td></tr><tr class="deprecated"<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</td><td>20-28</td td><td></Td></tr><tr><td>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</td><td>20+</td<>td>20+</td></tr<>tr td>><TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</td<>td>20+</td><td>20+</td<>/tr<>tr class="deprecated"td TLS_><><ECDHE_RSA_WITH_AES_256_CBC_SHA384/td><td>20-28</td td><></td<>/tr<>tr tr><td>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</td<>td>20+</td<>td>20+</td></tr<>tr td>><TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256</td td><td>24+</td><td>24+</td<>/tr><tr class="deprecated"><td>TLS_ECDHE_RSA_WITH_NULL_SHA</td<>td>20-22</td td></td><<>>< tr class="deprecated"><td>TLS_ECDHE_RSA_WITH_RC4_128_SHA</td><td>20-25</td td<>td>20-23</td></tr><tr class="deprecated"><td>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td td><td></td><>< tr tr class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA</td<>td>20-22</td td><td></td<>/tr><tr class=" deprecated">td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256</td><td>20-22</td td></><td></tr<>tr class="deprecated"><td>TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256</td<>td>20-22</td td<>td></td<>/tr<>tr class="deprecated"><td TLS_ECDH_><<ECDSA_WITH_AES_256_CBC_SHA/td<>td>20-22</td td<>></td<>/tr><tr class="deprecated"><td>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384</td<>td>20-22</td td></td><>< tr<>class="deprecated"td>TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384<></td><td>20-22</td<>td></td></tr<>tr class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_NULL_SHA</td><td>20-22</td td></td><<>/tr><tr class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</td><td>20-22</td td><td></td></tr><tr class="deprecated"><td>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td td><td></td><>< tr tr class="deprecated"<>td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</td<>td>20-22</td td><td></td<>/tr><tr class="deprecated" ><td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256</td<>td>20-22</td td><></td><>< tr tr class="deprecated"><td>TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256</td><td>20-22</td td></td<<>>>< tr class="deprecated"td TLS_ECDH_RSA_WITH_AES_256_><><CBC_SHA/td><td>20-22</td td><></td<><> tr tr class="deprecated"<>td>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384</td><td>20-22</td td></td<><<>> tr class="deprecated"><td>TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384</td td><>20-22</Td><td></td></tr><tr class="deprecated"><td>TLS_ECDH_RSA_WITH_NULL_SHA</td><td>20-22</td td><td></td></tr><tr class="deprecated"<>td>TLS_ECDH_RSA_WITH_RC4_128_SHA</td<>td>20-22</td><td></td<>/tr><tr class="deprecated" ><td>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td td><<>/td>< tr><tr class="deprecated"<>td>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</td><td>20-22</td td<>td></td>><< tr class="deprecated"td TLS_ECDH_anon_WITH_AES_256_><><CBC_SHA/td<>td>20-22</td td<>></td>><< tr tr class="deprecated"<>td>TLS_ECDH_anon_WITH_NULL_SHA</td<>td>20-22</td td></td<<>>/tr><tr class="deprecated"><td>TLS_ECDH_anon_WITH_RC4_128_SHA</td td<>>20-22</td><td></td></tr><tr><td>TLS_EMPTY_RENEGOTIATION_INFO_SCSV</td><td>20+</td><td>20+</td<>/tr<>tr td><>TLS_FALLBACK_SCSV</td<>td>21+</td<>td></td><<> tr tr class="deprecated"><td><TLS_NULL_WITH_NULL_NULL/td<>td>1-8</td td<>></td><<> tr tr class="deprecated"<>td>TLS_PSK_WITH_3DES_EDE_CBC_SHA</td><td>21-22</td td/td<>><<>/tr<>tr><td>TLS_PSK_WITH_AES_128_CBC_SHA</td<>td>21+</td><td>21+</td></tr><tr<>td>TLS_PSK_WITH_AES_256_CBC_SHA</td><td>21+</td<>td>21+</td<>/tr<>tr class="deprecated"><td>TLS_PSK_WITH_RC4_128_SHA</td td><>21-25</td td><td></td<>/tr tr>< class="deprecated">td>TLS_RSA_EXPORT_WITH_DES40_CBC_SHA</td<>td>1-8</td><td>1-8</td<>/tr<>tr class="deprecated"<>td>TLS_RSA_WITH_3DES_EDE_CBC_SHA</td<>td>1-8</td><td>1-8</td<>/tr<>tr td TLS_RSA_WITH_AES_><><<128_CBC_SHA/td><td>9+</td><td>9+</td<>/tr><tr class="deprecated"<>td>TLS_RSA_WITH_AES_128_CBC_SHA256</td<>td>20-28</td td/td<>td></tr<><> tr><td>TLS_RSA_WITH_AES_128_GCM_SHA256</td><td>20+</td><td>20+</td></tr<>tr<>td>TLS_RSA_WITH_AES_256_CBC_SHA</td><td>9+</td<>td>20+</td<>/tr<>tr class="deprecated"<>td>TLS_RSA_WITH_AES_256_CBC_SHA256</td td<>>20-28</td td td></td<<>>/tr tr><><td>TLS_RSA_WITH_AES_256_GCM_SHA384</td<>td>20+</td<>td>20+</td<>/tr><tr class="deprecated"<>td>TLS_RSA_WITH_DES_CBC_SHA</td<>td>1-8</td<>td>1-8</td<>/tr><tr class="deprecated"><td>TLS_RSA_WITH_NULL_MD5</Td><td>1-8</td<>td></td></tr><tr class="deprecated"<>td>TLS_RSA_WITH_NULL_SHA</td><td>1-8</td<>td></td></tr<>class="deprecated"><td>TLS_RSA_WITH_NULL_SHA256</td<>td>20-22</td td><td></td></tr></Tbody></Tabelle>

<em>HINWEIS</em>: PSK-Verschlüsselungssammlungen sind standardmäßig nur aktiviert, wenn die SSLContext , mit der die Engine erstellt wurde, mit einem PSKKeyManagerinitialisiert wurde.

Hinzugefügt in 1.5.

Java-Dokumentation für javax.net.ssl.SSLEngine.

Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In Attribution License beschriebenen Begriffen verwendet werden.

Konstruktoren

SSLEngine()

Konstruktor für eine SSLEngine Strategie zur Wiederverwendung interner Sitzungen ohne Hinweise.

SSLEngine(IntPtr, JniHandleOwnership)

Ein Konstruktor, der beim Erstellen verwalteter Darstellungen von JNI-Objekten verwendet wird; wird von der Runtime aufgerufen.

SSLEngine(String, Int32)

Konstruktor für einen SSLEngine.

Eigenschaften

ApplicationProtocol

Gibt den zuletzt für diese Verbindung ausgehandelten Anwendungsprotokollwert zurück.

Class

Gibt die Laufzeitklasse dieses Objectzurück.

(Geerbt von Object)
DelegatedTask

Gibt einen Delegattask für diese Engine instance zurück.

EnableSessionCreation

Gibt zurück, ob von dieser Engine möglicherweise neue SSL-Sitzungen eingerichtet werden.

Handle

Das Handle zum zugrunde liegenden Android-instance.

(Geerbt von Object)
HandshakeApplicationProtocol

Gibt den Für einen derzeit ausgeführten SSL/TLS-Handshake ausgehandelten Anwendungsprotokollwert zurück.

HandshakeApplicationProtocolSelector

Ruft die Rückruffunktion ab, die einen Anwendungsprotokollwert während eines SSL/TLS-Handshakes auswählt. - or: Registriert eine Rückruffunktion, die einen Anwendungsprotokollwert für einen SSL/TLS-Handshake auswählt.

HandshakeSession

Gibt den zurück, der SSLSession während eines SSL/TLS-Handshakes erstellt wird.

HandshakeStatus

Gibt den status des Handshakes dieses Moduls instance zurück.

IsInboundDone

Gibt zurück, ob von diesem Modul keine eingehenden Daten mehr akzeptiert werden.

IsOutboundDone

Gibt zurück, ob von diesem Modul keine weiteren ausgehenden Daten erzeugt werden.

JniIdentityHashCode

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
JniPeerMembers

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

NeedClientAuth

Gibt zurück, ob dieses Modul instance die Clientauthentifizierung erfordert.

PeerHost

Gibt den Hostnamen des Peers zurück.

PeerPort

Gibt die Portnummer des Peers zurück.

PeerReference

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
Session

Gibt die SSL-Sitzung für dieses Modul instance zurück.

SSLParameters

Gibt die sslParameters zurück, die für diese SSLEngine wirksam sind. - oder: Wendet SSLParameters auf diese Engine an.

ThresholdClass

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

ThresholdType

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

UseClientMode

Gibt zurück, ob dieses Modul so festgelegt ist, dass es beim Handshaken im Clientmodus wirkt.

WantClientAuth

Gibt zurück, ob dieses Modul die Clientauthentifizierung angibt.

Methoden

BeginHandshake()

Initiiert das Handshaking (Erst- oder Neuverhandlung) für diese SSLEngine.

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
CloseInbound()

Signalisiert, dass keine eingehenden Netzwerkdaten mehr an diese SSLEnginegesendet werden.

CloseOutbound()

Signalisiert, dass keine weiteren ausgehenden Anwendungsdaten für dieses SSLEnginegesendet werden.

Dispose()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
Dispose(Boolean)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
Equals(Object)

Gibt an, ob ein anderes Objekt diesem "gleich" ist.

(Geerbt von Object)
GetEnabledCipherSuites()

Gibt die Namen der SSL-Verschlüsselungssammlungen zurück, die derzeit für die Verwendung in dieser Engine aktiviert sind.

GetEnabledProtocols()

Gibt die Namen der Protokollversionen zurück, die derzeit für die Verwendung mit diesem SSLEngineaktiviert sind.

GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
GetSupportedCipherSuites()

Gibt die Namen der Verschlüsselungssammlungen zurück, die für die Verwendung in diesem Modul aktiviert werden könnten.

GetSupportedProtocols()

Gibt die Namen der Protokolle zurück, die für die Verwendung mit diesem SSLEngineaktiviert werden könnten.

JavaFinalize()

Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr auf das Objekt vorhanden sind.

(Geerbt von Object)
Notify()

Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet.

(Geerbt von Object)
NotifyAll()

Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten.

(Geerbt von Object)
SetEnabledCipherSuites(String[])

Legt die für diese Engine aktivierten Verschlüsselungssammlungen fest.

SetEnabledProtocols(String[])

Legen Sie die für diese Engine aktivierten Protokollversionen fest.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
ToArray<T>()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
Unwrap(ByteBuffer, ByteBuffer)

Versucht, SSL/TLS-Netzwerkdaten in einen Klartext-Anwendungsdatenpuffer zu decodieren.

Unwrap(ByteBuffer, ByteBuffer[])

Versucht, SSL/TLS-Netzwerkdaten in eine Sequenz von Klartext-Anwendungsdatenpuffern zu decodieren.

Unwrap(ByteBuffer, ByteBuffer[], Int32, Int32)

Versucht, SSL-/TLS-Netzwerkdaten in eine Untersequise von Klartext-Anwendungsdatenpuffern zu decodieren.

Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel durch em benachrichtigen/em> oder <em>interrupted</em>.<><

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wait(Int64, Int32)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wrap(ByteBuffer, ByteBuffer)

Versucht, einen Puffer von Klartextanwendungsdaten in SSL/TLS-Netzwerkdaten zu codieren.

Wrap(ByteBuffer[], ByteBuffer)

Versucht, Klartextbytes aus einer Sequenz von Datenpuffern in SSL/TLS-Netzwerkdaten zu codieren.

Wrap(ByteBuffer[], Int32, Int32, ByteBuffer)

Versucht, Klartextbytes aus einer Teilsequenz von Datenpuffern in SSL-/TLS-Netzwerkdaten zu codieren.

Explizite Schnittstellenimplementierungen

IJavaPeerable.Disposed()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.Finalized()

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

(Geerbt von Object)

Erweiterungsmethoden

JavaCast<TResult>(IJavaObject)

Führt eine Für Android-Runtime überprüfte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

GetJniTypeName(IJavaPeerable)

Eine Klasse, die die sichere Kommunikation mithilfe von Protokollen wie Secure Sockets Layer (SSL) oder IETF RFC 2246 "Transport Layer Security" (TLS) ermöglicht, aber transportunabhängig ist.

Gilt für: