Openssl s_serverに、コマンドラインまたはサーバー自体(サーバーがcentOSを使用している)から直接すべてのhttp(s)リクエストに応答させるにはどうすればよいですか?それは可能ですか?
openssl s_serverの-helpコマンドから、次の目的で使用する必要のある-HTTPフラグがあることがわかります。
-WWW - Respond to a 'GET /<path> HTTP/1.0' with file./<path>
-HTTP - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>
with the assumption it contains a complete HTTP response.
これが私の問題の答えになる可能性がありますか?もしそうなら、そして私はこのフラグを使用する方法の例を見つけることができなかったので、私はそれを正確に使用する方法を知って本当にうれしいです。
私が実行しようとしているコマンドは次のように単純です。
openssl s_server -key key.pem -cert cert.pem -msg
前もって感謝します!
-WWW
または-HTTP
を使用すると、s_server
は現在のディレクトリ内のファイルを使用する静的コンテンツHTTPSサーバーとして機能します。これがデモンストレーション用の完全なセットアップです。
$ openssl req -x509 -nodes -newkey rsa -keyout key.pem -out cert.pem -subj /CN=localhost
$ echo 'hello, world.' >index.txt
$ openssl s_server -key key.pem -cert cert.pem -WWW
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
s_server
はポート4433でHTTPSリクエストを待機しています。別のシェルから、curl
を使用してs_server
にリクエストを送信できます。
$ curl -kv https://localhost:4433/index.txt
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 4433 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: CN=localhost
* start date: 2015-06-01 15:29:02 GMT
* expire date: 2015-07-01 15:29:02 GMT
* issuer: CN=localhost
* SSL certificate verify result: self signed certificate (18), continuing anyway.
> GET /index.txt HTTP/1.1
> User-Agent: curl/7.38.0
> Host: localhost:4433
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 ok
< Content-type: text/plain
<
hello, world.
* Closing connection 0
* SSLv3, TLS alert, Client hello (1):
$ curl -k https://localhost:4433/not-existence
Error opening 'not-existence'
140226499298960:error:02001002:system library:fopen:No such file or directory:bss_file.c:169:fopen('not-existence','r')
140226499298960:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
リクエストごとに、s_server
はリクエストされたパスを出力し、次のリクエストを再度待ちます。
FILE:index.txt
ACCEPT
(CGIのように)リクエストに対してスクリプトを実行する場合は、 socat などの別のツールを使用する必要がある場合があります。
$ echo 'echo "Your request is $(head -1)"' > server.sh
$ socat openssl-listen:4433,cert=cert.pem,key=key.pem,verify=0,reuseaddr,fork exec:"bash server.sh"
結果は次のとおりです。
$ curl -k https://localhost:4433/index.txt
Your request is GET /index.txt HTTP/1.1