stream_socket_enable_crypto
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
stream_socket_enable_crypto — 接続済みのソケットについて暗号化の on/off を切り替える
説明
stream_socket_enable_crypto(
resource
bool
?int
?resource
): int|bool
resource
$stream
,bool
$enable
,?int
$crypto_method
= null
,?resource
$session_stream
= null
): int|bool
ストリームの暗号化を有効あるいは無効にします。
暗号化設定が確立されると、それ以降は
enable
パラメータに true
あるいは false
を指定することで暗号化の on/off を動的に切り替えられます。
パラメータ
stream
-
ストリームリソース。
enable
-
ストリームの暗号化を有効にするか無効にするか。
crypto_method
-
ストリームの暗号化の設定。以下の方法が使用できます。
STREAM_CRYPTO_METHOD_SSLv2_CLIENT
STREAM_CRYPTO_METHOD_SSLv3_CLIENT
STREAM_CRYPTO_METHOD_SSLv23_CLIENT
STREAM_CRYPTO_METHOD_ANY_CLIENT
STREAM_CRYPTO_METHOD_TLS_CLIENT
STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT
(PHP 7.4.0 以降)STREAM_CRYPTO_METHOD_SSLv2_SERVER
STREAM_CRYPTO_METHOD_SSLv3_SERVER
STREAM_CRYPTO_METHOD_SSLv23_SERVER
STREAM_CRYPTO_METHOD_ANY_SERVER
STREAM_CRYPTO_METHOD_TLS_SERVER
STREAM_CRYPTO_METHOD_TLSv1_0_SERVER
STREAM_CRYPTO_METHOD_TLSv1_1_SERVER
STREAM_CRYPTO_METHOD_TLSv1_2_SERVER
STREAM_CRYPTO_METHOD_TLSv1_3_SERVER
(PHP 7.4.0 以降)
省略した場合は、ストリームの SSL コンテキストのオプション
crypto_method
を利用します。 session_stream
-
ストリームで
session_stream
からの設定を送信します。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 |
session_stream は、nullable になりました。
|
例
例1 stream_socket_enable_crypto() の例
<?php
$fp = stream_socket_client("tcp://myproto.example.com:31337", $errno, $errstr, 30);
if (!$fp) {
die("接続できません: $errstr ($errno)");
}
/* ログイン時の暗号化を有効にします */
stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
fwrite($fp, "USER god\r\n");
fwrite($fp, "PASS secret\r\n");
/* それ以外では暗号化を無効にします */
stream_socket_enable_crypto($fp, false);
while ($motd = fgets($fp)) {
echo $motd;
}
fclose($fp);
?>
上の例の出力は、 たとえば以下のようになります。
+add a note
User Contributed Notes 4 notes
Anonymous ¶
2 years ago
If you need to change a stream from unencrypted to crypted after unencrypted traffic has been processed, you use the stream-socket-recvfrom function to read instead of fread when reading the unencrypted traffic. Using fread will cause some of the buffer of the initial CLIENT HELLO message to be read into it's buffers causing the SSL handshake to fail in some situations.
tigger (AT) tiggerswelt d0t net ¶
17 years ago
As already mentioned above:
stream_socket_enable_crypto is likely to fail/return zero if the socket is in non-blocking mode.
You may either wait some seconds until all neccessary data has arrived or switch temporary to blocking mode:
<?PHP
stream_set_blocking ($fd, true);
stream_socket_enable_crypto ($fd, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
stream_set_blocking ($fd, false);
?>
This works very fine for me ;-)
play dot it at play-it dot net ¶
1 year ago
Information to the difference of `crypto_method`
There is `STREAM_CRYPTO_METHOD_*_CLIENT` and `STREAM_CRYPTO_METHOD_*_SERVER`
`STREAM_CRYPTO_METHOD_*_CLIENT` is used for clients, like:
```php
<?php
$client = stream_socket_client("tcp://example.com:443", $errno, $errstr);
stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
//...
?>
```
This code makes a TLS Handshake and the `stream_socket_enable_crypto` sends a `Client HELLO`
`STREAM_CRYPTO_METHOD_*_SERVER` is used for servers, like:
<?php
$server = stream_socket_server("tcp://example.com:443", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
stream_context_set_option($server, ["ssl" => [
"local_cert" => __DIR__."/https.crt",
"local_pk" => __DIR__."/https.key",
]]);
//...
$client = stream_socket_accept($server);
stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
//...
?>
This code makes a TLS Handshake and the `stream_socket_enable_crypto` sends a `Server HELLO` after the client send a `Client HELLO`.
so use `STREAM_CRYPTO_METHOD_*_CLIENT` for requesting data and `STREAM_CRYPTO_METHOD_*_SERVER` for serving data, after accepting a client.