@@ -2705,3 +2705,135 @@ read server port from Lua: nilunix domain has no port
27052705[error]
27062706[alert]
27072707[emerg]
2708+
2709+
2710+
2711+ === TEST 28: PEM key protected by passphrase
2712+ --- http_config
2713+ lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH";
2714+
2715+ server {
2716+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
2717+ server_name test.com;
2718+ ssl_certificate_by_lua_block {
2719+ local ssl = require "ngx.ssl"
2720+
2721+ ssl.clear_certs()
2722+
2723+ local f = assert(io.open("t/cert/test_passphrase.crt"))
2724+ local cert_data = f:read("*a")
2725+ f:close()
2726+
2727+ local cert, err = ssl.cert_pem_to_der(cert_data)
2728+ if not cert then
2729+ ngx.log(ngx.ERR, "failed to convert pem cert to der cert: ", err)
2730+ return
2731+ end
2732+
2733+ local ok, err = ssl.set_der_cert(cert)
2734+ if not ok then
2735+ ngx.log(ngx.ERR, "failed to set DER cert: ", err)
2736+ return
2737+ end
2738+
2739+ local f = assert(io.open("t/cert/test_passphrase.key"))
2740+ local pkey_data = f:read("*a")
2741+ f:close()
2742+
2743+ pkey_data, err = ssl.priv_key_pem_to_der(pkey_data, "123456")
2744+ if not pkey_data then
2745+ ngx.log(ngx.ERR, "failed to convert pem key to der key: ", err)
2746+ return
2747+ end
2748+ local ok, err = ssl.set_der_priv_key(pkey_data)
2749+ if not ok then
2750+ ngx.log(ngx.ERR, "failed to set private key: ", err)
2751+ return
2752+ end
2753+ }
2754+ ssl_certificate ../../cert/test2.crt;
2755+ ssl_certificate_key ../../cert/test2.key;
2756+
2757+ server_tokens off;
2758+ location /foo {
2759+ default_type 'text/plain';
2760+ content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }
2761+ more_clear_headers Date;
2762+ }
2763+ }
2764+ --- config
2765+ server_tokens off;
2766+ lua_ssl_trusted_certificate ../../cert/chain/root-ca.crt;
2767+ lua_ssl_verify_depth 3;
2768+
2769+ location /t {
2770+ content_by_lua_block {
2771+ do
2772+ local sock = ngx.socket.tcp()
2773+
2774+ sock:settimeout(3000)
2775+
2776+ local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
2777+ if not ok then
2778+ ngx.say("failed to connect: ", err)
2779+ return
2780+ end
2781+
2782+ ngx.say("connected: ", ok)
2783+
2784+ local sess, err = sock:sslhandshake(nil, "test.com", false)
2785+ if not sess then
2786+ ngx.say("failed to do SSL handshake: ", err)
2787+ return
2788+ end
2789+
2790+ ngx.say("ssl handshake: ", type(sess))
2791+
2792+ local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"
2793+ local bytes, err = sock:send(req)
2794+ if not bytes then
2795+ ngx.say("failed to send http request: ", err)
2796+ return
2797+ end
2798+
2799+ ngx.say("sent http request: ", bytes, " bytes.")
2800+
2801+ while true do
2802+ local line, err = sock:receive()
2803+ if not line then
2804+ -- ngx.say("failed to receive response status line: ", err)
2805+ break
2806+ end
2807+
2808+ ngx.say("received: ", line)
2809+ end
2810+
2811+ local ok, err = sock:close()
2812+ ngx.say("close: ", ok, " ", err)
2813+ end -- do
2814+ -- collectgarbage()
2815+ }
2816+ }
2817+
2818+ --- request
2819+ GET /t
2820+ --- response_body
2821+ connected: 1
2822+ ssl handshake: userdata
2823+ sent http request: 56 bytes.
2824+ received: HTTP/1.1 201 Created
2825+ received: Server: nginx
2826+ received: Content-Type: text/plain
2827+ received: Content-Length: 4
2828+ received: Connection: close
2829+ received:
2830+ received: foo
2831+ close: 1 nil
2832+
2833+ --- error_log
2834+ lua ssl server name: "test.com"
2835+
2836+ --- no_error_log
2837+ [error]
2838+ [alert]
2839+ [emerg]
0 commit comments