@@ -36,7 +36,8 @@ ffi.cdef[[
3636 size_t pem_len, unsigned char *der, char **err);
3737
3838 int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,
39- size_t pem_len, unsigned char *der, char **err);
39+ size_t pem_len, const unsigned char *passphrase,
40+ unsigned char *der, char **err);
4041
4142 int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,
4243 const char *data, size_t len, char **err);
@@ -130,7 +131,7 @@ __DATA__
130131
131132 out = ffi.new("char [?]", #pkey)
132133
133- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
134+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
134135 if rc < 1 then
135136 ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
136137 ffi.string(errmsg[0]))
@@ -284,7 +285,7 @@ lua ssl server name: "test.com"
284285
285286 out = ffi.new("char [?]", #pkey)
286287
287- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
288+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
288289 if rc < 1 then
289290 ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
290291 ffi.string(errmsg[0]))
@@ -422,7 +423,7 @@ lua ssl server name: "test.com"
422423
423424 out = ffi.new("char [?]", #pkey)
424425
425- local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, out, errmsg)
426+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, nil, out, errmsg)
426427 if rc < 1 then
427428 ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
428429 ffi.string(errmsg[0]))
@@ -1024,3 +1025,175 @@ client certificate subject: nil
10241025--- no_error_log
10251026[error]
10261027[alert]
1028+
1029+
1030+
1031+ === TEST 9: simple cert + private key with passphrase
1032+ --- http_config
1033+ server {
1034+ listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1035+ server_name test.com;
1036+
1037+ ssl_certificate_by_lua_block {
1038+ collectgarbage()
1039+
1040+ local ffi = require "ffi"
1041+
1042+ ffi.cdef[[
1043+ int ngx_http_lua_ffi_cert_pem_to_der(const unsigned char *pem,
1044+ size_t pem_len, unsigned char *der, char **err);
1045+
1046+ int ngx_http_lua_ffi_priv_key_pem_to_der(const unsigned char *pem,
1047+ size_t pem_len, const unsigned char *passphrase,
1048+ unsigned char *der, char **err);
1049+
1050+ int ngx_http_lua_ffi_ssl_set_der_certificate(void *r,
1051+ const char *data, size_t len, char **err);
1052+
1053+ int ngx_http_lua_ffi_ssl_set_der_private_key(void *r,
1054+ const char *data, size_t len, char **err);
1055+
1056+ int ngx_http_lua_ffi_ssl_clear_certs(void *r, char **err);
1057+ ]]
1058+
1059+ local errmsg = ffi.new("char *[1]")
1060+
1061+ local r = require "resty.core.base" .get_request()
1062+ if not r then
1063+ ngx.log(ngx.ERR, "no request found")
1064+ return
1065+ end
1066+
1067+ ffi.C.ngx_http_lua_ffi_ssl_clear_certs(r, errmsg)
1068+
1069+ local f = assert(io.open("t/cert/test_passphrase.crt", "rb"))
1070+ local cert = f:read("*all")
1071+ f:close()
1072+
1073+ local out = ffi.new("char [?]", #cert)
1074+
1075+ local rc = ffi.C.ngx_http_lua_ffi_cert_pem_to_der(cert, #cert, out, errmsg)
1076+ if rc < 1 then
1077+ ngx.log(ngx.ERR, "failed to parse PEM cert: ",
1078+ ffi.string(errmsg[0]))
1079+ return
1080+ end
1081+
1082+ local cert_der = ffi.string(out, rc)
1083+
1084+ local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_certificate(r, cert_der, #cert_der, errmsg)
1085+ if rc ~= 0 then
1086+ ngx.log(ngx.ERR, "failed to set DER cert: ",
1087+ ffi.string(errmsg[0]))
1088+ return
1089+ end
1090+
1091+ f = assert(io.open("t/cert/test_passphrase.key", "rb"))
1092+ local pkey = f:read("*all")
1093+ f:close()
1094+
1095+ local passphrase = "123456"
1096+
1097+ out = ffi.new("char [?]", #pkey)
1098+
1099+ local rc = ffi.C.ngx_http_lua_ffi_priv_key_pem_to_der(pkey, #pkey, passphrase, out, errmsg)
1100+ if rc < 1 then
1101+ ngx.log(ngx.ERR, "failed to parse PEM priv key: ",
1102+ ffi.string(errmsg[0]))
1103+ return
1104+ end
1105+
1106+ local pkey_der = ffi.string(out, rc)
1107+
1108+ local rc = ffi.C.ngx_http_lua_ffi_ssl_set_der_private_key(r, pkey_der, #pkey_der, errmsg)
1109+ if rc ~= 0 then
1110+ ngx.log(ngx.ERR, "failed to set DER priv key: ",
1111+ ffi.string(errmsg[0]))
1112+ return
1113+ end
1114+ }
1115+
1116+ ssl_certificate ../../cert/test2.crt;
1117+ ssl_certificate_key ../../cert/test2.key;
1118+
1119+ server_tokens off;
1120+ location /foo {
1121+ default_type 'text/plain';
1122+ content_by_lua_block { ngx.status = 201 ngx.say("foo") ngx.exit(201) }
1123+ more_clear_headers Date;
1124+ }
1125+ }
1126+ --- config
1127+ server_tokens off;
1128+ lua_ssl_trusted_certificate ../../cert/test_passphrase.crt;
1129+
1130+ location /t {
1131+ content_by_lua_block {
1132+ do
1133+ local sock = ngx.socket.tcp()
1134+
1135+ sock:settimeout(2000)
1136+
1137+ local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1138+ if not ok then
1139+ ngx.say("failed to connect: ", err)
1140+ return
1141+ end
1142+
1143+ ngx.say("connected: ", ok)
1144+
1145+ local sess, err = sock:sslhandshake(nil, "test.com", false)
1146+ if not sess then
1147+ ngx.say("failed to do SSL handshake: ", err)
1148+ return
1149+ end
1150+
1151+ ngx.say("ssl handshake: ", type(sess))
1152+
1153+ local req = "GET /foo HTTP/1.0\r\nHost: test.com\r\nConnection: close\r\n\r\n"
1154+ local bytes, err = sock:send(req)
1155+ if not bytes then
1156+ ngx.say("failed to send http request: ", err)
1157+ return
1158+ end
1159+
1160+ ngx.say("sent http request: ", bytes, " bytes.")
1161+
1162+ while true do
1163+ local line, err = sock:receive()
1164+ if not line then
1165+ -- ngx.say("failed to recieve response status line: ", err)
1166+ break
1167+ end
1168+
1169+ ngx.say("received: ", line)
1170+ end
1171+
1172+ local ok, err = sock:close()
1173+ ngx.say("close: ", ok, " ", err)
1174+ end -- do
1175+ -- collectgarbage()
1176+ }
1177+ }
1178+
1179+ --- request
1180+ GET /t
1181+ --- response_body
1182+ connected: 1
1183+ ssl handshake: userdata
1184+ sent http request: 56 bytes.
1185+ received: HTTP/1.1 201 Created
1186+ received: Server: nginx
1187+ received: Content-Type: text/plain
1188+ received: Content-Length: 4
1189+ received: Connection: close
1190+ received:
1191+ received: foo
1192+ close: 1 nil
1193+
1194+ --- error_log
1195+ lua ssl server name: "test.com"
1196+
1197+ --- no_error_log
1198+ [error]
1199+ [alert]
0 commit comments